微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

随时间推移的滚动平均值,每个日期具有多个值

如何解决随时间推移的滚动平均值,每个日期具有多个值

我正在尝试根据向前和向后追溯一定天数的滑动时间窗口,基于该表中存在的值来计算该表各行的滚动平均值。

给出下表:

myTable
+------------+-------+
| Date       | Value |
+------------+-------+
| 31/05/2020 | 5     |
+------------+-------+
| 31/05/2020 | 10    |
+------------+-------+
| 01/06/2020 | 50    |
+------------+-------+
| 01/08/2020 | 50    |
+------------+-------+

和措施

myMeasure =
VAR LookAheadAndBehindinDays = 28
RETURN
    AVERAGEX (
        DATESINPERIOD (
            myTable[Date],DATEADD ( LASTDATE ( myTable[Date] ),LookAheadAndBehindinDays,DAY ),-2 * LookAheadAndBehindinDays,DAY
        ),myTable[Value]
    )

我检查了DATESINPERIOD是否有效地返回了正确的日期。我的问题在于平均值的计算。

不是直接计算所有值的平均值(预期结果)

+------------+-------+---------------------------+
| Date       | Value | myMeasure                 |
+------------+-------+---------------------------+
| 31/05/2020 | 5     | (5 + 10 + 50) / 3 = 21.66 |
+------------+-------+---------------------------+
| 31/05/2020 | 10    | (5 + 10 + 50) / 3 = 21.66 |
+------------+-------+---------------------------+
| 01/06/2020 | 50    | (5 + 10 + 50) / 3 = 21.66 |
+------------+-------+---------------------------+
| 01/08/2020 | 27    | 27 / 1 = 27               |
+------------+-------+---------------------------+

它首先计算每个日期的平均值,然后计算这些值的平均值:

+------------+-------+--------------------+------------------------+
| Date       | Value | Avg. by Date       | myMeasure              |
+------------+-------+--------------------+------------------------+
| 31/05/2020 | 5     | (5 + 10) / 2 = 7.5 | (7.5 + 50) / 3 = 28.75 |
+------------+-------+--------------------+------------------------+
| 31/05/2020 | 10    | (5 + 10) / 2 = 7.5 | (7.5 + 50) / 3 = 28.75 |
+------------+-------+--------------------+------------------------+
| 01/06/2020 | 50    | 50 / 1 = 50        | (7.5 + 50) / 3 = 28.75 |
+------------+-------+--------------------+------------------------+
| 01/08/2020 | 27    | 27 / 1 = 27        | 27 / 1 = 27            |
+------------+-------+--------------------+------------------------+

我通过以下措施发现了这种行为:

myMeasure DEBUG =
VAR LookAheadAndBehindinDays = 28
VAR vTable =
    DATESINPERIOD (
        myTable[Date],DAY
    )
RETURN
    FirsTDATE ( vTable ) & " - " & LASTDATE ( vTable ) & UNICHAR(10) 
        & " - Row Count: " & COUNTROWS ( vTable )  & UNICHAR(10) 
        & " - Avg: " & AVERAGEX(vTable,myTable[Value]) & UNICHAR(10) 
        & " - Dates: " & CONCATENATEX ( vTable,myTable[Date],"," ) & UNICHAR(10) 
        & " - Values: " & CONCATENATEX ( vTable,myTable[Value]," )

对于日期为“ 31/05/2020”和“ 31/05/2020”的行,返回以下值:

31/05/2020 - 01/06/2020
Row Count: 2
Avg: 28.75
Dates: 31/05/2020,01/06/2020
Values: 7.5,50

最值得注意的是行数2,我希望它是3,值5,10和50(如上表所示)

所以我的问题是,如何通过平均加权每个值而不是平均每天加权来计算滚动平均值。

解决方法

我不确定我是否完全理解问题,但是对我来说,您只需要一个标准的AVERAGE而不是AVERAGEX迭代器。

我对公式进行了一些更改,并且没有使用DATESINPERIOD,该公式获得了相同的结果,并且(对我而言)更清晰易读

Avg =
VAR DaysInterval = 28
RETURN
    CALCULATE (
        AVERAGE ( myTable[Value] ),DATESBETWEEN (
            myTable[Date],MAX ( myTable[Date] ) - DaysInterval,--from
            MAX ( myTable[Date] ) + DaysInterval  --to
        )
    )

这是结果(基于样本数据集)

enter image description here

,

您要查找的是-/ + 28天的计算平均值:

myMeasure = 
VAR LookAheadAndBehindInDays = 28
var curDAte = rolling[ Date]
return CALCULATE(AVERAGE(rolling[Value]),FILTER(rolling,rolling[ Date] +LookAheadAndBehindInDays >= curDAte && 
        rolling[ Date] -LookAheadAndBehindInDays <= curDAte))

如您所见,我正在使用过滤器获取属于日期范围的行,并计算这些行的平均值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。