Brightway2: как получить определенную активность по имени - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок во всем этом, поэтому наберитесь терпения.

Я инициализировал новую установку BW2 и добавил базу данных Ecoinvent (некоторые данные обрезаны для ясности):

>>> from brightway2 import bw2setup, Database, SingleOutputEcospold2Importer
>>> bw2setup()
>>> ei = SingleOutputEcospold2Importer('/path/to/datasets', 'ei3.4 cutoff')
>>> ei.apply_strategies()
>>> ei.statistics()
14889 datasets
520205 exchanges
0 unlinked exchanges
>>> ei.write_database()

Пока все хорошо (обратите внимание, в частности, на количество загруженных наборов данных). Но сейчас - как мне это использовать? В частности, я хотел бы получить процесс под названием market for transport, freight, lorry, unspecified с GLO пространственным охватом. Но я не знаю ключ к этому действию, и удивительно, он не обнаруживается в поиске

>>> Database('ei3.4 cutoff').search('market for transport, freight, lorry, unspecified')
[]
>>> Database('ei3.4 cutoff').search('market for transport')
[]

!! Очень удивительно, нет рынков для транспорта? По результатам проверки я вижу 139 действий, начинающихся с фразы market for transport в отсеке Ecoinvent 3.4.

На самом деле, хотя в EI 3.4 есть отсечение 3966 «рыночных» процессов, моя установка brightway знает только около двух десятков:

>>> Database('ei3.4 cutoff').search('market')
['market for paris market carrot' (kilogram, GLO, None),
 'paris market carrot production' (kilogram, GLO, None),
 'market for acetonitrile' (kilogram, GLO, None),
 'market for sulfur' (kilogram, GLO, None),
 'market for whey' (kilogram, GLO, None),
 'market for heptane' (kilogram, GLO, None),
 'market for straw' (kilogram, GLO, None),
 'market for clay' (kilogram, CH, None),
 'market for pitch' (kilogram, CH, None),
 'market for brass' (kilogram, CH, None),
 'market for platinum' (kilogram, GLO, None),
 'market for polycarbonate' (kilogram, GLO, None),
 'market for pitch' (kilogram, RoW, None),
 'market for tetrafluoroethylene' (kilogram, GLO, None),
 'market for dimethenamide' (kilogram, GLO, None),
 'market for glyphosate' (kilogram, GLO, None),
 'market for styrene' (kilogram, GLO, None),
 'market for ferrite' (kilogram, GLO, None),
 'market for folpet' (kilogram, GLO, None),
 'market for magnetite' (kilogram, GLO, None),
 'market for metamitron' (kilogram, GLO, None),
 'market for nylon 6-6' (kilogram, GLO, None),
 'market for atrazine' (kilogram, GLO, None),
 'market for magnesium' (kilogram, GLO, None),
 'market for metaldehyde' (kilogram, GLO, None)]

Как найти набор данных, который не отображается при поиске? Скорее бесполезно, документация строго использует random() для извлечения действий (например, здесь: http://nbviewer.jupyter.org/urls/bitbucket.org/cmutel/brightway2/raw/default/notebooks/Databases.ipynb), что не помогает мне ответить на этот вопрос.

Итак- два вопроса-

  1. как мне найти интересующую деятельность, market for transport, freight, lorry, unspecified [GLO]?

  2. Почему моя база данных отсутствует на 3940 рынках, согласно поиску?

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

1) Я всегда использую списочное понимание как Лоран. Обратите внимание, что у действий есть поле с именем вид деятельности . Возможные значения: «рыночная активность», «рыночная группа», «обычная трансформирующая деятельность»

db_bd = bw.Database('ei3.4 cutoff')
set([ds['activity type'] for ds in bd_db])

Это поле полезно для различения рынков и обычных трансформирующих действий

market_brandon_want = [act for act in db_bd
                if 'freight, lorry, unspecified' in act['name'] 
                and 'GLO' in act['location']
                and act['activity type']!='ordinary transforming activity'
 ]
market_brandon_want

2) поиск не находит все рынки, поскольку количество результатов ограничено. Вы можете изменить его с помощью предела аргумента ( документация ).

bw.Database('ei3.4 cutoff').search('market',limit=5)
0 голосов
/ 07 сентября 2018
  1. Вы можете использовать списки для реализации поиска. Это должно быть довольно эффективно.

db_bd = bw.Database('ei3.4 cutoff')

market_brandon_want = [act for act in db_bd 
                    if 'market for transport, freight, lorry, unspecified' in act['name'] 
                    and 'GLO' in act['location']
     ][0]
  1. Тогда, если вы сделаете:

len([act for act in db_bd if 'market' in act['name'] ])

Вы должны получить 4183, что представляется более точным числом. Я уверен, что вы могли бы улучшить свой фильтр, чтобы стать ближе к вашему номеру.

Вы можете следить за учебным материалом семинара Brightway2 , проведенного в Цюрихе в 2017 году. Это было очень полезно в моем случае.

0 голосов
/ 07 сентября 2018

Попробуйте добавить больше ключевых слов в поле поиска без запятой .

Database("ecoinvent 3.4 conseq").search('market transport freight lorry unspecified')

В моей версии возвращается:

['transport, freight, lorry, all sizes, EURO3 to generic market for 
transport, freight, lorry, unspecified' (ton kilometer, RER, None), 
'transport, freight, lorry, all sizes, EURO3 to generic market for transport, 
freight, lorry, unspecified' (ton kilometer, RoW, None),
'transport, freight, lorry, all sizes, EURO4 to generic market for transport, 
freight, lorry, unspecified' (ton kilometer, RoW, None),
'transport, freight, lorry, all sizes, EURO5 to generic market for transport, 
freight, lorry, unspecified' (ton kilometer, RoW, None),
...

Вы также можете использовать фильтры, чтобы найти местоположение:

Database("ecoinvent 3.4 conseq").search('market transport freight lorry unspecified', filter={"location" : 'GLO'})

возвращается:

['market for transport, freight, lorry, unspecified' (ton kilometer, GLO, None)]

Не уверен, что это сработает, если вы хотите автоматизировать поиск (например, чтобы найти код последовательности процессов).

0 голосов
/ 06 сентября 2018

Итак, один очевидный подход, который работает, - это использовать встроенный итератор базы данных:

>>> m_t_f_l_u = next(_a for _a in Database('ei3.4 cutoff') \
                     if _a['name'] == 'market for transport, freight, lorry, unspecified' \
                     and _a['location'] == 'GLO')

Это работает. Хотя это не очень эффективно, и для его запуска требуется несколько секунд.

...