我正在尝试将Pyomo
模型输出放入pandas.DataFrame
行中。我现在通过将数据另存为.csv
,然后将.csv
文件读取为DataFrame
来完成它。我想跳过.csv
步骤,将输出直接放入DataFrame
。
当我用Pyomo完成优化解决方案时,最优分配是在1
输出数据中的model.x[i]
(否则为0
)。 model.x[i]
由dict
中的v
键索引。 model.x
是Pyomo
Pyomo
为表示最佳解决方案的每个值分配一个timeItem[i]
,platItem[i]
,payItem[i]
,demItem[i]
,v[i]
。 0807results.csv
文件会生成一个准确的最佳分配文件,显示每个文件的timeItem[i]
,platItem[i]
,payItem[i]
,demItem[i]
,v[i]
的值最优解中的有效分配。
当model.x[i]
为1
时,如何直接获得timeItem[i]
,platItem[i]
,payItem[i]
,demItem[i]
,v[i]
变成DataFrame
?非常感谢您的协助。我当前的代码如下。
index=sorted(v.keys())
with open('0807results.csv', 'w') as f:
for i in index:
if value(model.x[i])>0:
f.write("%s,%s,%s,%s,%s\n"%(timeItem[i],platItem[i],payItem[i], demItem[i],v[i]))
from pandas import read_csv
now = datetime.datetime.now()
dtg=(now.strftime("%Y%m%d_%H%M"))
df = read_csv('0807results.csv')
df.columns = ['Time', 'Platform','Payload','DemandType','Value']
# convert payload types to string so not summed
df['Payload'] = df['Payload'].astype(str)
df = df.sort_values('Time')
df.to_csv('results'+(dtg)+'.csv')
# do stats & visualization with pandas df
答案 0 :(得分:0)
我不知道您发布的代码中timeItem
等可迭代项中的内容。但是,我怀疑类似的内容:
import pandas as pd
results = pd.DataFrame([timeItem, platItem, payItem, demItem, v], index=["time", "plat", "pay", "dem", "v"]).T
会工作的。
如果要在1
中的model.x
上进行过滤,则也可以将其添加为列,并直接使用pandas
进行过滤:
import pandas as pd
results = pd.DataFrame([timeItem, platItem, payItem, demItem, v, model.x], index=["time", "plat", "pay", "dem", "v", "x"]).T
filtered_results = results[results["x"]>0]
答案 1 :(得分:0)
您还可以使用DataFrame.from_records()
函数:
def record_generator():
for i in sorted(v.keys()):
if value(model.x[i] > 1E-6): # integer tolerance
yield (timeItem[i], platItem[i], payItem[i], demItem[i], v[i])
df = pandas.DataFrame.from_records(
record_generator(), columns=['Time', 'Platform', 'Payload', 'DemandType', 'Value'])