Первый аргумент component_objects()
должен быть типом компонента (например, Var
), а не компонентом (ie model.E_grid
). Вы можете использовать .items()
для итерации по IndexedComponent
.
Во-вторых, ошибка, которую вы видите, происходит из-за способа индексации кадра данных и установки значения на лету. Если вы просто хотите построить фрейм данных из значений переменных, может быть гораздо проще просто использовать dict-понимание и затем один из 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
Теперь вы можете выполнить постобработку фрейм данных, если вы хотите разделить индекс на мультииндекс.