2016-04-10 11 views
0

Brightwayデータベースオブジェクトを使用して交換データにアクセスすることについて質問があります。私はimport Brightway2 as bwを持ち、LCIデータベースがあるプロジェクトで午前と仮定します。Brightway2データベースオブジェクトの交換データへのアクセス

[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' 

または、同等:'exchanges'ため'location'を変更

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

は何も(最初の構文)またはキーエラー(2番目の構文)を得ません。

そしてBrightwayコードでまだI have seen this syntax:今のところ

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

、Exchangeデータにアクセスするための私の唯一の方法は.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', [])が私にとってうまくいかない理由を知りたいのですが。 ありがとう!

答えて

1

Brightway2は、SQLiteデータベースを使用してLCIデータを格納します(ほとんどの場合、他のバックエンドも可能ですが、SQLiteがデフォルトのオプションです)。 SQLiteデータベースには、ActivityDatasetExchangeDatasetの2つのテーブルがあります。 ActivityDatasetは、サプライチェーングラフのオブジェクト(厳密には変換アクティビティに限定されない)を記述し、ExchangeDatasetは、2つの数値の間の数値関係を記述する。ActivityDatasetschema definitionを参照してください。

Database('foo').get('bar')またはget_activity(('foo', 'bar')), you create an [Activity][2], which is a proxy object for interacting with the database. Theアクティビティobject exposes a number of useful methods, and handles some "magic" - for example, updating an ActivityDataset``を使用すると、完全に別のデータベースである検索インデックスも更新する必要があります。

Activityをインスタンス化すると、ActivityDataset行にあるデータがロードされます。含まれるものには実際の要件や制限はありませんが、含まれていないものは交換です。交換は遅延して、すなわち必要なときにのみ行われる。

Activityが含む有用な方法には、交換フィルターがあります。たとえば、.technosphere()は、このActivityoutputであり、交換タイプがtechnosphereであるすべての交換に関するイテレータを返します。 LCA用語では、.technosphere()はアクティビティのテクノスフェア入力です。同様に、.upstream()は交換を公開しています。です。Activityには、以下も含まれます。

  • .exchanges():このアクティビティが出力であるすべてのエクスチェンジ。
  • .biosphere():このアクティビティが出力され、そしてタイプbiosphereのものであるすべてのやり取り。
  • .production():このアクティビティが出力され、そしてタイプproductionのものであるすべてのやり取り。

これらのメソッドはすべてイテレータです。繰り返し処理されるまで、データはデータベースから取得されません。これらはまた、方法ないデータ、すなわち、それらがfoo['technosphere']ようにアクセスされていない、活動の属性、むしろfoo.technosphere()あります。

交換タイプは、場所を決定するために使用される数値交換値は、LCA計算中に配置される行列です。

exchanges = ds.get('exchanges', [])は、データがインポートされ処理されるが、ExchangeDatasetによってまだリンクされていないか、またはSQLiteデータベースにまったく格納されていないIOライブラリに表示されます。インベントリデータのインポートおよび処理時には、データは普通のPython辞書であり、Activitys、Exchangesなどの素晴らしい組み合わせではありません。

+0

私は特定の交換を念頭に置いています(例えば、私は 'input'と' output'が何であるか知っています)交換を直接 "取得"する機能はありますか?今、私はこれを、(1) 'output'で参照されているアクティビティを' get'する、(2) 'input'が一致するまですべてのエクスチェンジを繰り返すことで行います。 – MPa

+0

入出力による交換を行うための明視野の機能はありません。まず第一に、同じ入力と出力を持つ複数の交換が可能です。しかし、 'bw2data.backends.default.schema'から' ExchangeDataset'をインポートし、それを直接照会することができます。 –

関連する問題