Power BI:计算 6 个月内的 STDEVX.P

Posted

技术标签:

【中文标题】Power BI:计算 6 个月内的 STDEVX.P【英文标题】:Power BI: Calculating STDEVX.P over 6-Month period 【发布时间】:2017-11-25 08:52:53 【问题描述】:

我正在尝试按产品计算最近 6 个月的 STDEVX.P(不包括当月;所以在 2017 年 5 月,我想计算 2016 年 11 月至 2017 年 4 月期间的 STDEVX.P)的销售额为了进一步计算销售订单的变化。

销售数据由每日交易组成,因此它包含交易日期:iContractsChargebacks[TransactionDate] 和售出单位:iContractsChargebacks[ChargebackUnits],但如果在给定期间没有销售,则该月将没有数据。

因此,例如,在 7 月 1 日,过去 6 个月的销售额如下:

Jan 100
Feb 125
Apr 140
May 125
Jun 130

3 月不见了,因为没有销售。因此,当我在数据集上计算 STDEVX.P 时,它是在 5 个周期内计算的,而实际上有 6 个周期,恰好一个为零。

最后,我需要计算当前六个月期间的 STDEVX.P。如果在拉取月销售数字时,只返回了 3 个周期(月),那么它需要假设其他 3 个周期的值为零。

我考虑过手动计算标准偏差,而不是使用 DAX STDEVX.P 公式,并发现这 2 个链接作为如何执行此操作的参考,第一个最接近我的需要:

https://community.powerbi.com/t5/Desktop/Problem-with-STDEV/td-p/19731

Calculating the standard deviation from columns of values and frequencies in Power BI...

我试图尝试一下,但仍然没有得到正确的计算。我的代码是:

STDEVX2 =
    var Averageprice=[6M Sales]
    var months=6
    return
    SQRT(
    DIVIDE(SUMX(
    FILTER(ALL(DimDate),
    DimDate[Month ID]<=(MAX(DimDate[Month ID])-1) &&
    DimDate[Month ID]>=(MAX(DimDate[Month ID])-6)
    ),
    (iContractsChargebacks[SumOfOrderQuantity]-Averageprice)^2),
        months
    )
)

*注意:我没有在代码中使用日期参数,而是在日期表中创建了一个计算列,它为每个月提供了一个唯一的 ID,这对我来说更容易。

【问题讨论】:

【参考方案1】:

如果对您的模型进行更多解释,您的问题肯定会更容易回答。例如。您如何定义 [SumOfOrderQuantity] 和 [6M Sales],因为其中的错误肯定会影响最终结果。此外,了解您看到的结果与您期望的结果会有所帮助(使用示例数据)。

不过,我的猜测是,您的 DimDate 表是标准日期表(每个日期一行),但您希望按月计算标准差。

公式中的 FILTER 语句将日期范围正确地限制为前 6 个完整月,但每个日期仍会有一行。您可以在 Power BI 中确认这一点,方法是进入数据视图,在功能区的“建模”下选择“新表”,然后将 FILTER 语句放入:

Table = FILTER(ALL(DimDate),
DimDate[MonthID]<=(MAX(DimDate[MonthID])-1) &&
DimDate[MonthID]>=(MAX(DimDate[MonthID])-6))

假设您在给定月份有超过一天的销售额,那么按天而不是按月计算差异会搞砸。

我建议尝试:

Table = FILTER(SUMMARIZE(ALL(DimDate),[MonthID]),
DimDate[MonthID]<=(MAX(DimDate[MonthID])-1) &&
DimDate[MonthID]>=(MAX(DimDate[MonthID])-6))

附加的 SUMMARIZE 语句意味着您只能为每个 MonthID 获取一行,而不是为每个日期获取 1 行。如果您的 [6M Sales] 是所有 6 个月的月平均值,而 [SumOfOrderQuantity] 是每个月的月总和,那么您应该设置去计算方差、平方、除以 6 和平方根。

如果您需要进行进一步的故障排除,请记住您可以在画布上放置一个带有 MonthID、SumOfOrderQuantity 和 [6M Sales] 的表格,并将您在计算的每个阶段所期望的数字与您看到的数字进行比较。

希望这会有所帮助。

【讨论】:

谢谢 Lenard,但我的计算本身有问题。是否可以创建一个表格来计算过滤器确定的 6 个月内每个 SKU 的销售额总和,如果其中一个时期没有销售,那么它应该是 0? DimDate 表如您所述。销售表是每日交易,它包含交易日期:iContractsChargebacks[TransactionDate]、特定 SKU:iContractsChargebacks[SKU] 和为该 SKU 销售的单位:iContractsChargebacks[ChargebackUnits] 我想创建一个汇总 iContractsChargebacks[ChargebackUnits] 的表] 按 SKU 和月份。如果在特定月份,SKU 没有任何销售,那么我希望该月在 iContractsChargebacks[ChargebackUnits] 的数据中为 0 然后,我可以在计算 STDEV.P 也许尝试不使用 SKU,看看是否可以让它工作(因为我的回答中没有考虑 SKU)。我想你可以很容易地将 SKU 添加到 SUMMARIZE 语句中,但我首先要看看你是否可以在没有 SKU 的情况下让它工作。完成后,尝试添加 SKU。 至于创建永久中间表 - 我不建议这样做,除非存在性能问题,尤其是。如果创建表的唯一原因是这个计算。额外的表会使您的数据模型膨胀并可能产生其他副作用,因为现在您有 2 个重叠的表。如果这是您要走的路,我建议您使用 Power Query 并使用模型的其余部分加载附加表,而不是在现有模型的顶部使用 DAX。在大多数情况下,SUMMARIZE 会在计算过程中动态创建汇总表。【参考方案2】:

我在尝试根据销售数据计算 SKUS 的变异系数(标准/平均值)时遇到了类似的问题。我可以使用 Power Query 编辑器中的 Pivot-Unpivot 功能来解决几个月销售缺失的问题:

1) 使用任何计算列导出数据

2) 重新导入数据,以便计算列也可以在 power 查询编辑器中使用

3) 按月透视数据

4) 用 0 替换空值

5) 取消透视数据

6) 关闭并应用查询

7) 使用公式为变异系数添加计算列

CV = CALCULATE(STDEV.P(Table1[Value]),ALLEXCEPT(Table1,Table1[Product]))/CALCULATE(AVERAGE(Table1[Value]),ALLEXCEPT(Table1,Table1[Product]))

因此,标准差和均值也将考虑缺失月份的零销售额。

【讨论】:

以上是关于Power BI:计算 6 个月内的 STDEVX.P的主要内容,如果未能解决你的问题,请参考以下文章

Power BI:需要计算最近 3 个月的 MTD 销售额

过去 X 个月内的 PostgreSQL 累积计数

Power 查询中基于过去 3 个月的计算列

Power BI根据一定范围内的度量获取记录数

从 Facebook 群组收集数据

合并两个日期字段在两个月内的 pandas DataFrame