Как правильно назначить данные из таблицы Excel параметру в python / pyomo (конкретная модель) - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть конкретная модель со следующими наборами:

model.m = Set(initialize= ['m1', 'm2', 'm3', 'm4'])
model.p = Set(initialize= ['p1','p2','p3','p4','p5','p6','p7','p8','p9','p10',\
                           'p11','p12','p13','p14','p15','p16','p17','p18','p19',\
                               'p20','p21','p22','p23','p24'])

Я читаю данные Excel, используя pandas:

df = pd.read_excel('data.xls', sheet_names= 'data1', )
df.head()

И теперь я пытаюсь назначить данные для параметра:

model.E1 = Param(model.m, model.p, initialize = df.iloc[0:4,1:25].values)

Это назначает значения отлично (я проверил, используя «печать»), но когда я пытаюсь:

print(model.E1['m1', 'p2'])

Он печатает все значения для всех m и p вместо значения для [m1, p2]. Это означает, что параметр не может различать guish значения по отношению к наборам. Пожалуйста, может кто-нибудь сказать мне, как это сделать правильно?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Отвечая на мой вопрос.

После прочтения данных из excel:

Создайте пустой словарь:

Dict1 = dict()

Перебирайте строки (обозначается как m) и столбцы (обозначенные p) и заполните пустой словарь значениями:

   for m in df.index:
        for p in df.columns:
            Dict1[m, p] = float(df[p][m])

Обратите внимание, что m и p являются временными индикаторами; они могут быть заменены строкой, столбцом или чем угодно, что вы можете обозначить как sh. Наоборот, df.index обозначает заголовки строк, а df.columns обозначает заголовки столбцов.

Инициализация параметра с помощью соответствующего словаря:

  model.E = Param(model.m, model.p, initialize = Dict1)

Проверка путем печати значения из параметра:

print(model.E['m1', 'p2'])
0 голосов
/ 12 февраля 2020

Это возможно потому, что df.iloc[0:4,1:25].values дает вам массив numpy, а не словарь. Насколько мне известно, Pyomo использует словарь для инициализации параметра и интерпретирует значение параметра в каждом индексе из словарных ключей.

Вместо массива numpy аргумент для инициализации должен выглядеть как {('m1', 'p1'):val1, ('m1', 'p2'):val2, ...} для всех индексов в model.m X model.p.

В противном случае Pyomo предполагает, что массив numpy, переданный в initialize, - это то, что вы хотите для каждого индекса. Из массива numpy он не может определить, какое значение присвоить какому индексу.

...