
简介pandapower 1.2.0 是面向电力系统科研与工程应用的官方 Python 库压缩包可帮助用户高效完成电网建模、潮流计算、故障分析与最优潮流等任务适合具备 Python 基础、需要离线使用完整工具链的研究人员、工程师和高年级学生。包内共 163 个文件127 个 py 模块构成核心实现22 个 pickle 格式算例数据可直接用于测试与复现另有配置、说明文档和许可证文件压缩后约 1.93MB部署非常轻量。内容包含典型 IEEE 节点测试系统以及大规模输电网络模型覆盖从教学算例到接近真实电网的多种规模读者可借助自带数据快速验证算法或基于开放接口构建自定义拓扑与运行场景。目前已有 573 人浏览学习作为官方发布版本可满足课程实验、论文复现和工程预研等需求同时减少自行整理数据与处理依赖的时间成本是入门及进阶电力系统仿真的实用资料。1. pandapower 装好不一定会用先搞懂它解决什么问题如果你只是pip install pandapower然后用net pp.create_empty_network()建了一条线跑完runpp()就以为会了那这篇值得往下看。pandapower 是基于 pandas、NumPy 的电力系统分析工具它把电网建模变成填表把潮流计算、最优潮流、短路计算变成一行函数调用。它的价值不在“能算潮流”而在于“数据和结果都是 pandas DataFrame”你可以像处理普通表格一样处理电网数据批量改参数、批量跑场景、对照结果做差异分析。对于配电网规划、微电网调度、教学科研和新能源并网分析这是目前开源库里综合体验最顺的一条路。这篇会从安装 zip 包讲起一路到潮流计算参数调整、不收敛排查和批量仿真中间每个步骤的代码都能直接拷走改改就跑。2. 从 pandapower-1.2.0.zip 到可复现的安装流程2.1 为什么 1.2.0 需要明确 Python 版本pandapower 1.2.0 是 2025 年 4 月发布的版本引入了 generator 的功率因子定义、load/static_generator 的 scaling 简化标记以及针对有功-频率控制的扩展。它不是最新版但在不少生产环境和教材里仍然被引用原因是它的 API 行为相对固定对新用户来说社区资料更好找。安装前先确认 Python 版本pandapower 1.2.0 官方支持 Python 3.9 到 3.12低于 3.9 会遇到语法兼容问题高于 3.12 则可能因为依赖包没有对应 wheel 而失败。我一般会先检查当前环境的 Python 版本再装避免把基础环境搞乱。2.2 离线 zip 包安装的两种方式有时候机器不能直接访问公共包索引只能拿着 pandapower-1.2.0.zip 手动安装。常见做法是用 pip 直接指向本地文件但在那之前必须先装好它的依赖。pandapower 1.2.0 的核心依赖包括 pandas要求 1.4不建议用 2.2 以下版本、numpy、scipy、networkx、deepdiff。可以先建一个干净的虚拟环境避免污染全局解释器。下面是我惯用的方式Windows 和 Linux 通用。python -m venv pp_env # Windows pp_env\Scripts\activate # Linux / macOS source pp_env/bin/activate # 先装依赖 pip install numpy1.23 scipy1.8 pandas1.4 networkx2.6 deepdiff6.0 # 再装本地 zip 包 pip install ./pandapower-1.2.0.zip这段命令的逻辑是先创建独立虚拟环境然后把 pandapower 的五个核心依赖装好最后用pip install ./pandapower-1.2.0.zip安装本地包。./前缀是为了明确告诉 pip 这是一个本地路径而不是 PyPI 上的包名。有人会直接把 zip 包解压后运行python setup.py install这个做法在新版 Python 里容易踩坑因为 setuptools 对 project metadata 的处理方式变了推荐优先用 pip。另一种方式是先解压 zip再把pandapower文件夹直接复制到site-packages下。这种方式不推荐因为依赖关系不会自动解析卸载时也容易残留文件。非要这么做的话至少先记录下当前环境的pip freeze结果方便回滚。2.3 验证安装导入与版本检测装完后不要急着建网络先跑一组最基础的验证代码确认核心模块能导入、版本正确、依赖没有缺失。import pandapower as pp print(pp.__version__) # 创建最小测试网络 net pp.create_empty_network() bus1 pp.create_bus(net, vn_kv20.0, namebus1) bus2 pp.create_bus(net, vn_kv0.4, namebus2) pp.create_transformer(net, hv_busbus1, lv_busbus2, std_type0.4 MVA 20/0.4 kV) pp.create_line(net, from_busbus2, to_busbus2, length_km0.1, std_typeNAYY 4x50 SE) pp.create_load(net, busbus2, p_mw0.1, q_mvar0.05) pp.runpp(net) print(net.res_bus)这段代码的意思是用create_empty_network建空网络依次创建高压母线、低压母线、变压器、线路和负荷然后调用runpp做潮流计算最后打印结果表。如果看到版本号、没有报错并且res_bus表里有 vm_pu 数据说明安装成功。如果这里就报了ModuleNotFoundError: No module named pandapower八成是当前解释器和安装神器 misalign 了。此时在 VSCode 里检查右下角解释器路径确认它指向pp_env下的 python而不是全局解释器。pip show pandapower这条命令会显示 pandapower 的安装路径可以用来和which python的输出做交叉验证。如果两个路径不在同一个 site-packages 目录下解释器选错了直接切换解释器重新跑。出现AttributeError: module pandapower has no attribute runpp这类错误时原因是安装的版本不对或者安装文件损坏。重新下载 zip 包检查文件 hash 是否和官方 release 一致再来一遍安装流程。3. 用 pandapower 搭建电网模型bus、line、load 的参数该填什么3.1 数据模型从 pandas 表格到电力网络pandapower 的核心概念是“表格即模型”。net.bus、net.line、net.load、net.trafo 这些都是 DataFrame每一行对应电网里的一个设备每一列对应设备的参数。这种设计的直接好处是你想批量修改同类型设备参数时不用写循环直接对 DataFrame 做列计算就行。理解这个模型对后续使用很重要。pandapower 本身不保存一个独立的“图结构”网架拓扑是从这些 DataFrame 的 from_bus / to_bus 列中推导出来的。所以哪怕只填错一个 bus 索引拓扑就会错潮流结果自然不对。下面这个图可以帮你建立基本印象元素类型核心 DataFrame关键列作用母线net.busvn_kv, name, type电压等级基准拓扑锚点线路net.linefrom_bus, to_bus, length_km, std_type输电/配电连接变压器net.trafohv_bus, lv_bus, std_type电压变换负荷net.loadbus, p_mw, q_mvar有功/无功消耗发电机net.genbus, p_mw, vm_pu有功注入电压控制母线是拓扑锚点线路和变压器两端必须挂在已存在的 bus 索引上。负荷和发电机也必须挂在某个 bus 上。所有设备的索引都是自动生成的插入顺序从 0 开始递增。这意味着如果你删除了某个 bus它后面的索引不会自动紧凑新建设备时要注意避免索引冲突。3.2 最小放射状配电网实例下面以一个 20kV 馈线带两个 0.4kV 台区为例搭一个最小但完整的配电网模型。放射状配电网是最常见的结构也是学习 pandapower 最好的起点。import pandapower as pp net pp.create_empty_network() # 上级变电站母线 for vn_kv in [20.0, 0.4]: pp.create_bus(net, vn_kvvn_kv) # 20kV 馈线 pp.create_line(net, from_bus0, to_bus1, length_km1.2, std_typeNA2XS2Y 1x240 RM/25 12/20 kV, nameFeeder) pp.create_load(net, bus1, p_mw1.5, q_mvar0.3, nameload_1) # 变压器 20/0.4 kV容量 630 kVA pp.create_transformer_from_parameters( net, hv_bus1, lv_bus2, sn_mva0.63, vn_hv_kv20.0, vn_lv_kv0.4, vkr_percent0.4, vk_percent4.0, pfe_kw1.2, i0_percent0.2 ) # 0.4 kV 低压线路 pp.create_line_from_parameters( net, from_bus2, to_bus3, length_km0.05, r_ohm_per_km0.642, x_ohm_per_km0.083, c_nf_per_km210.0, max_i_ka0.142, nameLV_Line ) pp.create_load(net, bus3, p_mw0.08, q_mvar0.02, nameload_2) pp.runpp(net) print(net.res_line[[from_bus, to_bus, loading_percent, i_ka]]) print(net.res_load[[bus, p_mw, q_mvar, vm_pu]])这里用create_line配合 std_type 引用标准型号用create_transformer_from_parameters和create_line_from_parameters直接填写电气参数。两者的区别是std_type 是 pandapower 内置的标准类型库填了型号会自动带出电阻电抗参数适合快速搭建from_parameters 则完全手填适合找不到标准型号的场景。这里的 bus 索引是从 0 开始的母线 0 是 20kV 上级母线母线 1 是中压馈线末端母线 2 是 0.4kV 低压侧母线 3 是低压负荷节点。3.3 参数陷阱电压单位、容量、线路参数新手最常犯的错误是把潮流计算用的单位搞混。pandapower 里电压用 kV功率用 MW / MVAr容量用 MVA长度用 km。但很多人习惯用 W、V、A 去填参数导致结果数量级完全不对。另一种常见错误是把阻抗的单位写成欧姆而不是欧姆每公里create_line_from_parameters里 r_ohm_per_km 和 x_ohm_per_km 都是每公里的值如果直接填了总阻抗长线路后会明显偏高。检查网络完整性有现成方法pp.check_net(net)这个方法会检查孤立节点、未连接的设备、缺失的参数值等常见问题。如果检查通过但结果仍然不像话可以用net.bus和net.line的 DataFrame 看索引和参数是否和预期一致。另一个容易忽略的地方是 net.load 的 scaling 列这个列默认是 1.0如果你之前批量改过可能会造成实际负载和填的 p_mw 不一致。4. 潮流计算 runpp 的参数调优与不收敛处理4.1 算法选型NR、IW、FDBX 的适用边界runpp默认使用全牛顿-拉夫逊算法NR这是最通用、收敛性最好的选择。但对于某些病态网络NR 可能迭代多次仍然不收敛这时可以切换到其他算法。pandapower 提供的算法主要有NRNewton-Raphson默认精度高适用于大多数电网IWImplicit Z-bus Gauss对配电网络收敛较慢但对恒功率负载较多的低压网络可能更稳FDBXFast Decoupled速度最快适合辐射状网络但对重负载线路精度稍差实际使用中我会先跑一次 NR不收敛时再看结果调整。选算法不是一个“哪个更好用”的问题而是要匹配你的网络结构。下面的代码展示了如何在 runpp 时切换算法并开启详细输出# 默认算法 pp.runpp(net, algorithmnr, tol_v1e-6, tol_i1e-6, max_iteration20) # 切换到 IW pp.runpp(net, algorithmiw, tol_v1e-6, max_iteration50) # 切换到 FDBX pp.runpp(net, algorithmfdbx, tol_v1e-6, max_iteration30)tol_v是电压收敛容差tol_i是电流收敛容差max_iteration是最大迭代次数。容差设置得太严如 1e-9会导致不必要的迭代次数增加设置得太松如 1e-3则结果误差偏大。我一般取 1e-6 作为初始设置跑不收敛时再放宽到 1e-5。max_iteration也不是越大越好NR 超过 20 次还不收敛基本说明网络有问题。4.2 容差、分布式负载、电压限制怎么设置runpp还有几个不太起眼但实际很常用的参数。distributed_slack在微网或孤岛电网中特别重要默认 False 表示只有参考节点承担不平衡功率设置为 True 后所有带 gen 的母线都会按比例分摊功率缺额。init参数控制初值选择支持 auto、 flat 和 dc 三种默认 auto 会先用直流潮流做初始化交流潮流迭代次数会减少。trafo_model控制变压器模型t 是 T 型等效电路pi 是 π 型等效电路后者在配电网仿真中更常见。pp.runpp( net, algorithmnr, tol_v1e-6, tol_i1e-6, max_iteration20, distributed_slackTrue, initdc, trafo_modelt, trafo_loadingcurrent, enforce_v_decimalTrue, )enforce_v_decimal会强制把电压运行点作为离散变量处理适合做电压调节器仿真。trafo_loading控制变压器负载率按电流还是按功率计算配电网里建议用 current因为低压侧功率因数和电压偏差会影响视在功率而电流负载率更能反映真实热稳定裕度。4.3 不收敛第一动作别急着调参数先查网络遇到loadflow not converged报错时我的排查顺序是固定的第一步看 bus 索引是否连续。用net.bus.index和net.line[[from_bus,to_bus]]做差集找出引用了不存在的 bus 编号的设备。第二步看孤岛。使用pp.topology.simple_calc_graph(net)检查网络是否被分割成多个不相连的子图。如果 feeder 断开潮流根本不可能收敛因为公式矩阵奇异。第三步检查负荷量级。把net.load[[bus,p_mw,q_mvar]]按 bus 分组求和和变压器容量对比。如果某个变压器满载超过 150%大概率是潮流发散的原因。load_group net.load.groupby(bus)[[p_mw, q_mvar]].sum() print(load_group) trafo_sn net.trafo[sn_mva].sum() print(总负荷 vs 总变压器容量:, load_group[p_mw].sum(), trafo_sn)如果以上都正常再回到 runpp 的参数上来。把容差放宽到 1e-4把 init 改成 flat把算法换成 IW逐项排除因素。遇到配电网线路过长导致的低压问题不要只靠调参数要看电压结果。5. 不止于潮流优化、故障与批量仿真的扩展路径5.1 最优潮流 runopp 的边界约束参数在传统配电网分析中潮流计算只是“已知负载求状态”。做规划或调度时还需要求解“在满足电压和线路容量约束下如何调整发电机出力让运行成本最小”这就要用到最优潮流OPF。pandapower 的runopp提供了这个能力但它依赖pandapower.opf模块需要额外安装pandapower自带的 OPF 引擎或者对接pypower。这里直接看代码import pandapower as pp from pandapower.control import ContinuousTapControl net pp.create_empty_network() b0 pp.create_bus(net, vn_kv110.0) b1 pp.create_bus(net, vn_kv110.0) b2 pp.create_bus(net, vn_kv110.0) pp.create_ext_grid(net, busb0, vm_pu1.0) pp.create_line(net, b0, b1, length_km10.0, std_type149-AL1/24-ST1A 110.0) pp.create_line(net, b1, b2, length_km10.0, std_type149-AL1/24-ST1A 110.0) # 在 b1 和 b2 上挂发电机带成本 g1 pp.create_gen(net, b1, p_mw20.0, vm_pu1.0, min_p_mw0.0, max_p_mw50.0) g2 pp.create_gen(net, b2, p_mw30.0, vm_pu1.0, min_p_mw0.0, max_p_mw50.0) pp.create_poly_cost(net, g1, gen, cp1_eur_per_mw20.02, cp0_eur0.0) pp.create_poly_cost(net, g2, gen, cp1_eur_per_mw20.05, cp0_eur0.0) pp.create_load(net, b2, p_mw40.0, q_mvar5.0) pp.runopp(net, delta1e-12) print(net.res_cost) print(net.res_gen[[p_mw, q_mvar, va_degree, vm_pu]])create_poly_cost指定发电机的成本函数cp1_eur_per_mw2是二次项系数cp0_eur是固定成本。runopp会求解一个以总发电成本最小为目标、满足潮流方程和电压/线路容量约束的最优问题。结果res_gen里的 p_mw 不是初始值而是优化后的出力。如果两处发电机成本不同优化结果一定是让成本低的发电机多出力。5.2 批量场景参数扫描与 pandas 联动实际工作中经常要做参数扫描比如负荷从 50% 涨到 150%看电压如何变化。pandapower 的数据模型决定了这种扫描写起来很舒服不需要反复建模型改一个列就行。import pandas as pd load_p [0.5, 0.75, 1.0, 1.25, 1.5] rows [] for i, scale in enumerate(load_p): # 重新设置 load scaling 列 net.load[scaling] scale pp.runpp(net) min_vm_pu net.res_bus[vm_pu].min() max_loading pd.concat( [net.res_line[loading_percent], net.res_trafo[loading_percent]] ).max() rows.append({case: i, scaling: scale, min_vm_pu: round(min_vm_pu, 4), max_loading_percent: round(max_loading, 2)}) df_result pd.DataFrame(rows) print(df_result)这个循环里每次只修改net.load[scaling]的值不用重新建网。每轮跑完runpp后把最小电压和最大负载率记下来。这样一张表就能看出哪个负荷水平下电压越限或线路过载。跑完后用 matplotlib 画一条电压随负荷变化的曲线能直接贴进报告。pandapower.plotting也内置了类似 simple_plot 的功能可以直接显示网络拓扑和结果。5.3 提取结果res_bus 和 res_line 里的关键列结果数据都在res_*前缀的表里但不同版本对某些列名做了调整建议先把表格的列检查一遍再使用print(net.res_bus.columns.tolist()) print(net.res_line.columns.tolist()) print(net.res_trafo.columns.tolist())输出结果里最常用的列有DataFrame关键列含义res_busvm_pu, va_degree电压幅值标幺值、相角度res_lineloading_percent, i_ka线路负载率、电流kAres_trafoloading_percent, vm_hv_pu, vm_lv_pu变压器负载率、高压侧/低压侧电压标幺值res_loadp_mw, q_mvar实际有功、无功消耗scaling 已生效res_load显示的 p_mw 是考虑了 scaling 之后的值不是原始填表值。如果你填了 scaling1.2结果表里会显示放大的功率。反过来说验证网络建模是否正确时也应该用 res_load 而不是 net.load。这也解释了为什么很多人在对比结果时发现对不上账因为他们拿原始负荷值跟结果表比忘了 scaling 这个变量。6. 验证结果不靠感觉三条实用技巧第一检查有功功率平衡。电网运行必须满足供给等于需求加上网损。手动计算所有 gen 出力之和减去所有 load 消耗之和结果应该等于全网的电阻损耗。电阻损耗可以从 net.res_line 的 pl_mw 列加总得到。如果一个带负荷的台区供电的所有线路损耗接近 0 或者负数说明网络模型有问题多半是线型选错导致 r_ohm_per_km 为 0。total_p_gen net.res_gen[p_mw].sum() net.res_ext_grid[p_mw].sum() total_p_load net.res_load[p_mw].sum() net.res_sgen[p_mw].sum() total_pl_loss net.res_line[pl_mw].sum() net.res_trafo[pl_mw].sum() print(发电机总出力:, total_p_gen) print(负荷总消耗:, total_p_load) print(网损:, total_pl_loss) print(差值:, total_p_gen - total_p_load - total_pl_loss)这个差值应该在 1e-6 量级如果差太多就回头查设备参数不要继续做下一步。第二孤立节点检测。上面用的pp.topology.simple_calc_graph可以检查拓扑连通性。在较大网络中一个不显眼的 bus 索引错误可以导致潮流结果偏离实际。把孤立节点找出来比肉眼盯 index 高效得多import pandapower.topology as top even top.calc_connected_components(net, bus_pqbus) print(组件数量:, len(even))如果组件数量大于 1说明有孤岛。配电网规划中除非是刻意设计的孤岛微网否则必须把每个 island 都通过变压器或线路连接起来否则潮流计算结果的物理意义就不成立。第三把结果导出到 excel 形成审计痕迹。在工程场景里结果不只要“算得对”还要“说得清”。pandapower 可以直接把结果写成 DataFrame再交给 pandas 导出with pd.ExcelWriter(powerflow_result.xlsx) as writer: net.res_bus.to_excel(writer, sheet_namebus) net.res_line.to_excel(writer, sheet_nameline) net.res_trafo.to_excel(writer, sheet_nametrafo) net.res_load.to_excel(writer, sheet_nameload)导出后的文件可以直接拿去和同事核对也能和旧版结果做 diff。如果你的计算场景需要频繁做这类对比还可以直接保存整个 net 对象pp.to_json(net, net_result.json)把 net 保存成 json 的好处是下次打开就能看到当时的模型和结果不必重新搭一次网络。这也特别适合在 Jupyter 里做研究时保留中间过程。本文还有配套的精品资源点击获取