0

我有一个关于使用 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'for'exchanges'不会产生任何结果(第一种语法)或关键错误(第二种语法)。

然而在 Brightway 代码看到了这种语法:

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

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

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

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

4

1 回答 1

1

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

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

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

一些有用的方法Activity包括交换过滤器。例如,.technosphere()返回一个迭代器,它遍历所有的交换器,它Activityoutput,交换器类型是technosphere。用 LCA 的说法,.technosphere()是活动的技术领域输入。同样,.upstream()公开了消耗此活动的交换。Activity还包括:

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

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

交换类型用于确定在 LCA 计算期间将数字交换值放置在何处以及放置在哪些矩阵中。

引用的情况 whereexchanges = ds.get('exchanges', [])出现在 IO 库中,正在导入和处理数据,但尚未通过ExchangeDatasets 链接或根本存储在 SQLite 数据库中 - 在导入和处理库存数据时,数据是一个普通的 Python 字典,而不是Activitys、Exchanges 等的花哨组合。

于 2016-04-11T07:32:53.367 回答