求组怎么计算移动平均最新连续 3 天超过 3 的日期

Power Pivot 叶北 ⋅ 于 2023-07-02 02:41:16 ⋅ 最后回复由 叶北 2023-07-15 11:24:47 ⋅ 986 阅读

file
我现在有这样一张表,目前需要得到每个产品销量第一次移动平均(间隔3天)超过3的日期,然后用x轴恒定线进行展示
我目前的思路是在直接在产品实表新增一列,用来展示该日期,然后直接用恒定线调用这个字段,这样每个产品在查看的时候都会实时显示这个日期点。
现在的思路是先在事实表中新增每个产品每日的移动平均,然后用再去找最新连续3天都超过3的日期
想了两种公式:
'''

SUMMARIZECOLUMNS (
        ss_cpbx[产品名称],
        ss_cpbx[日期],
        ss_cpbx[销量],
        "移动平均-销量",
            CALCULATE (
                DIVIDE ( SUM ( 'ss_cpbx'[销量] ), 3 ),
                ALL ( ss_cpbx[日期] ),
                FILTER (
                    ALL ( ss_cpbx[日期] ),
                    ss_cpbx[日期] <= VALUES ( ss_cpbx[日期] )
                        && ss_cpbx[日期]>= ( ( VALUES ( ss_cpbx[日期] ) - 2 ) )
                )
            )

'''

            VAR b =
    SUMMARIZECOLUMNS (
        ss_cpbx[产品名称],
        ss_cpbx[日期],
        ss_cpbx[销量],
        "移动平均-销量",
         IF (
        HASONEVALUE ( ss_cpbx[日期] ),
               AVERAGEX (
                    FILTER (
                         SUMMARIZECOLUMNS ( ss_cpbx[产品名称], ss_cpbx[日期], ss_cpbx[销量] ),

                        ss_cpbx[日期]
                            <= VALUES ( ss_cpbx[日期] )
                            && ss_cpbx[日期]
                                >= (VALUES ( ss_cpbx[日期] ) - 3)
                    ),
                    CALCULATE (
                        SUM ( 'ss_cpbx'[销量] )
                    )
                )
            )
    )

'''

现在这样算出来的移动平均值是错误的,只是把当前销量除3了,是哪里出问题了呢,求助大神
file

最佳答案
  • onlylike
    2023-07-14 08:56:15

    @叶北 是用Dax函数写的
    新建列:
    前3天的平均值 =
    var dates = Sheet1[日期]
    var products = 'Sheet1'[产品]
    var period = FILTER(Sheet1,'Sheet1'[日期]<=dates && 'Sheet1'[日期]>dates-3 && Sheet1[产品]=products)
    return
    AVERAGEX(period,'Sheet1'[销量])
    新建表:
    前3天的平均值 =
    SUMMARIZE('Sheet1','Sheet1'[产品],'Sheet1'[日期],Sheet1[销量],"移动平均",
    var dates = MAX(Sheet1[日期])
    var products = MAX(Sheet1[产品])
    var period = FILTER(ALL('Sheet1'),'Sheet1'[日期]<=dates && 'Sheet1'[日期]>dates -3 && 'Sheet1'[产品]=products)
    return
    AVERAGEX(period,'Sheet1'[销量])
    )

回复数量: 8
  • 叶北
    2023-07-02 02:44:04

    @焦棚子 大神我刚刚不小心把之前的帖子删了,我现在知道怎么新建事实表并新增列了,但是现在新的问题是按照之前度量值的写法算出来的移动平均值是错误的,到底是哪出了问题了呢?

  • 焦棚子 微软 MVP
    2023-07-03 17:59:56

    @叶北
    我的意思是,你模拟好你的结果。
    同时在单元格后面附上你的计算逻辑。
    file

  • onlylike
    2023-07-12 12:17:20

    最近学习了移动平均,不知道有没有符合需求的计算结果

    file

  • 叶北
    2023-07-13 20:27:05

    @onlylike 哦哦,我后面直接去学Python处理原数据了,直接roling()mean结果就出来了,然后再roling一次日期也出来了,你这个是用pq处理的吗

  • 叶北
    2023-07-13 20:31:15

    @onlylike 确实是我之前想要的结果,到现在也不会用dax写,一新建列就计算全部列了,后面我用Python才解决问题,感觉以后都不会去用dax处理数据了,只会用来写一些展示切片了

  • onlylike
    2023-07-14 08:56:15

    @叶北 是用Dax函数写的
    新建列:
    前3天的平均值 =
    var dates = Sheet1[日期]
    var products = 'Sheet1'[产品]
    var period = FILTER(Sheet1,'Sheet1'[日期]<=dates && 'Sheet1'[日期]>dates-3 && Sheet1[产品]=products)
    return
    AVERAGEX(period,'Sheet1'[销量])
    新建表:
    前3天的平均值 =
    SUMMARIZE('Sheet1','Sheet1'[产品],'Sheet1'[日期],Sheet1[销量],"移动平均",
    var dates = MAX(Sheet1[日期])
    var products = MAX(Sheet1[产品])
    var period = FILTER(ALL('Sheet1'),'Sheet1'[日期]<=dates && 'Sheet1'[日期]>dates -3 && 'Sheet1'[产品]=products)
    return
    AVERAGEX(period,'Sheet1'[销量])
    )

  • onlylike
    2023-07-14 09:44:49

    @叶北 谢谢你的提醒,试了下用PQ也可以做,就是麻烦了一些
    = Table.ExpandTableColumn(Table.Group(更改的类型,"产品",{"数据",each Table.FromRows(List.Zip({[日期],[销量],List.Transform([日期],(x)=>Number.Round(List.Average(Table.SelectRows(,each [日期]<=x and _[日期]>Date.AddDays(x,-3))[销量]),2))}),{"日期","销量","前3天的移动平均"})}),"数据",{"日期","销量","前3天的移动平均"})

    file

  • 叶北
    2023-07-15 11:24:47

    @onlylike 我刚刚发现bi数据源直接就支持python脚本,太爽了,直接写好脚本,可以跳过power query步骤了,而且也不用切换其他软件了,以后更新数据源直接在bi里面全流程走完

暂无评论~~
  • 请务必阅读并严格遵守《社区管理规范与使用说明》
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 发送表情,可用的 Emoji 见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板粘贴上传, 格式限制 - jpg, png, gif
  • 不支持上传附件,请尽可能用文字和图片将问题描述清楚,如实在需要上传附件,可上传到 共享网盘 后分享链接
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
Ctrl+Enter