Python, Pandas, Pyomo 根据索引改变形状

Python, Pandas, Pyomo change shape according to index

我已经编写了一个优化模型,现在我想为不同的变量生成一些输出文件 (xlsx)。我已经使用以下代码将变量的全部数据放在一个 DataFrame 中:

block_vars = []
for var in model.component_data_objects(Var):
    block_vars.append(var.parent_component())
block_vars = list(set(block_vars))
dc = {(str(bv).split('.')[0], str(bv).split('.')[-1], i): bv[i].value for bv in block_vars for i in getattr(bv, '_index')}
df = pd.DataFrame(list(dc.items()), columns=['tuple','value'])
df['variable_name'] = df['tuple'].str[-2]
df['variable_index'] = df['tuple'].str[-1]
df.drop('tuple', axis=1, inplace=True)

这很好用(尽管它可能不是最流畅的方式。

现在我用一个块过滤不同的变量,如下所示:

writer = pd.ExcelWriter('UC.xlsx')
conditions = {'variable_name':'vCommit'}
df_uc = df.copy()
df_uc = df_uc[(df_uc[list(conditions)] == pd.Series(conditions)).all(axis=1)].drop('variable_name', 1)
df_uc.to_excel(writer, 'Tabelle1')

这也行得通。现在是我正在努力的部分。 这些变量已编入索引(有 2 或 3 个索引,具体取决于变量),我希望输出类似于:

index1    index2    value
1         1         1
1         2         0
...

但是这些索引位于 DataFrame 一行的一个元组中,我不确定如何访问它们并相应地重塑 DataFrame。 有人知道这样做的方法吗?感谢您的帮助!!!

我会在第一次创建 DataFrame 时将索引扩展到多个列中。您可以尝试查看此处的代码以获取灵感:https://github.com/gseastream/pyomo/blob/fa9b8f20a0f9afafa7cbd4607baa8b4963a96f42/pyomo/repn/plugins/excel_writer.py

Grant 正在开发与 Excel 的接口,但开发重点转移到了其他地方。

此外,请注意:您可以使用 model.component_objects(Var) 而不是 list(set(block_vars))