You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python脚本处理得到的数据传递至Power BI指定列

Power BI中Python脚本处理结果无法回写指定列的解决方法

失败核心原因

操作失败是三个问题叠加导致的:

  1. savgol_filter参数非法:该函数要求window_length(窗口长度)必须是小于等于样本量的正奇数,你传入的窗口值是48(偶数),脚本运行到滤波步骤就会直接报错中断,根本执行不到后续的赋值语句。你代码注释里标注的窗口50、阶数3也和实际传参不符,属于参数书写错误。
  2. 回写逻辑不满足Power BI的运行规则:Power BI运行Python脚本时,不会自动读取你修改过的原始dataset变量,必须在脚本末尾显式输出处理完成的pandas DataFrame,才能被Power BI识别为回传的数据集。
  3. 类型/长度匹配风险: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:01:14