如何在Power Query中用Python生成正态(高斯)分布列表
在Power Query中用Python实现价格数据的高斯分布匿名化
核心思路
通过Python的NumPy库生成均值为1、可自定义标准差的正态分布随机数,与原价格相乘,既能匿名化数据,又能保留原数据的整体分布特征和数值量级。
步骤1:启用Power Query的Python集成
确保你的Excel/Power BI已配置好Python环境:
- Power BI:依次点击「文件」→「选项和设置」→「选项」→「Python脚本设置」,指定本地Python安装路径
- Excel:「数据」→「获取数据」→「自其他来源」→「自Python脚本」,首次使用会提示配置Python路径
步骤2:添加Python列生成匿名化价格
- 将你的价格数据加载到Power Query编辑器中,确认包含目标价格列(比如列名为
原始价格) - 点击「添加列」选项卡,选择「Python脚本」
- 在弹出的编辑框中粘贴以下代码(记得替换
原始价格为实际列名):import numpy as np # 生成均值=1(保证价格水平接近原数据)、标准差=0.1(控制波动幅度,可调整)的正态分布随机数 df['匿名化价格'] = df['原始价格'] * np.random.normal(loc=1, scale=0.1, size=len(df)) # 可选:保留两位小数,模拟真实价格格式 df['匿名化价格'] = df['匿名化价格'].round(2) - 点击「确定」,Power Query会自动运行脚本并生成新的
匿名化价格列
步骤3:验证分布一致性
为确保匿名化后的数据保留原分布特征:
- 可在Power Query中选中
原始价格和匿名化价格列,点击「可视化」选项卡生成直方图,对比两者的分布形态 - 或在Python脚本中添加分布校验代码:
import matplotlib.pyplot as plt # 绘制双直方图对比 plt.hist(df['原始价格'], alpha=0.5, label='原始价格') plt.hist(df['匿名化价格'], alpha=0.5, label='匿名化价格') plt.legend() plt.show()
纯M语言替代方案(无Python时使用)
如果无法启用Python,可通过Box-Muller变换手动在M语言中实现正态分布随机数(随机数质量略逊于NumPy):
let 源 = 你的数据源, 添加均匀随机数1 = Table.AddColumn(源, "随机数1", each Number.Random()), 添加均匀随机数2 = Table.AddColumn(添加均匀随机数1, "随机数2", each Number.Random()), 计算正态随机数 = Table.AddColumn(添加均匀随机数2, "正态随机数", each Sqrt(-2 * Ln([随机数1])) * Cos(2 * Number.PI() * [随机数2]) * 0.1 + 1 // 均值1,标准差0.1 ), 生成匿名化价格 = Table.AddColumn(计算正态随机数, "匿名化价格", each [原始价格] * [正态随机数], type number), 清理冗余列 = Table.RemoveColumns(生成匿名化价格, {"随机数1", "随机数2", "正态随机数"}) in 清理冗余列
内容的提问来源于stack exchange,提问作者Aarón Alberto Garza Aguirre
相关产品推荐
相关产品推荐

