如何计算 BigQuery 的滚动平均值
Posted
技术标签:
【中文标题】如何计算 BigQuery 的滚动平均值【英文标题】:How can I compute rolling average on BigQuery 【发布时间】:2019-08-14 12:58:56 【问题描述】:我遇到了一个问题,我不确定如何在 Big Query 上计算它,我有一个表格,其中有一个用户吃过的香蕉数量以及他吃一些香蕉的相关日期:
+------+-------+--------------+
| user | banana| date |
+------+-------+--------------+
| a | 5 | 2019/01/18 |
| . | ..| |
| a | 2 | 2019/05/18 |
| b | 2 | 2019/02/18 |
| b | 3 | 2019/03/18 |
| b | 1 | 2019/03/18 |
+------+-------+--------------+
我想得到这样的东西:
+------+-------------+--------------------+----------------------+
| user | date T |AVG1st week before T|AVG2nd week before T|
+------+-------------+--------------------+----------------------+
| a | 2019/01/18 | 2 | 1 |
| . | .. | .. | . |
| a | 2019/01/20 | 3 | 1 |
| b | 2 | 2 | 2.5 |
| b | 3 | 2 | 5 |
| b | 1 | 1 | 2 |
+------+-------------+--------------------+----------------------+
其中“AVG 1st week before T”是用户在 T 前 7 天内每天消耗的香蕉的平均值。
我认为对于每一行,我都会计算“T 前 7 天”变量并创建“T 前 14 天”变量。然后在子查询中计算金额,但我认为这不是处理这个问题的最佳方式。
如果您有任何建议,我很乐意讨论!
提前谢谢你,
【问题讨论】:
【参考方案1】:值得一读的东西Analytic Functions Concepts in Standard SQL
这是我想出的一个 sn-p,在当前行给出了过去 7 天“平均吃香蕉”。
SELECT
user,
banana,
date,
AVG(banana) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS avg
FROM
`banana.banana`
WHERE
user = 'a'
【讨论】:
您好,首先感谢您的回答,非常感谢。问题是我的数据是稀疏的,有些日期丢失了,想象一下两个日期之间有几天的间隔,如何考虑 sql 请求中的稀疏部分?经过一番搜索,我发现了这个:***.com/questions/49883311/... 但是如果 2 个日期之间的间隔大于窗口的大小,则它不起作用,在这种特定情况下,它将放置最后一行的值而不是平均值。如果你知道如何在不使用笛卡尔积的情况下做到这一点,我会很高兴听到这个消息,谢谢!以上是关于如何计算 BigQuery 的滚动平均值的主要内容,如果未能解决你的问题,请参考以下文章
Google BigQuery SQL:使滚动平均子查询或加入对大型数据集更有效
如何使用 python + NumPy / SciPy 计算滚动/移动平均值?
如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?