问题描述
我正在尝试根据向前和向后追溯一定天数的滑动时间窗口,基于该表中存在的值来计算该表各行的滚动平均值。
给出下表:
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
)
)
这是结果(基于样本数据集)
,您要查找的是-/ + 28天的计算平均值:
myMeasure =
VAR LookAheadAndBehindInDays = 28
var curDAte = rolling[ Date]
return CALCULATE(AVERAGE(rolling[Value]),FILTER(rolling,rolling[ Date] +LookAheadAndBehindInDays >= curDAte &&
rolling[ Date] -LookAheadAndBehindInDays <= curDAte))
如您所见,我正在使用过滤器获取属于日期范围的行,并计算这些行的平均值。