如何将多次迭代的pyomo解决方案(仅包括参数,objective和变量)写入excel/csv文件?
How to write pyomo solutions (including only parameters, objective and variables) of many iterations into excel/csv file?
我有一个带有可变参数的 pyomo 模型 "model.Prices"。使用 for 循环,模型能够迭代并找到最佳解决方案。但是我不知道如何将所有迭代的解决方案(包括参数值,objective,变量)写入excel/csv文件。
这是 for 循环
for RapeseedPrice in range(300, 600, 100):
# change the value of parameter model.Prices
model.Prices["rapeseed"] = RapeseedPrice
print("When price of rapeseed = {}".format(RapeseedPrice))
opt = SolverFactory('ipopt')
opt.solve(model, tee = True)
results = opt.solve
model.display()
如果我包含以下三个 for 循环,我可以访问我想要的所有值:
for RapeseedPrice in range(300, 600, 100):
# change the value of parameter model.Prices
model.Prices["rapeseed"] = RapeseedPrice
print("When price of rapeseed = {}".format(RapeseedPrice))
opt = SolverFactory('ipopt')
opt.solve(model, tee = True)
results = opt.solve
model.display()
for parmobject in model.component_objects(Param, active=True):
nametoprint = str(str(parmobject.name))
print ("Parameter ", nametoprint) # doctest: +SKIP
for index in parmobject:
vtoprint = value(parmobject[index])
print (" ",index, vtoprint) # doctest: +SKIP
for o in model.component_data_objects(Objective, active=True):
print(o, value(o))
for v in model.component_data_objects(Var, active=True):
print(v, value(v))
我希望一个 excel 文件具有不同的交互作为列和所有参数,objective,变量作为行。
it1 it2 it3
param 1
param 2
param 3
...
objective
var 1
var 2
var 3
...
像这样的东西应该可以将您的值放入 Pandas DataFrame 并且从那里很容易输出到 csv 文件:
from pyomo.environ import *
import pandas as pd
m = ConcreteModel()
m.s = Set(initialize=[1,2,3])
m.p = Param(initialize=1, mutable=True)
m.x = Var(m.s, bounds=(1,3))
m.obj = Objective(expr=m.p*sum(m.x[k]**2 for k in m.s))
solver = SolverFactory('ipopt')
all_data={}
for j in range(1,4):
m.p = j
solver.solve(m)
data = {}
for i in m.component_data_objects(Param):
data[i.name] = value(i)
for i in m.component_data_objects(Var):
data[i.name] = value(i)
for i in m.component_data_objects(Objective):
data[i.name] = value(i)
all_data['Solve '+str(j)] = pd.Series(data)
df = pd.DataFrame(all_data)
让我回答我自己的问题。
为此我们需要导入:
import pandas as pd
import numpy as np
from copy import deepcopy
首先,你需要得到headers:
header0 = []
header1 = []
for parmobject in model.component_objects(Param, active=True):
nametoprint = str(str(parmobject.name))
for index in parmobject:
header0.append(nametoprint)
header1.append(index)
for o in model.component_data_objects(Objective, active=True):
header0.append("Objective")
header1.append(str(o.name))
for v in model.component_data_objects(Var, active=True):
header0.append("Variable")
header1.append(str(v.name))
MultiHeaders = [header0, header1]
其次,您必须获取值:
AllData = []
pov_data = []
for RapeseedPrice in range(100, 500, 100):
model.Prices['rapeseed'] = RapeseedPrice
# solve the model
opt.solve(model)
# access pov_dat
for parmobject in model.component_objects(Param, active=True):
for index in parmobject:
vtoprint = value(parmobject[index])
pov_data.append(vtoprint)
for o in model.component_data_objects(Objective, active=True):
pov_data.append(value(o))
for v in model.component_data_objects(Var, active=True):
pov_data.append(value(v))
AllData.append(deepcopy(pov_data))
pov_data.clear()
第三,将您的数据与 headers 合并到一个数据框中:
CDFarm_results = pd.DataFrame(data = np.array(AllData), columns =
MultiHeaders)
最后,将数据框保存到 excel 文件中。
writer = pd.ExcelWriter('CDFarm_results_pandas.xlsx', engine='xlsxwriter')
CDFarm_results.to_excel(writer, 'Sheet1')
writer.save()
请看我的要点:此脚本能够将所有参数、目标和变量的名称和值保存到 excel 文件中 my-gist-link
我有一个带有可变参数的 pyomo 模型 "model.Prices"。使用 for 循环,模型能够迭代并找到最佳解决方案。但是我不知道如何将所有迭代的解决方案(包括参数值,objective,变量)写入excel/csv文件。
这是 for 循环
for RapeseedPrice in range(300, 600, 100):
# change the value of parameter model.Prices
model.Prices["rapeseed"] = RapeseedPrice
print("When price of rapeseed = {}".format(RapeseedPrice))
opt = SolverFactory('ipopt')
opt.solve(model, tee = True)
results = opt.solve
model.display()
如果我包含以下三个 for 循环,我可以访问我想要的所有值:
for RapeseedPrice in range(300, 600, 100):
# change the value of parameter model.Prices
model.Prices["rapeseed"] = RapeseedPrice
print("When price of rapeseed = {}".format(RapeseedPrice))
opt = SolverFactory('ipopt')
opt.solve(model, tee = True)
results = opt.solve
model.display()
for parmobject in model.component_objects(Param, active=True):
nametoprint = str(str(parmobject.name))
print ("Parameter ", nametoprint) # doctest: +SKIP
for index in parmobject:
vtoprint = value(parmobject[index])
print (" ",index, vtoprint) # doctest: +SKIP
for o in model.component_data_objects(Objective, active=True):
print(o, value(o))
for v in model.component_data_objects(Var, active=True):
print(v, value(v))
我希望一个 excel 文件具有不同的交互作为列和所有参数,objective,变量作为行。
it1 it2 it3
param 1
param 2
param 3
...
objective
var 1
var 2
var 3
...
像这样的东西应该可以将您的值放入 Pandas DataFrame 并且从那里很容易输出到 csv 文件:
from pyomo.environ import *
import pandas as pd
m = ConcreteModel()
m.s = Set(initialize=[1,2,3])
m.p = Param(initialize=1, mutable=True)
m.x = Var(m.s, bounds=(1,3))
m.obj = Objective(expr=m.p*sum(m.x[k]**2 for k in m.s))
solver = SolverFactory('ipopt')
all_data={}
for j in range(1,4):
m.p = j
solver.solve(m)
data = {}
for i in m.component_data_objects(Param):
data[i.name] = value(i)
for i in m.component_data_objects(Var):
data[i.name] = value(i)
for i in m.component_data_objects(Objective):
data[i.name] = value(i)
all_data['Solve '+str(j)] = pd.Series(data)
df = pd.DataFrame(all_data)
让我回答我自己的问题。
为此我们需要导入:
import pandas as pd
import numpy as np
from copy import deepcopy
首先,你需要得到headers:
header0 = []
header1 = []
for parmobject in model.component_objects(Param, active=True):
nametoprint = str(str(parmobject.name))
for index in parmobject:
header0.append(nametoprint)
header1.append(index)
for o in model.component_data_objects(Objective, active=True):
header0.append("Objective")
header1.append(str(o.name))
for v in model.component_data_objects(Var, active=True):
header0.append("Variable")
header1.append(str(v.name))
MultiHeaders = [header0, header1]
其次,您必须获取值:
AllData = []
pov_data = []
for RapeseedPrice in range(100, 500, 100):
model.Prices['rapeseed'] = RapeseedPrice
# solve the model
opt.solve(model)
# access pov_dat
for parmobject in model.component_objects(Param, active=True):
for index in parmobject:
vtoprint = value(parmobject[index])
pov_data.append(vtoprint)
for o in model.component_data_objects(Objective, active=True):
pov_data.append(value(o))
for v in model.component_data_objects(Var, active=True):
pov_data.append(value(v))
AllData.append(deepcopy(pov_data))
pov_data.clear()
第三,将您的数据与 headers 合并到一个数据框中:
CDFarm_results = pd.DataFrame(data = np.array(AllData), columns =
MultiHeaders)
最后,将数据框保存到 excel 文件中。
writer = pd.ExcelWriter('CDFarm_results_pandas.xlsx', engine='xlsxwriter')
CDFarm_results.to_excel(writer, 'Sheet1')
writer.save()
请看我的要点:此脚本能够将所有参数、目标和变量的名称和值保存到 excel 文件中 my-gist-link