计算不规则数据的移动平均值

Posted

技术标签:

【中文标题】计算不规则数据的移动平均值【英文标题】:Calculating moving average over irregular data 【发布时间】:2020-08-17 22:08:53 【问题描述】:

我正在尝试计算 SQL Server 数据库中多个字段的移动平均值,这些字段随着时间的推移涉及不规则间隔的值。我意识到对于定期间隔的数据,我可以使用SELECT grp, AVG(count) FROM t ... OVER (PARTITION BY grp ... ROWS 7 PRECEDING) 来创建前一周数据的移动平均值。但是,我的数据组织如下:

DATE         GRP    COUNT
2018-07-05   1        10
2018-07-08   1        4
2018-07-11   1        6
2018-07-12   1        6
2018-07-11   2        5
2018-07-15   2        10
2018-07-17   2        8
2018-07-20   2        10
...

对于大多数团体来说,某些日期没有观察到。我正在寻找的输出是:

DATE         GRP    MOVING_AVG
2018-07-05   1        10
2018-07-08   1         7
2018-07-11   1         6.67
2018-07-13   1         5.33  
2018-07-11   2         5
2018-07-15   2         7.5
2018-07-16   2         7.67
2018-07-20   2         9.33

有没有办法在PRECEDING 子句中指定日期而不是行,还是我必须创建某种掩码来平均?

根据评论进行编辑以进行澄清

【问题讨论】:

你不能放一个WHERE YEAR(Date) >= '2018' AND YEAR(Date) < '2019'吗? 我需要它是一个移动平均线,特别是它之前 365 天的所有事件,所以我不能像那样硬编码一年。 然后你把它变成像WHERE YEAR(Date) >= DATEADD(YEAR, -1, Date) AND YEAR(Date) < YEAR(Date)这样的列名。举个例子,很难理解你到底想要什么。至少给出样本输入和预期输出。 我认为下面的建议可能是我需要的,但我会编辑我的问题以更好地说明我所追求的。 【参考方案1】:

在 SQL Server 中,我认为这可能通过横向连接更简单:

select
    date,
    grp,
    (
        select avg(count)
        from mytable t1
        where 
            t1.grp = t.grp 
            and t1.date >= dateadd(year, -1, t.date)
            and t1.date <= t.date
    ) as cnt
from mytable

【讨论】:

【参考方案2】:

如果我没有误会的话。您需要 7 天或其他任何天,但要在日期前行。

DATE         GRP    COUNT
2018-07-11   2        5
2018-07-15   2        10
2018-07-17   2        8
2018-07-20   2        10    <--- the AVG of this row must include 7 days before,so 2018-07-11 not include

在那种情况下:

select
    date,
    grp,
    (
        select avg(count)
        from t t1
        where 
            t1.grp = t.grp 
            and DATEDIFF(day, t1.date, t.date) <= 7 /*7 or whatever day you want*/
            and t1.date <= t.date
    ) as MOVING_AVG
from t

【讨论】:

以上是关于计算不规则数据的移动平均值的主要内容,如果未能解决你的问题,请参考以下文章

不规则时间序列上的条件滚动平均值(移动平均值)

移动平均法

时间序列之一次移动平均

如何有效地计算 numpy 二维数组的块均值(不规则块)?

数据分析之时间序列分析

在 C++ 中使用指数移动平均线编码 P&Q 规则