访问 Brightway2 数据库对象中的交换数据

Accessing exchange data in Brightway2 database object

我对使用 Brightway 数据库对象访问交换数据有疑问。假设我有 import Brightway2 as bw 并且在一个有 LCI 数据库的项目中:

[In]  bw.databases
[Out] Brightway2 databases metadata with 2 objects:
          biosphere3
          ecoinvent 3_2 APOS    

我可以获取活动信息:

[In]  ei32 = bw.Database('ecoinvent 3_2 APOS')
      someActivity = ei32.get('00c71af952a1248552fc2bfa727bb6b5')
      someActivity
[Out] 'market for transport, freight, inland waterways, barge with reefer, cooling' (ton kilometer, GLO, None)

我似乎可以访问以下数据:

[In]   list(someActivity)
[Out]  ['database',
        'production amount',
        'name',
        'reference product',
        'classifications',
        'activity',
        'location',
        'filename',
        'parameters',
        'code',
        'authors',
        'paramters',
        'comment',
        'flow',
        'type',
        'unit',
        'activity type']

注意没有 'exchanges'。事实上,虽然这有效:

[In]   someActivity.get('location')
[Out]  'GLO'

或者,等价地:

[In]   someActivity['location']
[Out]  'GLO'

'location' 更改为 'exchanges' 不会产生任何结果(第一种语法)或键错误(第二种语法)。

然而 I have seen this syntax 在 Brightway 代码中:

exchanges = ds.get('exchanges', [])

目前,我访问交换数据的唯一方法是 .load 数据库(将整个数据库加载到字典中),创建一个 activity 键,然后按如下方式调用交换:

[In]  ei32Loaded = ei32.load()
      activities = sorted(ei32Loaded.keys())
      ei32Loaded[activities[42]]['exchanges']
[Out] [{'activity': '0fb6238a-e252-4d19-a417-c569ce5e2729', 'amount': xx,       
         ...}]

它工作正常,但我知道交换数据在数据库中,所以我确定一定有一种方法可以在不加载的情况下获取它。至少,我想知道为什么 someActivity.get('exchanges', []) 对我不起作用。 谢谢!

Brightway2 使用 SQLite 数据库来存储 LCI 数据(至少在大多数情况下 - 其他后端也是可能的,但 SQLite 是默认选项)。在 SQLite 数据库中,有两个表,ActivityDatasetExchangeDataset。一个 ActivityDataset 描述了供应链图中的一个对象(不严格限于转换活动),而 ExchangeDataset 描述了两个 ActivityDataset 之间的数值关系。查看他们的 schema definition.

当你使用Database('foo').get('bar')get_activity(('foo', 'bar')), you create an [Activity][2], which is a proxy object for interacting with the database. TheActivityobject exposes a number of useful methods, and handles some "magic" - for example, updating anActivity数据集时``也应该更新搜索索引,这是一个完全独立的数据库.

实例化 Activity 加载 ActivityDataset 行中的数据。对于可以包含的内容没有真正的要求或限制,但绝对不包含的一件事是交换。交易所延迟加载,即仅在需要时加载。

Activity 包含的一些有用方法是交换过滤器。例如,.technosphere() returns an iterator over all exchanges for which this Activity is the output, and the exchange type is technosphere. In LCA parlance, .technosphere() are the technosphere inputs for the activity. Similarly, .upstream() 公开了 消耗 这个 activity 的交换。 Activity还包括:

  • .exchanges():此activity为输出的所有交易所。
  • .biosphere():此 activity 为输出的所有交换,类型为 biosphere.
  • .production():此 activity 为输出的所有交换,类型为 production.

所有这些方法都是迭代器 - 它们在迭代之前不会从数据库中检索数据。这些也是 方法 ,而不是 activity 的 数据属性 ,即它们不像 foo['technosphere'] 那样被访问,而是foo.technosphere().

交换类型用于确定在 LCA 计算期间将数字交换值放置在矩阵中的位置和位置。

exchanges = ds.get('exchanges', []) 出现在 IO 库中的参考案例,数据正在导入和处理,但尚未被 ExchangeDataset 链接或存储在 SQLite 数据库中- 导入和处理库存数据时,数据是普通的 Python 字典,而不是 ActivityExchange 等的花哨组合