基于python生成和模拟大量的微电网【pymgrid】

474 阅读2分钟

pymgrid

pymgrid(Python MicroGRID)是一个python库,用于生成和模拟大量的微电网。

关于更多的背景,请看在气候变化AI做的演讲

安装

安装pymgrid的最简单方法是使用pip。

pip install -U pymgrid

另外,你也可以从源代码安装。首先克隆该版本。

git clone https://github.com/Total-RD/pymgrid.git

然后导航到pymgrid的根目录,调用

pip install .

开始使用

微电网可以直接从头开始生成。只需定义一些模块并将它们传递给微电网。

import numpy as np
from pymgrid import Microgrid
from pymgrid.microgrid.modules import GensetModule, BatteryModule, LoadModule, RenewableModule


genset = GensetModule(running_min_production=10,
                      running_max_production=50,
                      genset_cost=0.5)

battery = BatteryModule(min_capacity=0,
                        max_capacity=100,
                        max_charge=50,
                        max_discharge=50,
                        efficiency=1.0,
                        init_soc=0.5)

# Using random data
renewable = RenewableModule(time_series=50*np.random.rand(100))

load = LoadModule(time_series=60*np.random.rand(100),
                  loss_load_cost=10)

microgrid = Microgrid([genset, battery, ("pv", renewable), load])

这就创建了一个具有上述定义的模块的微电网,以及一个不平衡能源模块--用于调节能源需求与供应不匹配的情况。

打印微电网可以得到它的结构。

>> microgrid

Microgrid([genset x 1, load x 1, battery x 1, pv x 1, balancing x 1])

一个微电网包含固定模块和灵活模块。有些模块可以同时具备这两种功能,例如GridModule,但不能同时具备。

固定*模块需要提前申请一定量的能源,然后尝试生产或消耗上述数量。 LoadModule "就是这样一个例子;你必须告诉它要消耗一定量的能量,然后它就会这样做。

另一方面,一个灵活的模块,能够适应满足需求。 RenewableModule "就是一个例子,因为它允许缩减任何多余的可再生资源生产。

一个微电网会告诉你哪些模块是什么。

>> microgrid.fixed_modules

{
 "发电机组""[GensetModule(running_min_production=10, running_max_production=50, genset_cost=0.5, co2_per_unit=0, cost_per_unit_co2=0, start_up_time=0, wind_down_time=0, allow_abortion=True, init_start_up=True, raise_errors=False, provided_energy_name=genset_production)]""加载""[LoadModule(time_series=<class 'numpy.ndarray'>, loss_load_cost=10, forecaster=NoForecaster, forecast_horizon=0, forecaster_increase_uncertainty=False, raise_errors=False)]""电池""[BatteryModule(min_capacity=0, max_capacity=100, max_charge=50, max_discharge=50, efficiency=1.0, battery_cost_cycle=0.0, battery_transition_model=None, init_charge=None, init_soc=0.5, raise_errors=False)]"
}

>>microgrid.flex_modules

{
 "pv": "[RenewableModule(time_series=<class 'numpy.ndarray'>, raise_errors=False, forecaster=NoForecaster, forecast_horizon=0, forecaster_increase_uncertainty=False, provided_energy_name=renewable_used)]""平衡""[UnbalancedEnergyModule(raise_errors=False, loss_load_cost=10, overgeneration_cost=2)]"
}

运行微电网是很简单的。只需将每个固定模块的动作传递给microgrid.run。微电网也可以通过调用microgrid.sample_action提供一个随机动作。`一旦微电网运行了一定数量的步骤,可以通过调用microgrid.get_log查看结果。

>> for j in range(10):
>>    action = microgrid.sample_action(strict_bound=True)
>>    microgrid.run(action)

>> microgrid.get_log(drop_singleton_key=True)

      genset  ...                     balance
      reward  ... fixed_absorbed_by_microgrid
0  -5.000000  ...                   10.672095
1 -14.344353  ...                   50.626726
2  -5.000000  ...                   17.538018
3  -0.000000  ...                   15.492778
4  -0.000000  ...                   35.748724
5  -0.000000  ...                   30.302300
6  -5.000000  ...                   36.451662
7  -0.000000  ...                   66.533872
8  -0.000000  ...                   20.645077
9  -0.000000  ...                   10.632957

基准测试

pymgrid还预装了一套25个微电网,用于基准测试。这些微电网的配置文件可在data/scenario/pymgrid25中找到。只需反序列化其中一个yaml文件,就可以加载其中一个已保存的微电网;例如,要加载第4个微电网。

import yaml
from pymgrid import PROJECT_PATH

yaml_file = PROJECT_PATH / 'data/scenario/pymgrid25/microgrid_0/microgrid_0.yaml'microgrid = yaml.safe_load(yaml_file.open('r'))

另外,Microgrid.load(yaml_file.open('r'))将执行同样的反序列化。

数据

pymgrid中的数据是基于TMY3的(基于代表性天气的数据)。光伏数据来自DOE/NREL/ALLIANCE(nsrdb.nrel.gov/about/tmy.h…),负荷数据来自OpenEI(openei.org/doe-opendat…)。

二氧化碳数据来自Jacque de Chalendar和他的Gridemissions API。