如何正确地将 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'])
我目前有一个具有以下集合的具体模型:
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'])