PowerBI 基于度量值的动态装箱(范围变化)

PowerBI Dynamic binning (ranges change) based on value of measure

我正在尝试通过分箱来表示一些连续数据。一个区域的连续加权数据应分箱为:VeryHigh、High、Low、VeryLow。权重值基于按区域分组的某些事件类型之间的交互,因此可以根据报告用户select编辑的类型进行更改。

我在下面包含了一些示例数据以及到目前为止所做工作的概要。

从五组区域数据(A-E)开始。每个事件类型中都有一个或多个事件类型。每个事件都有一个权重和它在区域内发生的次数 (Count)。

添加计算列CC_ALL_WGT(权重*计数)

创建度量:

M_WGT = DIVIDE(SUM(sample_data[CC_ALL_WGT]), SUM(sample_data[4_count]))

一旦按区域分组,这就有意义了,我们可以看到该区域获得了总体权重分数

这可以通过根据我们希望检查的事件类型对数据进行切片来更改:

我们还可以设置额外的措施来获得最小值;最大限度;基于类型 selection:

的测量中值
M_MIN_M_WGT = IF(
    countrows(values(sample_data[1_area])) = 1,
    sample_data[M_WGT],
    MINX(
        values(sample_data[1_area]),
        sample_data[M_WGT]
    )
)

当切片器 selection 被制作时,它会按预期发生变化

同时设置一个度量来确定最小值和中值之间的中点以及最大值和中值之间的中点

M_MidMinMed =
sample_data[M_MED_M_WGT] - ((sample_data[M_MED_M_WGT] - sample_data[M_MIN_M_WGT]) / 2)

我想用这些值做的是根据以下内容创建一个条带:

非常低:(最低到 MinMed 中点) 低:(MinMed 到 Median) 高:(中位数到 MedMax 中点) 非常高:(MedMax 到最大值)

所以根据下面selection

垃圾箱将设置如下

  1. 非常低(0.59 到 0.76)
  2. 低(0.76 到 0.93)
  3. 高(0.93 到 1.01)
  4. 非常高(1.01 到 1.1)

A区将在Bin 4(VeryHigh); Bin 2 中的 B 区(低); Bin 1 中的区域 C(非常低); Bin 2(低)中的 D 区; Bin 4 中的 E 区(非常高)

如果 select 特定类型要审查(通过切片器),垃圾箱将设置如下:

  1. 非常低(0.35 到 0.61)
  2. 低(0.61 到 0.88)
  3. 高(0.88 到 1.06)
  4. 非常高(1.06 到 1.24)

因此检查 M_WGT(使用切片器中指定的类型):

A区将在Bin 4(VeryHigh); Bin 2 中的 B 区(低); Bin 1 中的区域 C(非常低); Bin 1 中的区域 D(非常低); Bin 4 中的 E 区(高)

注意 - D 区的 bin 分类从低到非常低的变化

这就是我卡住的地方。此 post 指定如何应用静态 bin 范围:https://community.powerbi.com/t5/Desktop/Histogram-User-defined-bin-size/m-p/69854#M28961 但我无法使用动态或更改值(最小值;最大值;媒体;中点)来执行此操作,具体取决于 selection.

我最接近的申请如下:

Range =
VAR temp =
    CALCULATE ( sample_data[M_WGT] )
RETURN
    IF (
        temp < 0.76,
        "1_VeryLow",
        IF (
            AND ( temp > 0.76, temp <= 0.93 ),
            "2_Low",
            IF (
                AND ( temp > 0.93, temp <= 1.01 ),
                "3_High",
                "4_VeryHigh"
            )
        )
    )

允许以下内容:

虽然我可以将 Bins 与视觉对象相关联,但它有很多问题。首先,binning 发生在 TYPE 级别而不是 AREA 级别。其次,我手动设置范围值。

当我说类型级别时,我的意思是它们在这个级别被分类:

而我希望直方图表示的是区域级别的 M_WGT 值。

如果我只按A区切片问题更容易看出来:

我想要的是在直方图中有一个区域 A 表示(1.10 的 bin),而不是当前显示的三个(对于每个类型 1.9;1;0.35)

希望我已经成功传达了问题和要求。

感谢任何建议或见解。

编辑: Link 报告 + 数据来源在这里:https://www.dropbox.com/sh/oganwruacdzgtzm/AABlggr3-xqdMvPjuR9EyrMaa?dl=0

您可以在一个度量中定义一个区域的桶:

Bucket = 
VAR Weights =
    SUMMARIZE ( ALLSELECTED ( sample_data ), sample_data[1_area], "Wgt", [M_WGT] )
VAR MinW = MINX ( Weights, [Wgt] )
VAR MaxW = MAXX ( Weights, [Wgt] )
VAR MedW = MEDIANX ( Weights, [Wgt] )
VAR MinMedW = ( MinW + MedW ) / 2
VAR MedMaxW = ( MedW + MaxW ) / 2
VAR CurrW = CALCULATE( [M_WGT], ALLSELECTED( sample_data[2_type] ) )
RETURN
    SWITCH (
        TRUE (),
        CurrW <= MinMedW, "1_VeryLow",
        CurrW <= MedW,    "2_Low",
        CurrW <= MedMaxW, "3_High",
        CurrW <= MaxW,    "4_VeryHigh"
    )

这会汇总您的过滤器选择 (ALLSELECTED) 中所有内容的权重,然后按照您指定的方式定义您的边界。然后我们计算所有选定类型的当前区域的权重,并将其传递到我们从低到高检查值的开关。


现在您不能将度量用作图表的轴,因此如果您希望这些桶位于轴上,我建议定义一个独立的 table。

Ranges =
DATATABLE (
    "Range", STRING,
    {
        { "1_VeryLow" },
        { "2_Low" },
        { "3_High" },
        { "4_VeryHigh" }
    }
)

Ranges[Range]放在轴上并根据需要定义计数度量。

CountArea =
COUNTROWS ( FILTER ( sample_data, [Range] = SELECTEDVALUE ( Ranges[Range] ) ) )

我真的不知道你想计算什么,它是否应该是一个不同的计数,或者是否应该涉及 4_count 但根据需要修改这个计数措施。