如何将Python脚本处理得到的数据传递至Power BI指定列
Power BI中Python脚本处理结果无法回写指定列的解决方法
失败核心原因
操作失败是三个问题叠加导致的:
savgol_filter参数非法:该函数要求window_length(窗口长度)必须是小于等于样本量的正奇数,你传入的窗口值是48(偶数),脚本运行到滤波步骤就会直接报错中断,根本执行不到后续的赋值语句。你代码注释里标注的窗口50、阶数3也和实际传参不符,属于参数书写错误。- 回写逻辑不满足Power BI的运行规则:Power BI运行Python脚本时,不会自动读取你修改过的原始
dataset变量,必须在脚本末尾显式输出处理完成的pandas DataFrame,才能被Power BI识别为回传的数据集。 - 类型/长度匹配风险:
savgol_filter返回的是numpy数组,如果你赋值的行切片长度和数组长度不一致,会触发pandas赋值报错。
修正后的完整可运行代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt import scipy from scipy import interpolate from scipy.signal import savgol_filter x = dataset.loc[0:47,"Année"] y = dataset.loc[0:47,"Capex (M€)"] Capex_brut = scipy.interpolate.interp1d(x, y) # 修正窗口长度为奇数,这里选和48最接近的47,多项式阶数保持4即可 Capex_lissés = savgol_filter(y, window_length=47, polyorder=4) x_new = np.linspace(2023, 2070, 300) plt.scatter(x, y, color = 'blue') plt.plot(x_new,Capex_brut(x_new),color = 'black') plt.plot(x, Capex_lissés, color = 'green') plt.legend(['nuage', 'linear', 'lissés'], loc='best') plt.show() # 给指定列赋值,确保长度匹配:0:47共48行,和Capex_lissés长度完全一致 dataset.loc[0:47,"Lissage"] = Capex_lissés # 必须在脚本最后显式输出处理完成的DataFrame,Power BI只会识别这一步返回的表 dataset
后续加载操作
脚本运行成功后,Power Query编辑器里会出现返回结果的表提示,点击结果列旁边的展开按钮,选择要加载的列(包含新增的Lissage列),确认后就能把滤波结果正式写入数据集。
注意事项
- 提前确认Power BI绑定的Python环境已经安装了pandas、numpy、scipy、matplotlib依赖,否则会报导入错误
- 绘图代码
plt.show()不会影响数据回传,运行时会弹出独立的绘图窗口,关闭窗口后脚本会继续执行后续逻辑 - 如果需要给全量数据行做滤波,直接去掉切片的
loc[0:47]限制,同时调整savgol_filter的窗口长度为符合要求的奇数即可 - 脚本最后一行必须是要返回的DataFrame变量,不要在最后一行写print、变量赋值之类的语句,否则Power BI无法识别返回的表结构
内容的提问来源于stack exchange,提问作者Daniel PIERRA
相关产品推荐
相关产品推荐

