You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:02:33