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

为Linopy模型新增变量后触发KeyError问题求助

解决PyPSA新增自定义变量触发KeyError的问题

问题根源

你推测的完全正确——PyPSA的优化模块在识别变量时,依赖components.py里注册的组件元信息。直接用全新变量名调用define_variables时,因为组件注册表中没有对应条目,内部找不到对应的存储属性,就会抛出KeyError。

正确的解决步骤

1. 先注册自定义变量对应的组件信息

在调用define_variables之前,必须先把新变量的组件信息注册到PyPSA的组件系统里。比如你要新增名为MyNewVar的变量,代码如下:

from pypsa.components import Component
import numpy as np

# 注册新组件
Component.add(
    "MyNewVar",  # 你的新变量名称
    list_name="my_new_vars",  # 内部存储用的列表名,会生成n.my_new_vars和n.my_new_vars_t属性
    attrs={
        # 可定义变量关联的属性,比如关联母线
        "bus": ["string", np.nan, "Bus", "母线关联"],
        # 格式为[类型, 默认值, 关联组件, 描述],可按需添加其他属性
    }
)

如果你的新变量是依附于现有组件(比如Generator)的扩展变量,没必要注册新组件,继续用你之前的attr参数方案更省事。只有完全独立的新变量才需要注册新组件。

2. 调用define_variables创建变量

注册完成后,再调用define_variables就不会报错了:

pypsa.optimization.compat.define_variables(
    n, 
    lb, 
    ub, 
    name="MyNewVar",  # 填刚注册的组件名
    axes=[n.snapshots, n.my_new_vars.index]  # 对应注册时list_name的索引
)

为什么临时方案能生效?

复用现有组件名(比如"Generator")时,PyPSA已经在组件注册表中有该组件的完整信息,attr参数只是在现有组件的变量集合里新增一个字段,不需要额外注册,所以不会触发查找失败的错误。

额外建议

  • 如果只是给现有组件加新变量,优先用attr参数的方式,不需要修改组件注册表,代码更简洁。
  • 注册新组件时,list_name的命名要注意——PyPSA内部会用这个名称拼接成{list_name}_t的属性,这是它查找变量的关键,必须和你调用时的逻辑对应上。

内容的提问来源于stack exchange,提问作者Edoardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:21:13