构建ecoinvent产品系统后LCA报EmptyBiosphere错误的排查
问题描述
我通过创建ecoinvent活动的节点和边,构建了一个简单的产品系统,代码如下:
# fetching EI activities of interest 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) # reference flow / assembly data = { 'code': 'PS_main', 'name': 'PS_main', 'location': 'DK', 'unit': 'PS_main' } PS_main = db.new_node(**data) PS_main.save() # create nodes el_data = { 'code': act_El_PT['code'], 'name': act_El_PT['name'], 'location': act_El_PT.get('location', ''), # Handle potential missing location 'unit': act_El_PT.get('unit', '') # Handle potential missing unit } el = db.new_node(**el_data) el.save() calcium_nitrate_data = { 'code': act_calcium_nitrate['code'], 'name': act_calcium_nitrate['name'], 'location': act_calcium_nitrate.get('location', ''), # Handle potential missing location 'unit': act_calcium_nitrate.get('unit', '') # Handle potential missing unit } calcium_nitrate = db.new_node(**calcium_nitrate_data) calcium_nitrate.save() ## Create edges PS_main.new_edge( amount=2.5, type='technosphere', input=el ).save() PS_main.new_edge( amount=2.5, type='technosphere', input=calcium_nitrate ).save()
随后尝试执行LCA计算,代码如下:
## LCA gw_method = ('EF v3.1', 'climate change', 'global warming potential (GWP100)') lca = bc.LCA(demand={PS_main: 1}, method=gw_method) lca.lci() lca.lcia() lca.score
但出现了EmptyBiosphere报错,我的项目已加载以下数据库:
Databases dictionary with 3 object(s): SPS01 biosphere3 ecoinvent 3.10_cutoff_ecoSpold02
错误原因与解决方法
错误原因
你手动创建的el和calcium_nitrate节点仅复制了ecoinvent活动的元数据(名称、编码、位置等),但未关联原ecoinvent数据库中这些活动的完整供应链(包括生物圈流)。这些新节点本质是空的,没有任何输入输出关系,导致LCA计算时无法找到任何生物圈相关数据,从而触发EmptyBiosphere错误。
修正后的代码
不需要在自己的数据库中新建节点,直接引用ecoinvent数据库返回的活动对象即可,修改后代码如下:
# 获取ecoinvent数据库实例 ei_db = databases['ecoinvent 3.10_cutoff_ecoSpold02'] # 直接获取目标活动对象 act_El_PT = ei_db.search("market for electricity, medium voltage PT")[0] act_calcium_nitrate = ei_db.search("calcium nitrate production RER")[0] # 创建自定义产品系统节点 data = { 'code': 'PS_main', 'name': 'PS_main', 'location': 'DK', 'unit': 'PS_main' } PS_main = db.new_node(**data) PS_main.save() # 直接关联ecoinvent活动作为输入边 PS_main.new_edge( amount=2.5, type='technosphere', input=act_El_PT ).save() PS_main.new_edge( amount=2.5, type='technosphere', input=act_calcium_nitrate ).save() # 执行LCA计算 gw_method = ('EF v3.1', 'climate change', 'global warming potential (GWP100)') lca = bc.LCA(demand={PS_main: 1}, method=gw_method) lca.lci() lca.lcia() print(lca.score)
关键说明
- ecoinvent数据库返回的活动对象本身包含完整的上下游供应链、生物圈流等关联数据,直接引用即可保留这些关系。
- 你之前的操作相当于在自己的
SPS01数据库中创建了两个孤立的空节点,和原ecoinvent活动没有任何数据关联,因此无法支持LCA计算所需的生物圈流调用。
内容的提问来源于stack exchange,提问作者Rafael Laurenti
相关产品推荐
相关产品推荐

