【问题标题】:Rolling average over time with multiple values per date随时间推移的滚动平均值,每个日期有多个值
【发布时间】:2020-10-29 13:04:37
【问题描述】:

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

给定下表:

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],
        DATEADD ( LASTDATE ( myTable[Date] ), LookAheadAndBehindInDays , DAY ),
        -2 * LookAheadAndBehindInDays,
        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(如上表所示)

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

【问题讨论】:

    标签: powerbi powerbi-desktop


    【解决方案1】:

    我不确定我是否完全理解了这个问题,但对我来说,您只需要一个标准 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
            )
        )
    
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • rolling[Date] 在我的上下文中不是衡量标准,使用VAR curDate = LASTDATE(rolling[Date])(获取行的实际值)给我的结果不正确。 @Giovanni Luisotto 的解决方案按预期工作。
      猜你喜欢
      • 2021-08-12
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多