内核死于 bw2analyzer.traverse_tagged_databases
Kernel dies with bw2analyzer.traverse_tagged_databases
根据 的建议,我在使用 bw2analyzer.traverse_tagged_databases
函数时遇到了一些问题。我想在标签上应用 bw2analyzer.traverse_tagged_databases
函数。我已经确保我正在评估的activity(下面的my_act
)有一个标签,然后一些输入交换有标签(但不是全部),一些输入交换输入交易所有标签(不是全部)。这是我所做的(省略了一些定义行):
import bw2analyzer as bw2analyzer
ipcc2013 = ('IPCC 2013', 'climate change', 'GWP 100a')
fu = {my_act:1}
lca_calc = bw.LCA(fu,ipcc2013)
lca_calc.lci()
lca_calc.lcia()
result, tree = bw2analyzer.traverse_tagged_databases(fu, ipcc2013, label='tag',default_tag='other')
当我这样做时,内核死机(确切消息:Kernel died, restarting
。我使用的是 Spyder v3.3.1、brightway2 v2.3、bw2analyzer v0.9.4)然后它会无限期地运行。我是否正确使用该功能?我缺少什么?那对你有用吗?感谢您的帮助!
我找到了一个解决方案,使 bw2analyzer.traverse_tagged_databases
函数在用于 ecoinvent 等大型数据库时可以正常工作。我通过实现计算深度(即应用递归函数的最大深度)并在达到深度时交替结果来重写 tagged.recurse_tagged_database
函数。这是我的代码(我从原来的函数中删除了一些行,因为我只使用一个数据库):
def recurse_tagged_database(activity, amount, method_dict, lca, label, default_tag, secondary_tags=[],product_system_depth=5):
from bw2data import get_activity
if isinstance(activity, tuple):
activity = get_activity(activity)
inputs = list(activity.technosphere())
if(product_system_depth > 0):
return {
'activity': activity,
'amount': amount,
'tag': activity.get(label) or default_tag,
'secondary_tags':[activity.get(t[0]) or t[1] for t in secondary_tags],
'impact': 0,
'biosphere': [{
'amount': exc['amount'] * amount,
'impact': exc['amount'] * amount * method_dict.get(exc['input'], 0),
'tag': exc.get(label) or activity.get(label) or default_tag,
'secondary_tags':[exc.get(t[0]) or activity.get(t[0]) or t[1] for t in secondary_tags]
} for exc in activity.biosphere()],
'technosphere': [recurse_tagged_database(exc.input, exc['amount'] * amount,
method_dict, lca, label,exc.get(label) or activity.get(label) or default_tag, secondary_tags,product_system_depth=product_system_depth-1)
for exc in inputs]
}
else:
return {
'activity': activity,
'amount': amount,
'tag': activity.get(label) or default_tag,
'secondary_tags':[activity.get(t[0]) or t[1] for t in secondary_tags],
'impact': redo_lca_score(lca,{activity:amount}),
'biosphere': [],
'technosphere': []
}
评论:
- 我在将递归函数应用于
exc.get(label) or activity.get(label) or default_tag
时更改了 default_tag
输入。事实上,就我而言,如果没有标签,我希望默认情况下将交换的影响关联到父 activity 的标签。
- 在我的例子中,深度 5 足以得到我想要的。这已经需要一些时间了。
根据 bw2analyzer.traverse_tagged_databases
函数时遇到了一些问题。我想在标签上应用 bw2analyzer.traverse_tagged_databases
函数。我已经确保我正在评估的activity(下面的my_act
)有一个标签,然后一些输入交换有标签(但不是全部),一些输入交换输入交易所有标签(不是全部)。这是我所做的(省略了一些定义行):
import bw2analyzer as bw2analyzer
ipcc2013 = ('IPCC 2013', 'climate change', 'GWP 100a')
fu = {my_act:1}
lca_calc = bw.LCA(fu,ipcc2013)
lca_calc.lci()
lca_calc.lcia()
result, tree = bw2analyzer.traverse_tagged_databases(fu, ipcc2013, label='tag',default_tag='other')
当我这样做时,内核死机(确切消息:Kernel died, restarting
。我使用的是 Spyder v3.3.1、brightway2 v2.3、bw2analyzer v0.9.4)然后它会无限期地运行。我是否正确使用该功能?我缺少什么?那对你有用吗?感谢您的帮助!
我找到了一个解决方案,使 bw2analyzer.traverse_tagged_databases
函数在用于 ecoinvent 等大型数据库时可以正常工作。我通过实现计算深度(即应用递归函数的最大深度)并在达到深度时交替结果来重写 tagged.recurse_tagged_database
函数。这是我的代码(我从原来的函数中删除了一些行,因为我只使用一个数据库):
def recurse_tagged_database(activity, amount, method_dict, lca, label, default_tag, secondary_tags=[],product_system_depth=5):
from bw2data import get_activity
if isinstance(activity, tuple):
activity = get_activity(activity)
inputs = list(activity.technosphere())
if(product_system_depth > 0):
return {
'activity': activity,
'amount': amount,
'tag': activity.get(label) or default_tag,
'secondary_tags':[activity.get(t[0]) or t[1] for t in secondary_tags],
'impact': 0,
'biosphere': [{
'amount': exc['amount'] * amount,
'impact': exc['amount'] * amount * method_dict.get(exc['input'], 0),
'tag': exc.get(label) or activity.get(label) or default_tag,
'secondary_tags':[exc.get(t[0]) or activity.get(t[0]) or t[1] for t in secondary_tags]
} for exc in activity.biosphere()],
'technosphere': [recurse_tagged_database(exc.input, exc['amount'] * amount,
method_dict, lca, label,exc.get(label) or activity.get(label) or default_tag, secondary_tags,product_system_depth=product_system_depth-1)
for exc in inputs]
}
else:
return {
'activity': activity,
'amount': amount,
'tag': activity.get(label) or default_tag,
'secondary_tags':[activity.get(t[0]) or t[1] for t in secondary_tags],
'impact': redo_lca_score(lca,{activity:amount}),
'biosphere': [],
'technosphere': []
}
评论:
- 我在将递归函数应用于
exc.get(label) or activity.get(label) or default_tag
时更改了default_tag
输入。事实上,就我而言,如果没有标签,我希望默认情况下将交换的影响关联到父 activity 的标签。 - 在我的例子中,深度 5 足以得到我想要的。这已经需要一些时间了。