如何结合Ecoinvent活动使用new_node与new_edge函数构建产品系统
如何结合Ecoinvent活动与Brightway的new_node/new_edge函数构建产品系统
核心问题说明
从Ecoinvent获取的Activity对象不能直接传入new_node函数,因为该函数需要的是键值对形式的属性参数,而非整个活动对象。你之前的尝试失败正是因为参数格式不匹配。
正确实现步骤
1. 将Ecoinvent活动属性复制到自定义数据库节点
需要把Ecoinvent活动的关键属性提取出来,以字典形式传给new_node,同时指定节点归属你的自定义数据库:
bd.projects.set_current("Simple_PS") db = bd.Database("SPS01") db.register() # 加载Ecoinvent数据库(替换为你的EI版本) ei_db = bd.Database("ecoinvent 3.9 cutoff") # 获取目标Ecoinvent活动 code_El_PT = ei_db.search("market for electricity, medium voltage PT")[0]["code"] act_El_PT = ei_db.get(code_El_PT) code_calcium_nitrate = ei_db.search("calcium nitrate production RER")[0]['code'] act_calcium_nitrate = ei_db.get(code_calcium_nitrate) # 创建主节点 data = { 'code': 'PS_main', 'name': 'PS_main', 'location': 'DK', 'unit': 'PS_main' } PS_main = db.new_node(**data) PS_main.save() # 复制电力活动属性到自定义节点 el_data = { 'code': act_El_PT['code'], 'name': act_El_PT['name'], 'location': act_El_PT['location'], 'unit': act_El_PT['unit'], 'database': db.name # 指定归属自定义数据库 } el_node = db.new_node(**el_data) el_node.save() # 复制硝酸钙活动属性到自定义节点 cn_data = { 'code': act_calcium_nitrate['code'], 'name': act_calcium_nitrate['name'], 'location': act_calcium_nitrate['location'], 'unit': act_calcium_nitrate['unit'], 'database': db.name } cn_node = db.new_node(**cn_data) cn_node.save()
2. 用new_edge链接节点构建产品系统
通过new_edge定义主节点与Ecoinvent节点的物料/能源流关系:
# 主节点消耗1单位电力 db.new_edge( input=el_node, output=PS_main, amount=1, unit=el_node['unit'] ).save() # 主节点消耗0.5单位硝酸钙 db.new_edge( input=cn_node, output=PS_main, amount=0.5, unit=cn_node['unit'] ).save()
之前尝试失败的原因
- Ex01:直接传入
act_El_PT(Activity对象)不符合new_node的参数要求,该函数仅接受关键字参数(键值对)。 - Ex02:参数顺序错误,
new_node不支持直接传入对象+名称的格式,必须用键值对指定属性。 - Ex03:
{act_El_PT}是集合类型,而非new_node需要的字典类型,参数格式完全不匹配。
额外提示
- 可以用
act_El_PT.as_dict()快速获取活动的所有属性字典,再筛选需要的字段:el_data = act_El_PT.as_dict() el_data = {k: el_data[k] for k in ['code', 'name', 'location', 'unit']} el_data['database'] = db.name el_node = db.new_node(**el_data) el_node.save() - 若无需复制节点,也可直接引用Ecoinvent活动作为
new_edge的input参数,但自定义产品系统中建议使用自有数据库节点统一管理。
内容的提问来源于stack exchange,提问作者Rafael Laurenti
相关产品推荐
相关产品推荐

