TOPN函数丨断点移动平均处理
还记得之前白茶写过关于移动平均的内容么?当时白茶曾经说过,实际需求中,难免会遇到销售挂蛋的时候(也就是当天没有销售的歇业状态),那这种情况该如何去处理呢?
先上示例文件:
这是白茶本期使用的案例文件,可以很清楚的看到有很多日期是断档的,将其导入PowerBI中。
(示例文件会放到知识星球中,小伙伴们可以搜索“PowerBI丨需求圈”,文章结尾处会有二维码。)
结果如图:
之后就是老套路,建立日期表,因为日期有断档,而很多时间智能函数对于日期的要求都是连续不间断的。
输入如下代码:
日期表 =
GENERATE (
CALENDAR ( MIN ( '示例'[时间] ), //注意:这里需要替换成你自己的数据
MAX ( '示例'[时间] ) ),
VAR DA = [Date]
VAR YEAR =
YEAR ( DA )
VAR QUARTER =
"季度" & FORMAT ( DA, "Q" )
VAR MONTE =
FORMAT ( DA, "MM" ) & "月"
VAR DAY =
DAY ( DA )
VAR WEEKID =
WEEKDAY ( DA, 2 )
RETURN
ROW (
"年度", YEAR,
"季度", QUARTER,
"月份", MONTE,
"日", DAY,
"年度季度", YEAR & QUARTER,
"年度月份", YEAR & MONTE,
"星期", WEEKID
)
)
建立模型关系,结果如图:
编写基本的代码:
销售 =
SUM ( '示例'[销售金额] )
好了,前期的准备工作结束,可以开始本期的问题探究了。
先按照之前的操作,编写移动平均代码:
移动平均 =
AVERAGEX ( DATESINPERIOD ( '日期表'[Date], MAX ( '日期表'[Date] ), -3, DAY ), [销售] )
结果如下:
小伙伴们,看明白没?白茶的案例文件有很多挂蛋的日期,但是移动平均却把这部分日期算进去了。比如头两天的结果,(396+80)/2结果是238,这没问题,但是我1月3日没有销售,那么结果就不能包含它。结果显示的不合理,那么该如何进行呢,跟着白茶的思路走。
(可能有的小伙伴需要这种,都是看需求的,白茶说一下另一种需求办法。)
有请TOPN函数!
编写如下代码:
TOPN移动平均 =
VAR TIM =
MAX ( '示例'[时间] )
VAR TIM2 =
TOPN (
3,
FILTER ( ALL ( '示例'[时间] ), '示例'[时间] <= TIM ),
CALCULATE ( MAX ( '示例'[时间] ) ), DESC
)
VAR AVE =
AVERAGEX ( TIM2, [销售] )
RETURN
AVE
这里还有另一种写法,就是将MAX替换成VALUES:
VALUES移动平均 =
VAR TIM =
MAX ( '示例'[时间] )
VAR TIM2 =
TOPN (
3,
FILTER ( ALL ( '示例'[时间] ), '示例'[时间] <= TIM ),
CALCULATE ( VALUES ( '示例'[时间] ) ), DESC
)
VAR AVE =
AVERAGEX ( TIM2, [销售] )
RETURN
AVE
先来看看结果:
这次的结果没有任何问题,非常完美!总计栏显示最后一次移动平均值。
(感谢**@冬哥**,膜拜)
这里解释一下代码含义:
TIM提取日期中最新的日期,将其转化为常量。
TIM2利用TOPN函数,返回前三行,从小于最新日期的日期中提取;由于TOPN函数自带上下文转换,需要在MAX(VALUES)外面嵌套一层CALCULATE函数将TOPN函数第三参数转换上下文。
AVE是利用AVERAGEX函数求出算数平均值。
最后,输出结果。
那么,我需要移动平均,参数随意变动那种,可以么?
当然可以!
选择新建参数,输入相关信息,点击确定。
修改编码如下:
优化移动平均 =
VAR TIM =
MAX ( '示例'[时间] )
VAR TIM2 =
TOPN (
[移动平均 值],
FILTER ( ALL ( '示例'[时间] ), '示例'[时间] <= TIM ),
CALCULATE ( MAX ( '示例'[时间] ) ), DESC
)
VAR AVE =
AVERAGEX ( TIM2, [销售] )
RETURN
AVE
结果如图:
小伙伴们❤GET了么?
白茶会不定期的分享一些函数卡片
(文件在知识星球[PowerBI丨需求圈])
这里是白茶,一个PowerBI的初学者。
下面这个知识星球是针对有实际需求的小伙伴,有需要的请加入下面的知识星球。
数据分析进阶之路,带你深入了解可视化技巧。