Определение параметров pyomo из столбцов фрейма данных

#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