我在一个模型中有几个Pyomo变量,其中一些有三个指数。为了解释,我的一个变量是
model.E_grid = Var(model.i, model.m, model.p, within = NonNegativeReals)
这三个指数是i,m和p。在运行模型之后,我希望看到E_grid与熊猫数据中每一个i、m和p的最终值(这将允许我将其导出到excel)。例如,i1,m1,p1,21.00,i1,m1,p2,22.00等等。我已经看到了“块”方法,它尝试一次导出所有变量(例如https://or.stackexchange.com/questions/2708/pyomo-looping-over-a-variable-method),但是它对我不起作用,因为其中一些变量只有一个索引。任何帮助,这将是非常感谢!
编辑:这就是我特别尝试过的
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:没有足够的标量访问索引器(设置)!
发布于 2020-03-17 10:53:41
component_objects()
的第一个参数应该是组件类型(例如。( Var
),而不是组件(即model.E_grid
)。您可以使用.items()
在IndexedComponent
上迭代。
其次,您所看到的错误是由于对数据进行索引和动态设置值的方式。如果您只是想从变量值构建一个数据框架,那么只使用dict理解,然后使用pandas
的dataframe构造函数可能要简单得多:
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
如果要将索引拆分为多个索引,现在可以对数据进行后处理。
https://stackoverflow.com/questions/60620691
复制相似问题