从 Brightway2 中的 MultiLCA 结果创建数据框
Create a dataframe from MultiLCA results in Brightway2
我正在尝试根据 MultiLCA 计算的结果创建一个 pandas 数据框,将方法用作列,将功能单元用作行。我确实找到了一种解决方案,但是有点麻烦(我不太会字典)
...
mlca=MultiLCA("my_calculation_setup")
pd.DataFrame(mlca.results,columns=mlca.methods)
fu_names=[]
for d in mlca.func_units:
for key in d:
fu_names.append(str(key))
dfresults['fu']=fu_names
dfresults.set_index('fu',inplace=True)
有没有更优雅的方式来做到这一点?名字也很长,但就是另外一回事了...
我觉得你的代码比较优雅。如果你想坚持使用 str(key)
,那么你可以通过列表理解来简化它:
mlca=MultiLCA("my_calculation_setup")
dfresults = pd.DataFrame(mlca.results, columns=mlca.methods)
dfresults['fu'] = [str(key) for demand in mlca.func_units for key in demand]
dfresults.set_index('fu', inplace=True)
请注意,这仅在您的需求词典各有一个 activity 时才有效。您可能会遇到这样的情况,一个需求字典有两个活动(例如 LCA({'foo': 1, 'bar': 2})
),这会失败,因为 fu
列表中的元素太多。
如果您知道每个需求只有一个 activity,那么您可以制作一个稍微好一点的数据框,如下所示:
mlca=MultiLCA("my_calculation_setup")
scores = pd.DataFrame(mlca.results, columns=mlca.methods)
as_activities = [
(get_activity(key), amount)
for dct in mlca.func_units
for key, amount in dct.items()
]
nicer_fu = pd.DataFrame(
[
(x['database'], x['code'], x['name'], x['location'], x['unit'], y)
for x, y in as_activities
],
columns=('Database', 'Code', 'Name', 'Location', 'Unit', 'Amount')
)
nicer = pd.concat([nicer_fu, scores], axis=1)
但是,在一般情况下,数据帧并不是计算设置的完美匹配。当需求字典有多个活动时,没有很好的方法将其 "squish" 变成一维或一行。
我正在尝试根据 MultiLCA 计算的结果创建一个 pandas 数据框,将方法用作列,将功能单元用作行。我确实找到了一种解决方案,但是有点麻烦(我不太会字典)
...
mlca=MultiLCA("my_calculation_setup")
pd.DataFrame(mlca.results,columns=mlca.methods)
fu_names=[]
for d in mlca.func_units:
for key in d:
fu_names.append(str(key))
dfresults['fu']=fu_names
dfresults.set_index('fu',inplace=True)
有没有更优雅的方式来做到这一点?名字也很长,但就是另外一回事了...
我觉得你的代码比较优雅。如果你想坚持使用 str(key)
,那么你可以通过列表理解来简化它:
mlca=MultiLCA("my_calculation_setup")
dfresults = pd.DataFrame(mlca.results, columns=mlca.methods)
dfresults['fu'] = [str(key) for demand in mlca.func_units for key in demand]
dfresults.set_index('fu', inplace=True)
请注意,这仅在您的需求词典各有一个 activity 时才有效。您可能会遇到这样的情况,一个需求字典有两个活动(例如 LCA({'foo': 1, 'bar': 2})
),这会失败,因为 fu
列表中的元素太多。
如果您知道每个需求只有一个 activity,那么您可以制作一个稍微好一点的数据框,如下所示:
mlca=MultiLCA("my_calculation_setup")
scores = pd.DataFrame(mlca.results, columns=mlca.methods)
as_activities = [
(get_activity(key), amount)
for dct in mlca.func_units
for key, amount in dct.items()
]
nicer_fu = pd.DataFrame(
[
(x['database'], x['code'], x['name'], x['location'], x['unit'], y)
for x, y in as_activities
],
columns=('Database', 'Code', 'Name', 'Location', 'Unit', 'Amount')
)
nicer = pd.concat([nicer_fu, scores], axis=1)
但是,在一般情况下,数据帧并不是计算设置的完美匹配。当需求字典有多个活动时,没有很好的方法将其 "squish" 变成一维或一行。