Ядро умирает с bw2analyzer.traverse_tagged_database
У меня возникли некоторые проблемы с использованием bw2analyzer.traverse_tagged_databases
Функция основана на рекомендациях этого ответа. Я хотел бы применить bw2analyzer.traverse_tagged_databases
функция на тегах. Я гарантировал, что деятельность, которую я оцениваю (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), а затем он работает бесконечно. Я правильно использую функцию? Чего мне не хватает? Это работает для вас? Спасибо за помощь!
1 ответ
Я нашел решение, чтобы сделать 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': []
}
Комментарии:
- Я изменил
default_tag
входы при применении рекурсивной функции кexc.get(label) or activity.get(label) or default_tag
, Действительно, в моем случае я хочу, чтобы воздействия бирж по умолчанию были связаны с тегом родительской активности, если тега нет. - В моем случае глубины 5 достаточно, чтобы получить то, что я хочу. Это уже занимает некоторое время.