标准化 bigquery 中时间序列数据条目之间的时间

Posted

技术标签:

【中文标题】标准化 bigquery 中时间序列数据条目之间的时间【英文标题】:Standardizing time between entries for time series data in bigquery 【发布时间】:2021-11-01 21:02:45 【问题描述】:

所以我有这个 BigQuery 代码来处理 MIMIC 数据库

所以我在 BigQuery 中有这张表,其中包含大量个人的时间序列信息,但在不同的时间,所以有些可能每 5 分钟有一次,有些每 5 小时有一次,有些分散。

我想构建一个表格版本,其中每个人每 4 小时有一个条目,仅此而已,即每 4 小时间隔内的条目将被平均。

这就是我现在拥有的

WITH minmax as(
SELECT subject_id, hadm_id, icustay_id , min(charttime) as mint, max(charttime) as maxt
FROM `projectx-mcgill.preprocessing.overalltable_Lab_withventparams`
GROUP BY icustay_id, subject_id, hadm_id
ORDER BY icustay_id, subject_id, hadm_id
    ), grid as (
    SELECT icustay_id, subject_id, hadm_id, 
    
    UNNEST(GENERATE_TIMESTAMP_ARRAY(CAST(mint as timestamp), CAST(maxt as timestamp), INTERVAL 4 HOUR)) as start_time

    FROM minmax
    GROUP BY icustay_id, subject_id, hadm_id,mint,maxt
    ORDER BY icustay_id, subject_id, hadm_id)

我试图让 start_time 类似于 postgres 的 generate_sequence() 函数,这样我就可以在渐进的 4 小时标记处获得每个人的信息,但我不断收到“语法错误:预期的”(“但得到了关键字 UNNEST”。我发现某处说 UNNEST 不能在 FROM 子句之前,但是当我将它移到后面时,我收到一个新错误,说表没有分组或聚合。知道我能做什么吗?

【问题讨论】:

meta.stackexchange.com/a/66378/507852 【参考方案1】:

你可以:

    创建时间戳表:
    WITH timestamps AS
        (
            SELECT *
            FROM   UNNEST(GENERATE_TIMESTAMP_ARRAY('2021-01-01 00:00:00', CURRENT_TIMESTAMP,
                                INTERVAL 4 HOUR)) AS ts
        )
    SELECT * FROM timestamps AS t
    从您的数据中获取不同的实体:
    SELECT DISTINCT subject_id, hadm_id, icustay_id FROM <your_table>

    CROSS JOIN 前两个关系使得每个“实体”的每个时间戳都有一行

    最后,LEFT/RIGHT 将上一步中的关系与您的数据聚合、加入时间戳(四舍五入或以其他方式截断为 4 小时间隔)、根据需要聚合并使用 IFNULL() 或 @987654326 之类的东西@ 来处理那些不包含实体数据的时间戳。

注意:MIMIC 数据库/projectx-mcgill 似乎不是公共数据集,但如果您能够提供一些数据的小样本,我可以提供此方法的更具体示例。

【讨论】:

以上是关于标准化 bigquery 中时间序列数据条目之间的时间的主要内容,如果未能解决你的问题,请参考以下文章

如何选择实体的计数,其中时间序列日期介于该实体的开始日期和结束日期之间

python中时间序列数据的一些处理方式

R中时间序列数据的滑动时间间隔

R中时间序列数据的拆分应用聚合

python中时间序列数据的简单(但大)读/写

Elasticsearches Timelion是Kibana中时间序列的可视化工具