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

结果如图:


(白茶:T^T还要继续做报表,加油!)

小伙伴们❤GET了么?

白茶会不定期的分享一些函数卡片

(文件在知识星球[PowerBI丨需求圈])

这里是白茶,一个PowerBI的初学者。

下面这个知识星球是针对有实际需求的小伙伴,有需要的请加入下面的知识星球。

请在PC端查看,有部分图片无法在移动端显示。
PowerBI丨白茶