请求创建DAX度量值计算各组合与参考组合的权重差异
解决Power BI中投资组合与参考组合权重差异的DAX度量问题
问题背景
需要实现DAX度量,计算所有投资组合相对于切片器选定的参考组合的单证券权重差值。矩阵布局要求:
- 行:投资组合(Portfolio)
- 列:证券(Security)
- 值:当前组合权重 - 参考组合权重
现有事实表Holdings包含字段:DATE、PORTFOLIO、SECURITY、WEIGHT,关联Calendar Table维度表。当前实现的度量无法正确计算差值,选择参考组合后,矩阵仅显示该参考组合的自身权重,而非与其他组合的差异。
现有数据示例
Holdings表
DATE PORTFOLIO SECURITY WEIGHT 1/31/24 Portfolio A IBM 0.25 1/31/24 Portfolio A APPL 0.25 1/31/24 Portfolio A MSFT 0.25 1/31/24 Portfolio A C 0.25 1/31/24 Portfolio B IBM 0.15 1/31/24 Portfolio B APPL 0.35 1/31/24 Portfolio B MSFT 0.25 1/31/24 Portfolio B C 0.25 1/31/24 Portfolio C IBM 0.25 1/31/24 Portfolio C APPL 0.15 1/31/24 Portfolio C MSFT 0.35 1/31/24 Portfolio C C 0.25 1/31/24 Portfolio D IBM - 1/31/24 Portfolio D APPL 0.25 1/31/24 Portfolio D MSFT 0.50 1/31/24 Portfolio D C 0.25 1/31/24 Portfolio E IBM 0.25 1/31/24 Portfolio E APPL 0.35 1/31/24 Portfolio E MSFT 0.15 1/31/24 Portfolio E C 0.25
期望输出(以Portfolio A为参考)
PORTFOLIO IBM APPL MSFT C Portfolio A - - - - Portfolio B (0.10) 0.10 - - Portfolio C - (0.10) 0.10 - Portfolio D (0.25) - 0.25 - Portfolio E - 0.10 (0.10) -
当前实现的问题
现有度量无法正确计算差值,核心原因有两点:
- 切片器使用
Holdings[PORTFOLIO],导致整个数据集被筛选为仅包含选定的参考组合,矩阵无法显示其他组合。 Reference Portfolio (SELECTED)度量未清除行上下文的PORTFOLIO筛选,导致每个行的参考权重等于当前行组合的权重,差值始终为0(或错误显示自身权重)。
现有度量代码:
Security Weight = SUM(Holdings[Weight]) Selected Portfolio = SELECTEDVALUE(Holdings[PORTFOLIO]) Reference Portfolio (SELECTED) = CALCULATE( [Security Weight], FILTER(Holdings, Holdings[PORTFOLIO] = [Selected Portfolio])) Weight Difference = [Security Weight] - [Reference Portfolio(SELECTED)]
修正方案
步骤1:创建独立的投资组合维度表
创建与Holdings表无直接筛选关系的独立Portfolio维度表,避免切片器直接过滤Holdings的行:
Portfolio Table = DISTINCT(Holdings[PORTFOLIO])
将该表用于切片器选择参考组合,原Holdings[PORTFOLIO]用于矩阵行。
步骤2:修正DAX度量
替换现有度量为以下代码:
// 基础权重求和度量 Security Weight = SUM(Holdings[Weight]) // 获取切片器选定的参考组合 Selected Reference Portfolio = SELECTEDVALUE('Portfolio Table'[PORTFOLIO]) // 计算参考组合的对应证券权重(清除行上下文的Portfolio筛选) Reference Weight = CALCULATE( [Security Weight], ALL(Holdings[PORTFOLIO]), // 移除当前行的Portfolio筛选限制 Holdings[PORTFOLIO] = [Selected Reference Portfolio] ) // 计算权重差值,处理空值显示 Weight Difference = VAR CurrentWeight = [Security Weight] VAR RefWeight = [Reference Weight] RETURN IF( ISBLANK(CurrentWeight) && ISBLANK(RefWeight), BLANK(), CurrentWeight - RefWeight )
步骤3:矩阵设置
- 行:
Holdings[PORTFOLIO] - 列:
Holdings[SECURITY] - 值:
[Weight Difference] - 切片器:使用
Portfolio Table[PORTFOLIO]选择参考组合
验证说明
- 选择参考组合后,矩阵将显示所有组合与参考组合的权重差值,参考组合自身的差值为0(可通过条件格式设置为显示“-”)。
- 对于无权重的证券(如Portfolio D的IBM),差值为
0 - 0.25 = -0.25,对应输出(0.25),符合示例要求。
内容的提问来源于stack exchange,提问作者John63
相关产品推荐
相关产品推荐

