前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TOPN函数丨断点移动平均处理

TOPN函数丨断点移动平均处理

原创
作者头像
PowerBI丨白茶
修改2021-09-02 09:29:51
5020
修改2021-09-02 09:29:51
举报
文章被收录于专栏:PowerBIPowerBI

还记得之前白茶写过关于移动平均的内容么?当时白茶曾经说过,实际需求中,难免会遇到销售挂蛋的时候(也就是当天没有销售的歇业状态),那这种情况该如何去处理呢?

先上示例文件:

这是白茶本期使用的案例文件,可以很清楚的看到有很多日期是断档的,将其导入PowerBI中。

(示例文件会放到知识星球中,小伙伴们可以搜索“PowerBI丨需求圈”,文章结尾处会有二维码。)

结果如图:

之后就是老套路,建立日期表,因为日期有断档,而很多时间智能函数对于日期的要求都是连续不间断的。

输入如下代码:

代码语言:txt
复制
日期表 = 
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
        )
)

建立模型关系,结果如图:

编写基本的代码:

代码语言:txt
复制
销售 = 
SUM ( '示例'[销售金额] )

好了,前期的准备工作结束,可以开始本期的问题探究了。

先按照之前的操作,编写移动平均代码:

代码语言:txt
复制
移动平均 = 
AVERAGEX ( DATESINPERIOD ( '日期表'[Date], MAX ( '日期表'[Date] ), -3, DAY ), [销售] )

结果如下:

小伙伴们,看明白没?白茶的案例文件有很多挂蛋的日期,但是移动平均却把这部分日期算进去了。比如头两天的结果,(396+80)/2结果是238,这没问题,但是我1月3日没有销售,那么结果就不能包含它。结果显示的不合理,那么该如何进行呢,跟着白茶的思路走。

(可能有的小伙伴需要这种,都是看需求的,白茶说一下另一种需求办法。)

有请TOPN函数!

编写如下代码:

代码语言:txt
复制
TOPN移动平均 = 
VAR TIM =
    MAX ( '示例'[时间] )
VAR TIM2 =
    TOPN (
        3,
        FILTER ( ALL ( '示例'[时间] ), '示例'[时间] <= TIM ),
        CALCULATE ( MAX ( '示例'[时间] ) ), DESC
    )
VAR AVE =
    AVERAGEX ( TIM2, [销售] )
RETURN
    AVE

这里还有另一种写法,就是将MAX替换成VALUES:

代码语言:txt
复制
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函数求出算数平均值

最后,输出结果。

那么,我需要移动平均,参数随意变动那种,可以么?

当然可以!

选择新建参数,输入相关信息,点击确定。

修改编码如下:

代码语言:txt
复制
优化移动平均 = 
VAR TIM =
    MAX ( '示例'[时间] )
VAR TIM2 =
    TOPN (
        [移动平均 值],
        FILTER ( ALL ( '示例'[时间] ), '示例'[时间] <= TIM ),
        CALCULATE ( MAX ( '示例'[时间] ) ), DESC
    )
VAR AVE =
    AVERAGEX ( TIM2, [销售] )
RETURN
    AVE

结果如图:


小伙伴们❤GET了么?

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档