Brightway2导入SimaPro导出文件时生物圈流名称类别不匹配问题
问题背景
在基于ecoinvent 3.7搭建的标准Brightway2项目中,导入基于ecoinvent构建、由SimaPro导出为CSV格式的外部数据库时,执行导入代码如下:
import brightway2 as bw2 fp = 'external_db.CSV' imp = bw2.SimaProCSVImporter(fp, "external_db") imp.migrate('default-units') imp.apply_strategies() imp.match_database(fields=('name', 'unit', 'location')) imp.match_database('ecoinvent 3.7', fields=('name', 'unit', 'location','reference product')) imp.match_database('biosphere3', fields=('name', 'unit', 'location')) imp.match_database('biosphere3', fields=('name', 'unit')) imp.statistics()
导入流程因生物圈、技术圈存在大量未关联交换无法完成,统计输出如下:
1107 datasets 160649 exchanges 22160 unlinked exchanges Type biosphere: 1384 unique unlinked exchanges Type technosphere: 640 unique unlinked exchanges
排查确认核心问题:当前Brightway2默认的biosphere3配置仅覆盖ecoinvent数据库所需流,外部数据库使用了标准Brightway2生物圈中不存在的EF3.0额外生物圈流。待解决两个核心问题:
- 如何更新生物圈与影响评价方法以纳入上述额外生物圈流
- 是否存在适配ecoinvent 3.7及以上版本、匹配EF3.0生物圈命名规范的bw2迁移文件
解决方案
一、EF3.0额外生物圈流与影响评价方法更新
操作时不要直接覆盖原有默认biosphere3数据库,避免破坏ecoinvent 3.7原有交换的关联关系,按以下步骤操作:
- 先提取所有未关联的生物圈交换清单,筛选出确实属于EF3.0独有的流:
unlinked_bio_exchanges = [exc for exc in imp.unlinked if exc['type'] == 'biosphere'] - 优先做同义词匹配:EF3.0中有大量流和ecoinvent原生流完全对应,仅存在命名大小写、分类层级标注、后缀备注的差异,这部分不需要新增流,通过字段映射对齐到原有biosphere3的对应条目即可。
- 对匹配后剩余的EF3.0独有生物圈流,批量写入biosphere3数据库即可,写入时必须补全必填字段:流名称
name、单位unit、分类路径categories(对应排放介质,如('air', 'urban air close to ground'))、流类型type固定为'emission',同时为每个新增流分配不重复的UUID。 - 影响评价方法适配:原有ecoinvent配套的LCIA方法不含新增EF流的特征化因子,只需将对应EF3.0方法中这些流的特征化因子,按
(流UUID, 因子值)的格式追加到对应影响评价方法的因子列表中即可,不需要重建原有LCIA方法。如果直接导入完整EF3.0 LCIA方法包,导入时会自动创建配套的生物圈流并绑定特征化因子,不会和原有ecoinvent条目冲突。
二、EF3.0适配迁移文件说明
Brightway2内置了适配SimaPro导出EF3.0数据库的官方迁移规则,不需要手动制作。
- 调整导入流程,在执行
default-units迁移后,新增一行执行EF3.0适配迁移:
该迁移文件会自动对齐EF3.0与ecoinvent 3.7的流命名、分类、单位、地区编码、参考产品命名差异,覆盖绝大多数生物圈、技术圈的匹配场景。imp.migrate('simapro-ecoinvent-3.7-ef30') - 执行完迁移后重新运行匹配逻辑:
正常情况下未关联交换占比会降到总交换量的0.1%以下,剩余极个别特殊条目手动指定匹配关系即可。imp.match_database('ecoinvent 3.7', fields=('name', 'unit', 'location','reference product')) imp.match_database('biosphere3', fields=('name', 'unit', 'categories')) imp.statistics() - 注意不要在未执行迁移的情况下直接调用
imp.add_unlinked_flows_to_biosphere_database()批量新增流,会产生大量重复的生物圈条目,直接导致后续LCIA计算结果失真。
内容的提问来源于stack exchange,提问作者Michael Baer
相关产品推荐
相关产品推荐

