Brightway2: изменение / удаление бирж из активности без использования активности в качестве диктата
Я хотел бы изменить биржи активности и сохранить активность обратно в базу данных.
Можно изменить другие аспекты деятельности, например, ее название:some_act['name'] = "some new name"
и затем сохраните активность с: some_act.save()
Также возможно изменить биржи таким же образом:some_exc['scale"] = 0.5
и затем сохраните обмен с:some_exc.save()
Однако я обнаружил, что единственный способ добавить / удалить обмены из определенного действия - это пройти dictionary version
деятельности:
some_act_dataset = some_act._data
some_act_dataset['exchanges'] = [{exchange1}, {exchange2}] # exc must be valid exchange dict
Проблема в том, что я не знаю, как сохранить новое действие (как dict) обратно в базу данных.some_act_dataset.save()
не работает, так как словари не имеют save
метод.Database("my_database").write(some_act_dataset)
перезаписывает все остальные данные в базе данных.
Я мог бы работать в загруженной базе данных:loaded_db = Database("my_database").load()
и внесите необходимые изменения в полученный словарь, а затем запишите всю базу данных, но когда базы данных большие, это кажется дорогостоящей операцией.
Итак, вопрос заключается в следующем: есть ли способ изменить обмены операций и сохранить активность обратно в базу данных без необходимости перезаписывать всю базу данных?
1 ответ
Действия и обмены хранятся в отдельных таблицах в базе данных SQLite, и у каждого из них есть свой собственный объект. В пути к базе данных и из нее используются несколько уровней перевода:
Тем не менее, мы почти всегда работаем с Activity
или же Exchange
объекты. Ключевым моментом здесь является то, что поскольку действия и обмены представляют собой две отдельные таблицы, они должны рассматриваться отдельно.
Чтобы создать новый обмен, используйте Activity.new_exchange()
:
In [1] from brightway2 import *
In [2]: act = Database("something").random()
In [3]: exc = act.new_exchange()
In [4]: type(exc)
Out[4]: bw2data.backends.peewee.proxies.Exchange
Вы также можете указать атрибуты данных в new_exchange
вызов метода:
In [5]: exc = act.new_exchange(amount=1)
In [6]: exc['amount']
Out[6]: 1
Чтобы удалить Exchange
, вызов Exchange.delete()
, Если вы выполняете много манипуляций с данными, вы можете либо выполнить SQL непосредственно для базы данных, либо написать запросы на peewee с ActivityDataset
или же ExchangeDataset
(см., например, запросы, построенные в конструкции Exchanges
объект).