如何调用Python脚本/API生成动态NLG文本并展示在Power BI仪表板
可行性结论
该需求完全可实现,依托Power BI原生Python视觉对象能力即可完成筛选触发、动态数据传递、NLG计算、结果实时展示全流程,不需要额外采购第三方付费组件。
具体实现流程
前置准备
- 在运行Power BI Desktop的本地设备提前配置好Python环境,安装
pandas、matplotlib、requests(调用远程API时需要)以及NLG逻辑依赖的所有库,记好Python解释器的本地安装路径。 - 提前调试好NLG能力:如果用本地Python脚本跑NLG,先写好处理函数,确保传入结构化薪资数据能返回正确的自然语言结果;如果用部署好的远程Python API,先测通接口,确认接口可接收结构化数据、返回标准NLG文本。
步骤1:关联Power BI和本地Python环境
- 打开Power BI Desktop,依次点击「文件」→「选项和设置」→「选项」→「Python脚本编写」
- 在设置页选择你提前配置好的Python环境主目录,点击确定完成关联。
步骤2:添加Python视觉对象承载NLG结果
- 在右侧可视化面板找到标识为
Py的Python视觉对象,点击添加到仪表板画布,调整大小和摆放位置,这个对象就是后续展示动态NLG文本的载体。 - 把NLG计算需要用到的所有字段(员工ID、薪资金额、发放月份等)全部拖入该Python视觉的「值」配置栏。不需要额外写筛选事件监听逻辑:只要字段被拖入Python视觉的取值范围,后续所有筛选操作(包括月份筛选器切换、柱状图点选交叉筛选)触发时,Power BI都会自动把当前筛选上下文对应的子集数据传入Python脚本,完全自动响应筛选变化。
步骤3:编写脚本对接NLG逻辑
- 点击画布上的Python视觉对象,下方会弹出Python脚本编辑区,Power BI会自动生成基础代码,将你拖入的字段转换为名为
dataset的pandas DataFrame,这个变量存储的就是当前筛选条件下的动态数据——比如筛选Jan2022时,dataset里仅包含Jan2022的所有员工薪资数据。 - 在自动生成的基础代码下方补充NLG调用逻辑,最后用matplotlib把生成的文本渲染到视觉区域即可,参考代码如下:
# 以下为Power BI自动生成的基础代码,请勿修改 import pandas as pd import matplotlib.pyplot as plt dataset = pd.DataFrame({ # Power BI会自动填充拖入的字段数据,无需手动编辑 }) # ----- 以下为自定义NLG调用逻辑 ----- # 方式1:调用本地NLG脚本 # from my_nlg_module import generate_salary_nlg # nlg_text = generate_salary_nlg(dataset) # 方式2:调用远程部署的Python API # import requests # resp = requests.post("你的API地址", json=dataset.to_dict(orient="records")) # nlg_text = resp.json()["result"] # 渲染文本,隐藏坐标轴 plt.figure(figsize=(10, 2), dpi=100) plt.text(0.02, 0.5, nlg_text, fontsize=12, wrap=True) plt.axis("off") plt.tight_layout() plt.show()
步骤4:效果联调
- 保存脚本后,切换月份筛选器的选项即可看到效果:每次筛选变更,Power BI会自动重跑Python脚本,传入新筛选条件下的dataset,生成新的NLG文本渲染展示,完全匹配你提到的场景——比如选中Jan2022时,就会展示
Employee E1 has received 1500/- salary during Jan2022,切换筛选条件时E1、1500、Jan2022三个参数会自动同步更新。
注意事项
- 本地Power BI Desktop端跑该方案无任何限制,装对Python依赖即可正常使用;如果需要把报表发布到Power BI云端服务,尽量只使用云端原生支持的Python库(pandas、matplotlib、requests等),如果NLG逻辑依赖小众库,建议把NLG能力封装成HTTP接口,脚本里仅保留接口调用逻辑,避免云端运行报错。
- Python脚本不要加冗余的耗时逻辑,每次筛选变更都会触发脚本重跑,单轮计算耗时尽量控制在2秒内,避免筛选切换后加载延迟过高影响体验。
- 如果需要对NLG文本做格式调整(比如改字体大小、颜色、高亮关键参数),直接修改matplotlib渲染部分的代码参数即可。
内容的提问来源于stack exchange,提问作者Techie
相关产品推荐
相关产品推荐

