#pyomo
#пьомо
Вопрос:
Я пытаюсь создать ряд параметров из столбцов фреймов данных pandas, где индексом будут заданные элементы, именем столбца будет имя параметра, а значениями столбцов будут значения параметров. Есть ли какой-нибудь способ сделать это автоматически, а не по одному?
Примером может служить:
import pandas as pd
import numpy as np
from pyomo import environ as pe
model = pe.ConcreteModel()
df1 = pd.DataFrame(np.array([
[1, 5, 9],
[2, 4, 61],
[3, 24, 9]]),
columns=['p1', 'p2', 'p3'])
model.myset = pe.Set(initialize=df1.index.tolist())
def init1(myset, num):
return df1['p1'][num]
def init2(myset, num):
return df1['p2'][num]
def init3(myset, num):
return df1['p3'][num]
model.p1 = pe.Param(model.myset, initialize=init1)
model.p2 = pe.Param(model.myset, initialize=init2)
model.p3 = pe.Param(model.myset, initialize=init3)
Однако, чтобы сделать это более кратким, я хотел бы
a) используйте одну инициализацию функции для каждого столбца, передавая имя столбца (p1, p2 или p3) функции, и
б) не нужно выписывать новую строку для определения каждого параметра p1, p2, p3.
Кажется, что а) должно быть возможно (хотя я еще не понял как), но я не уверен насчет б). Я пробовал перебирать столбцы фрейма данных, но, насколько я могу судить, имена параметров pyomo должны быть объявлены явно.
Комментарии:
1. ваш фрейм данных …. является
p1
индексом? не имеет смысла делать то, что вы делаете,p1
поскольку оно имеет нечисловые значения2. Я отредактировал фрейм данных, чтобы он был числовым. Индекс фрейма данных будет содержать элементы, которые я хочу иметь в наборе.
Ответ №1:
Попробуйте что-то вроде этого….
Признайте, что я использовал тот же ваш фрейм данных, но я думаю, что вы пытались индексировать буквы {a, b, c}
, поэтому я просто сделал это индексом df и управляющим набором, оставив остальные 2 для ваших параметров. Если вы просто хотите разрешить pandas
автоматическое индексирование, вы можете использовать этот набор целых чисел для своего pyomo
индекса.
Кроме того, pyomo
ему нравятся словарные отношения для пары ключ: значение индексированных параметров, поэтому вам просто нужно записать pandas
серию в формате словаря, как показано на рисунке.
** отредактировано, чтобы ответить на ваш второй вопрос о создании экземпляров компонентов модели из столбцов с model.add_component()
помощью функции
import pandas as pd
import numpy as np
import pyomo.environ as pe
model = pe.ConcreteModel()
df1 = pd.DataFrame(np.array([
['a', 5, 9],
['b', 4, 61],
['c', 24, 9]]),
columns=['S', 'p1', 'p2'])
df1.set_index('S', inplace=True) # declare the index in the df
model.S = pe.Set(initialize=df1.index)
for c in df1.columns:
df1[c] = pd.to_numeric(df1[c]) # convert the numeric types in columns p1, p2
model.add_component(c, pe.Param(model.S, initialize=df1[c].to_dict(), within=pe.Reals))
model.pprint()
Дает:
1 Set Declarations
S : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {'a', 'b', 'c'}
2 Param Declarations
p1 : Size=3, Index=S, Domain=Reals, Default=None, Mutable=False
Key : Value
a : 5
b : 4
c : 24
p2 : Size=3, Index=S, Domain=Reals, Default=None, Mutable=False
Key : Value
a : 9
b : 61
c : 9
3 Declarations: S p1 p2