如何将结果从 Pyomo 变量导出到 Pandas 数据框和 excel?

How can I export results from a Pyomo variable to a Pandas dataframe and excel?

我在一个模型中有几个 Pyomo 变量,有些变量有三个索引。为了便于解释,我的变量之一是

model.E_grid = Var(model.i, model.m, model.p, within = NonNegativeReals)

三个索引分别是i,m,p。在 运行 模型之后,我想看到 E_grid 关于 pandas 数据帧中每个 i、m 和 p 的最终值(然后我可以将其导出到excel)。 因此,例如 [i1, m1, p1, 21.00]、[i1, m1, p2, 22.00] 等。我已经看到 "block" 方法试图一次导出所有变量(例如 https://or.stackexchange.com/questions/2708/pyomo-looping-over-a-variable-method),但它对我不起作用,因为一些变量只有 1 个索引。 如有任何帮助,我们将不胜感激!

编辑:这是我特别尝试过的

results_df = pd.DataFrame()
for v in model.component_objects(model.E_grid, active=True):
    for i, m, p in v:
        results_df.at[i,m,p, v.name] = value(v[i,m,p])

print(results_df) 

但我收到错误 ValueError:标量访问(设置)的索引器不足!

component_objects() 的第一个参数应该是组件类型(例如Var),而不是组件(即model.E_grid)。您可以使用 .items() 迭代 IndexedComponent.

其次,您看到的错误是由于索引数据帧和动态设置值的方式造成的。如果您只想从变量值构建数据框,那么只使用字典理解然后 pandas' 数据框构造函数之一可能会简单得多:

import pandas as pd
from pyomo.core import ConcreteModel, Set, NonNegativeReals, Var, value

model = ConcreteModel()
model.i = Set(initialize=[1, 2, 3])
model.m = Set(initialize=[4, 5, 6])
model.p = Set(initialize=[7, 8, 9])

model.E_grid = Var(model.i, model.m, model.p, within=NonNegativeReals, initialize=1)

E_grid_data = {(i, m, p, v.name): value(v) for (i, m, p), v in model.E_grid.items()}
df = pd.DataFrame.from_dict(E_grid_data, orient="index", columns=["variable value"])
print(df)
#                           variable value
# (1, 4, 7, E_grid[1,4,7])               1
# (1, 4, 8, E_grid[1,4,8])               1
# (1, 4, 9, E_grid[1,4,9])               1
# (1, 5, 7, E_grid[1,5,7])               1
# (1, 5, 8, E_grid[1,5,8])               1
# (1, 5, 9, E_grid[1,5,9])               1

如果您想将索引拆分为多索引,您现在可以 post 处理数据帧。