如何正确地将 excel table 中的数据分配给 python/pyomo 上的参数(具体模型)

How do I correctly assign data from an excel table to a parameter on python/pyomo (concrete model)

我目前有一个具有以下集合的具体模型:

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'])

我使用 pandas:

读取了 excel 数据
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' 进行了检查),但是当我尝试时:

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

它打印所有 m 和 p 的所有值,而不是 [m1, p2] 的值。这意味着参数无法区分关于集合的值。有人可以告诉我如何正确地做到这一点吗?

这可能是因为 df.iloc[0:4,1:25].values 给你的是一个 numpy 数组而不是字典。据我所知,Pyomo 使用字典来初始化参数并从字典键的每个索引处解释参数值。

对于 model.m X model.p.

中的所有索引,要初始化的参数需要看起来像 {('m1', 'p1'):val1, ('m1', 'p2'):val2, ...} 而不是 numpy 数组

否则,Pyomo 假设传递给 initialize 的 numpy 数组是您想要的每个索引。它无法从 numpy 数组中判断哪个值分配给哪个索引。

回答我自己的问题。

从excel读取数据后:

创建一个空字典:

Dict1 = dict()

迭代行(由 m 表示)和列(由 p 表示)并用值填充空字典:

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

注意m和p是临时指标;它们可以替换为行、列或您希望用来表示它们的任何内容。相反,df.index 表示行标题,df.columns 表示列标题。

用相关字典初始化参数:

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

通过打印参数的值进行测试:

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