【问题标题】:Issue trying to calculate gradient using Power BI尝试使用 Power BI 计算梯度的问题
【发布时间】:2018-11-14 17:52:12
【问题描述】:

我正在尝试计算通过我的数据集中包含的一系列点的趋势线的梯度。我已经研究过是否有内置函数可以做到这一点,但似乎没有,所以我是手动做的。我不是 DAX 专家(也可能不是数学专家!)。

我在 excel 中创建了一个表格来演示一个简单的示例,这样我就知道我的目标是什么:

在 Power BI 环境中,有两个表连接到“月和年”列。这些表格的简略说明如下:

请注意,插图中的“订单”度量在 Power BI 代码中称为“每天的特殊订单”。

第 1 步

创建平均月数的度量:

Average of months =
    - AVERAGEX (
        SUMMARIZE (
            CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
            Query_GSR[Month&Year],
            "AvMonths", AVERAGE ( Query_GSR[MonthNumForSlope] )
        ),
        [AvMonths]
    )

我在表达式部分使用 AVERAGE,以便 2018 年 9 月的记录在“AvMonths”列中有 21,然后在 2018 年 10 月它显示为 22。我想我可以使用 MIN 或 MAX,因为它们都会根据月份说 21 或 22(只有一个要避免的是 SUM,因为这会将它们全部加起来)。

我还尝试通过汇总然后在 User_Friendly_Months 表中创建一个 NATURALLEFTOUTERJOIN 来获取这些月份的月份编号,并且在将其合并到此过程的其余部分时,该度量需要永远计算(即使它确实有效)最后以某种方式)。

第 2 步

对订单做同样的事情:

Average of special orders =
- AVERAGEX (
    SUMMARIZE (
        CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
        Query_GSR[Month&Year],
        "Special OPD", [Special orders per day]
    ),
    [Special OPD]
)

第 3 步

执行我原始图片中步骤“C”的计算:

Column_C_Step =
SUMX (
    SUMMARIZE (
        CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
        Query_GSR[Month&Year],
        "Special OPD", [Special orders per day],
        "MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
    ),
    ( [Special OPD] + [Average special orders] )
        * ( [MonthNum] + [Average of MonthNums] )
)

在我的示例中,该度量返回零,而不是返回 -11.95。

当我这样做时:

Check_orders_worked =
SUMX (
    SUMMARIZE (
        CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
        Query_GSR[Month&Year],
        "Special OPD", [Special orders per day],
        "MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
    ),
    [Special OPD]
)

...我得到 1188.9,这是我的 Excel 表格插图中“订单”的总数(所以必须有效)。

当我这样做时:

Check_months_worked =
SUMX (
    SUMMARIZE (
        CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
        Query_GSR[Month&Year],
        "Special OPD", [Special orders per day],
        "MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
    ),
    [MonthNum]
)

...我得到了 43,这是我的插图中 Month_Num 的总和(同样,必须工作)。

但是当我尝试对 A 和 B 执行等效的 SUMPRODUCT 以获得 C 时,它返回零。

谁能解释到底发生了什么?

这让我发疯了。

或者如果有更简单的方法来做梯度计算,我会高兴地哭泣。

谢谢

更新

为了完整起见,这里是有效的措施:

Step_C_Measure =
VAR _OrdersAverage = [Average special orders]
VAR _MonthsAverage = [Average of MonthNums]
RETURN
    SUMX (
        SUMMARIZE (
            CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
            Query_GSR[Month&Year],
            "Special OPD", [Special orders per day],
            "MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
        ),
        ( [Special OPD] + _OrdersAverage )
            * ( [MonthNum] + _MonthsAverage )
    )

然后是步骤 D:

Step_D_Measure =
VAR _MonthsAverage = [Average of MonthNums]
RETURN
    SUMX (
        SUMMARIZE (
            CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
            Query_GSR[Month&Year],
            "Special OPD", [Special orders per day],
            "MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
        ),
        ( [MonthNum] + _MonthsAverage )
            * ( [MonthNum] + _MonthsAverage )
    )

最后得到渐变:

Special order gradient =
DIVIDE ( Step_C_Measure, Step_D_Measure, "" )

【问题讨论】:

  • 这对我来说似乎工作量太大了。 -23.9 简直就是(582.5 - 606.4)/1,一个月的变化。您是只使用两个点,还是尝试创建更一般的线性回归?
  • @AlexisOlson 我刚刚包含了两个数据点用于说明,因此我可以轻松地在计算器上重新执行以进行检查。目的是按客户(可能有数百个)将其用于可能 3、6、9 和 12 个月的梯度计算,以便我可以创建一个报告,将所有客户从最小(最大负梯度)到最大,标记在每个时间段内哪些客户下降最快。
  • 您能否编辑您的帖子并通过DAX Formatter 运行您的 DAX,使其更具可读性?必须左右滚动真的很痛苦。 (注意:它希望 MeasureName = 出现在公式之前。)
  • 道歉 - 想知道如何做到这一点。请看上面。我的方法也适用于多个月,但链接到控制 User_Friendly_Months 表的切片器。当我展示了所有 12 个月的内容时,将所有内容加起来并检查我所看到的应该是什么是一件很痛苦的事情,所以我把切片机放到了 9 月和 10 月,这样我就可以检查它了。你会看到这是在我说 ALLSELECTED(User_Friendly_Months) 的 CALCULATETABLE 函数中控制的。

标签: powerbi dax


【解决方案1】:

在一个关于multiple linear regression 的问题中,我链接到了一个涵盖基本线性回归的community post

在你的情况下,斜率的公式可以类似这样计算:

Slope = 
VAR RowCount = COUNTROWS(Query_GSR)
VAR Sum_X = SUMX(Query_GSR, Query_GSR[Month_Num])
VAR Sum_Y = SUMX(Query_GSR, Query_GSR[Orders])
VAR Sum_XY = SUMX(Query_GSR, Query_GSR[Month_Num] * Query_GSR[Orders])
VAR Sum_XX = SUMX(Query_GSR, Query_GSR[Month_Num] * Query_GSR[Month_Num])
RETURN DIVIDE(RowCount * Sum_XY - Sum_X * Sum_Y, RowCount * Sum_XX - Sum_X * Sum_X)

这适用于几个月的回归,而不仅仅是两个月。

【讨论】:

  • 太棒了,我会试试的。从对 DAX 的理解来看,为什么我尝试的方法不起作用,这仍然会让我感到困扰,但这会让我尝试报告,看看它是否真的有帮助。非常感谢。
  • @mickeyt 我认为您的代码的问题在于,在您的 Column_C_Step 度量中,没有在您想要的上下文中评估度量 [Average special orders] 和 [Average of MonthNums]。如果您将它们声明为变量(例如 VAR AvgOrders = [特殊订单的平均数])并将这些变量传递给 SUMX,我想您会得到您期望的 -11.95
  • 我会在早上进行更改并通知您 - 非常感谢您的关注。
  • 你好。像梦一样工作!对“步骤 D”做了类似的事情,将平均值分配给变量,然后执行行值减去平均值并将其平方。最终度量将 D 划分为 C 以获得梯度。非常有趣的是,将其作为客户排名的基础——而不是盯着一大堆折线图,这会用一个“分数”来吸引注意力,所以认为它真的很有用。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多