Установка значения по умолчанию для индексированного параметра pyomo

У меня есть фрейм данных, который выглядит следующим образом:

>data
         x     y
Name                              
A        NaN   0
B        65,2  NaN
C        NaN   100

Я создаю набор-объект pyomo m.index для индексации изменяемого объекта-параметра pyomo m.parameter_y.

m.index:

# code
m.index = pyomo.Set(
    initialize=data.index.get_level_values(0).unique(),
    doc='Index Set')

# output
(Pdb) m.index.pprint()
index : Index Set
    Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Mutable=True, Bounds=None
    ['A', 'B', 'C']

m.parameter_y:

# code
m.parameter_y = pyomo.Param(
    m.index,
    default=data['y'].values,
    mutable=True
    doc='Par y')

# output
(Pdb) m.parameter_y.pprint()
parameter_y : Par y
    Size=3, Index=index, Domain=Any, Default=None, Mutable=True
    Key : Value
    A   : [  0   nan   100. ]
    B   : [  0   nan   100. ]
    C   : [  0   nan   100. ]

Как вы можете видеть, используя default=df['y'].values, получает все значения столбца y как значение параметра.

Как мне установить значения изменяемого индексированного объекта-параметра pyomo, если я хочу ожидать следующего вывода?

(Pdb) m.parameter_y.pprint()
parameter_y : Par y
    Size=3, Index=index, Domain=Any, Default=None, Mutable=True
    Key : Value
    A   : [  0  ]
    B   : [ nan ]
    C   : [ 100 ]

PS: имейте в виду, что это не фактический фрейм данных, набор индексов или параметр. Поэтому такие ответы, как добавление значений каким-либо образом вручную, в моем случае не сработают. Что бы сработало, какая-то лучшая функция получения значения из фрейма данных, чтобы я мог установить эти значения для этого параметра по умолчанию.


person oakca    schedule 20.03.2018    source источник


Ответы (1)


Предполагая, что вы хотите, чтобы значения параметров были одноэлементными, а не списком, следующее должно работать:

m.parameter_y = pyomo.Param(
    m.index,
    default=data['y'].to_dict(),
    mutable=True
    doc='Par y')

Есть ли причина, по которой вы используете аргумент default вместо initialize?

person Bethany Nicholson    schedule 20.03.2018
comment
Я планирую изменить некоторые значения с помощью некоторых итераций цикла. Но некоторые ценности останутся нетронутыми. Инициализация, вероятно, сделает тот же трюк. Вы предлагаете мне использовать инициализацию вместо default, если да, то почему? Ps: Позже проверю ответ. Тай Бетани - person oakca; 21.03.2018
comment
Когда вы работаете с изменяемыми параметрами, не имеет значения, какие вы используете, но я думаю, что чаще всего используется initialize для вашего варианта использования. Если бы вы использовали неизменяемые Params, тогда была бы разница в поддержании разреженности, initialize автоматически создает любые индексы, для которых вы предоставляете значения, и default будет проверяться на наличие действительных индексов, которые не были созданы, но не будут создавать недостающие индексы. - person Bethany Nicholson; 21.03.2018