【问题标题】:Append model output to pd df rows将模型输出附加到 pd df 行
【发布时间】:2018-08-08 20:01:02
【问题描述】:

我正在尝试将 Pyomo 模型输出放入 pandas.DataFrame 行。我现在通过将数据保存为.csv,然后将.csv 文件读取为DataFrame 来完成它。我想跳过.csv 步骤,直接将输出放入DataFrame

当我使用 Pyomo 完成优化解决方案时,最佳分配是model.x[i] 输出数据中的1(否则为0)。 model.x[i]dict 中的 v 键索引。 model.xPyomo 的特定语法

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

【问题讨论】:

  • 在您尝试编写它们之前,我没有看到 timeItemplatItempayItemdemItem 定义;是吗?

标签: python pandas append pyomo


【解决方案1】:

我不知道您发布的代码中的 timeItem 等可迭代项中有什么。但是,我怀疑类似于:

import pandas as pd
results = pd.DataFrame([timeItem, platItem, payItem, demItem, v], index=["time", "plat", "pay", "dem", "v"]).T

会起作用的。

如果要过滤model.x中的1s,也可以将其添加为列,并直接使用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]

【讨论】:

  • 非常感谢,斯科特!我从您那里得到了一些非常好的想法,例如在 df 中包含 0 并使其可供分析。结果 Pyomo 索引 model.x 输出的方式,我不得不使用 Qi Chen 的方法进行迭代。非常感谢。
【解决方案2】:

你也可以使用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'])

【讨论】:

  • 谢谢启辰!这让我现在走了,我学到了很多东西。包含有关整数容差的信息的好方法,我不知道。你的慷慨令人钦佩,我非常感激。
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 2020-02-27
  • 1970-01-01
  • 2021-11-07
  • 2017-03-20
  • 2011-12-04
相关资源
最近更新 更多