simple-pv-simulator/main.ipynb

535 lines
328 KiB
Plaintext
Raw Normal View History

2024-05-04 09:59:27 +02:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import glob\n",
"import shutil\n",
"\n",
"def clear_folder_make_ess_pv(folder_path):\n",
2024-05-07 20:20:09 +02:00
" if os.path.isdir(folder_path):\n",
" shutil.rmtree(folder_path)\n",
2024-05-06 19:23:42 +02:00
" os.makedirs(folder_path)\n",
" os.makedirs(os.path.join(folder_path,'ess'))\n",
" os.makedirs(os.path.join(folder_path,'pv'))\n",
"\n",
"folder_path = 'plots'\n",
"clear_folder_make_ess_pv(folder_path)"
]
},
{
"cell_type": "code",
"execution_count": 2,
2024-05-04 09:59:27 +02:00
"metadata": {},
2024-05-04 16:35:55 +02:00
"outputs": [],
2024-05-04 09:59:27 +02:00
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np\n",
"import pandas as pd\n",
"from EnergySystem import EnergySystem\n",
2024-05-07 20:20:09 +02:00
"from config import pv_config, grid_config, ess_config\n"
2024-05-06 19:23:42 +02:00
]
},
{
"cell_type": "code",
"execution_count": 3,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Version 0.0.2\n"
]
}
],
2024-05-06 19:23:42 +02:00
"source": [
2024-05-07 10:27:45 +02:00
"import json\n",
"\n",
"print(\"Version 0.0.2\")\n",
"\n",
2024-05-07 10:27:45 +02:00
"with open('config.json', 'r') as f:\n",
" js_data = json.load(f)\n",
"\n",
2024-05-04 09:59:27 +02:00
"data = pd.read_csv('combined_data.csv')\n",
2024-05-07 10:27:45 +02:00
"time_interval = js_data[\"time_interval\"][\"numerator\"] / js_data[\"time_interval\"][\"denominator\"]\n",
"\n",
"pv_loss = js_data[\"pv\"][\"loss\"]\n",
"pv_cost_per_kW = js_data[\"pv\"][\"cost_per_kW\"]\n",
"pv_lifetime = js_data[\"pv\"][\"lifetime\"]\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"ess_loss = js_data[\"ess\"][\"loss\"]\n",
"ess_cost_per_kW = js_data[\"ess\"][\"cost_per_kW\"]\n",
"ess_lifetime = js_data[\"ess\"][\"lifetime\"]\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"grid_loss = js_data[\"grid\"][\"loss\"]\n",
"sell_price = js_data[\"grid\"][\"sell_price\"] #kWh\n",
"grid_capacity = js_data[\"grid\"][\"capacity\"] #kWh\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"pv_begin = js_data[\"pv_capacities\"][\"begin\"]\n",
"pv_end = js_data[\"pv_capacities\"][\"end\"]\n",
"pv_groups = js_data[\"pv_capacities\"][\"groups\"]\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"ess_begin = js_data[\"ess_capacities\"][\"begin\"]\n",
"ess_end = js_data[\"ess_capacities\"][\"end\"]\n",
"ess_groups = js_data[\"ess_capacities\"][\"groups\"]\n",
2024-05-07 20:20:09 +02:00
"\n",
"annot_unmet = js_data[\"annotated\"][\"unmet_prob\"]\n",
"annot_benefit = js_data[\"annotated\"][\"benefit\"]\n",
"annot_cost = js_data[\"annotated\"][\"cost\"]\n",
"\n",
"title_unmet = js_data[\"plot_title\"][\"unmet_prob\"]\n",
"title_cost = js_data[\"plot_title\"][\"cost\"]\n",
"title_benefit = js_data[\"plot_title\"][\"benefit\"]\n",
"\n",
"figure_size = (js_data[\"figure_size\"][\"length\"], js_data[\"figure_size\"][\"height\"])\n",
"\n",
2024-05-07 10:27:45 +02:00
"pv_capacities = np.linspace(pv_begin, pv_end, pv_groups)\n",
"ess_capacities = np.linspace(ess_begin, ess_end, ess_groups)\n",
2024-05-06 19:23:42 +02:00
"results = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"affords = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
2024-05-07 10:27:45 +02:00
"costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
2024-05-06 19:23:42 +02:00
"overload_cnt = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"hour_demand = []\n",
"for index, row in data.iterrows():\n",
" time = row['time']\n",
" demand = row['demand']\n",
" if time.endswith('00'):\n",
" hour_demand.append(demand)\n",
"plt.figure(figsize=(10,8))\n",
"plt.plot(hour_demand)\n",
"plt.ylabel('Demand Power / kW')\n",
"plt.savefig('plots/demand.png')\n",
"plt.close()"
]
},
{
"cell_type": "code",
"execution_count": 5,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"def cal_profit(es: EnergySystem, saved_money):\n",
" profit = saved_money - es.ess.get_cost_per_year() - es.pv.get_cost_per_year()\n",
" return profit"
]
},
{
"cell_type": "code",
"execution_count": 6,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ess_capacity:0.0\n",
"pv_capacity:0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:52: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:95: RuntimeWarning: invalid value encountered in scalar divide\n",
" log = f\"index: {index}, time: {time}, SoC:{self.ess.storage / self.ess.capacity}%, storage: {self.ess.storage}, pv_gen:{generated_pv_power}, power_demand: {factory_demand}, overload_cnt:{self.overload_cnt}, day:{int(index/96) + 1}\"\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:49: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:120: RuntimeWarning: invalid value encountered in scalar divide\n",
" self.spring_week_soc.append(self.ess.storage / self.ess.capacity)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"pv_capacity:0.0\n",
"pv_capacity:0.0\n",
"pv_capacity:0.0\n",
"pv_capacity:0.0\n",
"ess_capacity:11111.111111111111\n",
"pv_capacity:11111.111111111111\n",
"pv_capacity:11111.111111111111\n",
"pv_capacity:11111.111111111111\n",
"pv_capacity:11111.111111111111\n",
"pv_capacity:11111.111111111111\n",
"ess_capacity:22222.222222222223\n",
"pv_capacity:22222.222222222223\n",
"pv_capacity:22222.222222222223\n",
"pv_capacity:22222.222222222223\n",
"pv_capacity:22222.222222222223\n",
"pv_capacity:22222.222222222223\n",
"ess_capacity:33333.333333333336\n",
"pv_capacity:33333.333333333336\n",
"pv_capacity:33333.333333333336\n",
"pv_capacity:33333.333333333336\n",
"pv_capacity:33333.333333333336\n",
"pv_capacity:33333.333333333336\n",
"ess_capacity:44444.444444444445\n",
"pv_capacity:44444.444444444445\n",
"pv_capacity:44444.444444444445\n",
"pv_capacity:44444.444444444445\n",
"pv_capacity:44444.444444444445\n",
"pv_capacity:44444.444444444445\n",
"ess_capacity:55555.555555555555\n",
"pv_capacity:55555.555555555555\n",
"pv_capacity:55555.555555555555\n",
"pv_capacity:55555.555555555555\n",
"pv_capacity:55555.555555555555\n",
"pv_capacity:55555.555555555555\n",
"ess_capacity:66666.66666666667\n",
"pv_capacity:66666.66666666667\n",
"pv_capacity:66666.66666666667\n",
"pv_capacity:66666.66666666667\n",
"pv_capacity:66666.66666666667\n",
"pv_capacity:66666.66666666667\n",
"ess_capacity:77777.77777777778\n",
"pv_capacity:77777.77777777778\n",
"pv_capacity:77777.77777777778\n",
"pv_capacity:77777.77777777778\n",
"pv_capacity:77777.77777777778\n",
"pv_capacity:77777.77777777778\n",
"ess_capacity:88888.88888888889\n",
"pv_capacity:88888.88888888889\n",
"pv_capacity:88888.88888888889\n",
"pv_capacity:88888.88888888889\n",
"pv_capacity:88888.88888888889\n",
"pv_capacity:88888.88888888889\n",
"ess_capacity:100000.0\n",
"pv_capacity:100000.0\n",
"pv_capacity:100000.0\n",
"pv_capacity:100000.0\n",
"pv_capacity:100000.0\n",
"pv_capacity:100000.0\n"
2024-05-06 19:23:42 +02:00
]
}
],
"source": [
"for ess_capacity in ess_capacities:\n",
" print(f\"ess_capacity:{ess_capacity}\")\n",
" for pv_capacity in pv_capacities:\n",
" print(f\"pv_capacity:{pv_capacity}\")\n",
2024-05-04 09:59:27 +02:00
" pv = pv_config(capacity=pv_capacity, \n",
" cost_per_kW=pv_cost_per_kW,\n",
" lifetime=pv_lifetime, \n",
" loss=pv_loss)\n",
" ess = ess_config(capacity=ess_capacity, \n",
" cost_per_kW=ess_cost_per_kW, \n",
" lifetime=ess_lifetime, \n",
" loss=ess_loss,\n",
" charge_power=ess_capacity,\n",
" discharge_power=ess_capacity)\n",
" grid = grid_config(capacity=grid_capacity, \n",
" grid_loss=grid_loss,\n",
" sell_price= sell_price)\n",
" energySystem = EnergySystem(pv_type=pv, \n",
" ess_type=ess, \n",
" grid_type= grid)\n",
" benefit = energySystem.simulate(data, time_interval)\n",
2024-05-06 19:23:42 +02:00
" results.loc[pv_capacity,ess_capacity] = cal_profit(energySystem, benefit)\n",
" affords.loc[pv_capacity,ess_capacity] = energySystem.afford\n",
" overload_cnt.loc[pv_capacity,ess_capacity] = energySystem.overload_cnt\n",
2024-05-07 10:27:45 +02:00
" costs.loc[pv_capacity,ess_capacity] = energySystem.ess.capacity * energySystem.ess.cost_per_kW + energySystem.pv.capacity * energySystem.pv.cost_per_kW\n",
2024-05-06 19:23:42 +02:00
" pv_generated = energySystem.day_generated\n",
" ess_generated = energySystem.hour_stored\n",
" ess_generated_2 = energySystem.hour_stored_2\n",
" plt.figure(figsize=(10,8));\n",
" plt.plot(ess_generated)\n",
" plt.xlabel('day #')\n",
" plt.ylabel('SoC %')\n",
" plt.title(f'14:00 ESS SoC \\n PV cap:{pv_capacity}, ESS cap:{ess_capacity}')\n",
" plt.savefig(f'plots/ess/1400-{pv_capacity}-{ess_capacity}.png')\n",
" plt.close()\n",
" plt.figure(figsize=(10,8));\n",
" plt.plot(ess_generated_2)\n",
" plt.xlabel('day #')\n",
" plt.ylabel('SoC%')\n",
" plt.title(f'08:00 ESS SoC \\n PV cap:{pv_capacity}, ESS cap:{ess_capacity}')\n",
" plt.savefig(f'plots/ess/0800-{pv_capacity}-{ess_capacity}.png')\n",
" plt.close()\n",
2024-05-07 20:20:09 +02:00
" # print(energySystem.unmet)\n",
" # spring_week_start = energySystem.season_start\n",
" # spring_week_end = spring_week_start + energySystem.week_length\n",
2024-05-07 10:27:45 +02:00
" # summer_week_start = energySystem.season_start + 1 * energySystem.season_step\n",
" # summer_week_end = summer_week_start + energySystem.week_length\n",
" # autumn_week_start = energySystem.season_start + 2 * energySystem.season_step\n",
" # autumn_week_end = autumn_week_start + energySystem.week_length\n",
" # winter_week_start = energySystem.season_start + 3 * energySystem.season_step\n",
" # winter_week_end = winter_week_start+ energySystem.week_length\n",
2024-05-06 19:23:42 +02:00
"\n",
" # spring_consume_data = []\n",
2024-05-07 10:27:45 +02:00
" # summer_consume_data = []\n",
" # autumn_consume_data = []\n",
" # winter_consume_data = []\n",
" # for index, row in data.iterrows():\n",
" # if index in range(spring_week_start, spring_week_end):\n",
" # spring_consume_data.append(row['demand'])\n",
2024-05-07 10:27:45 +02:00
" # elif index in range(summer_week_start, summer_week_end):\n",
" # summer_consume_data.append(row['demand'])\n",
" # elif index in range(autumn_week_start, autumn_week_end):\n",
" # autumn_consume_data.append(row['demand'])\n",
" # elif index in range(winter_week_start, winter_week_end):\n",
" # winter_consume_data.append(row['demand'])\n",
2024-05-06 19:23:42 +02:00
"\n",
" # spring_week_time = list(range(spring_week_start, spring_week_end))\n",
2024-05-07 10:27:45 +02:00
" # summer_week_time = list(range(summer_week_start, summer_week_end))\n",
" # autumn_week_time = list(range(autumn_week_start, autumn_week_end))\n",
" # winter_week_time = list(range(winter_week_start, winter_week_end))\n",
2024-05-06 19:23:42 +02:00
"\n",
" # spring_pv_generated = energySystem.spring_week_gen\n",
2024-05-07 10:27:45 +02:00
" # summer_pv_generated = energySystem.summer_week_gen\n",
" # autumn_pv_generated = energySystem.autumn_week_gen\n",
" # winter_pv_generated = energySystem.winter_week_gen\n",
"\n",
" # spring_soc = energySystem.spring_week_soc\n",
" # summer_soc = energySystem.summer_week_soc\n",
" # autumn_soc = energySystem.autumn_week_soc\n",
" # winter_soc = energySystem.winter_week_soc\n",
"\n",
"\n",
" # fig, ax1 = plt.subplots()\n",
2024-05-06 19:23:42 +02:00
"\n",
" # plt.plot(spring_week_time, spring_pv_generated, label = 'pv generation')\n",
" # plt.plot(spring_week_time, spring_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW spring week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-spring.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
" # plt.plot(summer_week_time, summer_pv_generated, label = 'pv generation')\n",
" # plt.plot(summer_week_time, summer_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW summer week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-summer.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
" # plt.plot(autumn_week_time, autumn_pv_generated, label = 'pv generation')\n",
" # plt.plot(autumn_week_time, autumn_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW autumn week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-autumn.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
" # plt.plot(winter_week_time, winter_pv_generated, label = 'pv generation')\n",
" # plt.plot(winter_week_time, winter_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW winter week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-winter.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
" # plt.figure();\n",
" # plt.plot(pv_generated)\n",
" # plt.xlabel('day #')\n",
" # plt.ylabel('Electricity kWh')\n",
" # plt.title(f'PV generated pv cap:{pv_capacity}, ess cap:{ess_capacity}')\n",
" # plt.savefig(f'plots/pv/{pv_capacity}-{ess_capacity}.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
"\n",
2024-05-04 16:35:55 +02:00
" # plt.show()\n",
"\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-04 16:35:55 +02:00
" \n",
"\n",
"# results = results.astype(float)\n",
2024-05-04 09:59:27 +02:00
"\n",
"\n",
"# pv = pv_config(capacity=100000,cost_per_kW=200,lifetime=25,loss=0.95)\n",
"# ess = ess_config(capacity=100000,cost_per_kW=300,lifetime=25,loss=0.95,charge_power=100000,discharge_power=100000)\n",
"# grid = grid_config(price_schedule=price_schedule, capacity=5000, grid_loss=0.95, sell_price=0.4)\n",
"# grid = grid_config(capacity=50000, grid_loss=0.95, sell_price=0.4)\n",
"\n",
"\n",
" # print(benefit)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
2024-05-06 19:23:42 +02:00
"metadata": {},
2024-05-07 21:06:03 +02:00
"outputs": [],
2024-05-06 19:23:42 +02:00
"source": [
2024-05-07 21:06:03 +02:00
"def save_data(data, filename):\n",
" data.to_csv(filename+'.csv')\n",
" data.to_json(filename + '.json')"
2024-05-06 19:23:42 +02:00
]
},
{
"cell_type": "code",
"execution_count": 8,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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QoUK8vLyUuHChfXAAw9o5cqVtzzvxx9/rFOnTundd99Nk7BIUtGiRTV69GiXfTNnzlTVqlXl6empYsWKaeDAgWm6kDVr1kzVqlXT3r171bx5c+XLl0/FixfXpEmTHG0y85664cMPP1TZsmXl7e2tevXq6ffff1ezZs0c73Xn895439+Q3jlvxLl9+3Y1adJE+fLl0yuvvCJJ+umnn9S2bVvH37Zy5crp9ddfd3kd3uq9frMxLatXr1bjxo3l4+OjAgUKqH379tq3b59LmxtjxQ4fPqyePXuqQIEC8vf3V69evXTt2rU09+nflixZopSUFIWHh9+27cWLF1WvXj2VKFFCBw4cuG37u6ly5coqUqSI/vnnnww/ZsmSJapSpcpN/+YeOXJENptN7733XppjmzZtks1m0zfffOPYd+rUKfXu3VtFixZ1/Fv4xRdfuDwuKSlJY8aMUWhoqPz9/eXj46PGjRtrzZo1Lu1uvCamTJmi999/X+XKlZOnp6f27t0rScqbN6+aNWumn376KcPXC+REVFruIZcvX9a5c+dc9hUpUuSm7VNTUxUREaH69etrypQp+u233zR16lSVK1dO/fv3d7SbNm2aHnnkEXXt2lVJSUn69ttv1alTJy1evDjNt1IbNmzQDz/8oAEDBih//vyaPn26OnbsqBMnTqhw4cKSpNOnT6tevXq6dOmS+vXrp0qVKunUqVP6/vvvde3atZt+gFuwYIGuXbum/v37q3DhwtqyZYs++OADnTx5UgsWLLjTX1saN/6huxGvJB04cEBPPfWUnn32WfXt21cVK1ZUdHS0GjZsqGvXrumFF15Q4cKFNXfuXD3yyCP6/vvv9eijj6pJkyb66quv1K1bN0cXhpt59dVXdfnyZZ08edLxD6Ovr+9t401OTnbc94SEBO3cuVPvvvuumjRp4tJ9aOXKlTpy5Ih69eqloKAg7dmzR5988on27NmjP/74w/HB77nnntP333+vQYMGqUqVKjp//rw2bNigffv2qU6dOpKuf4Bq3bq1QkNDNXbsWLm5uWn27Nl68MEH9fvvv6tevXqSpL///lstW7ZUQECAxo0bp5SUFI0dO1ZFixbN0L2YM2eOevXqpfvvv18TJ05UdHS0pk2bpo0bN2rnzp0u37Rn9PWcGUeOHJG7u7sKFCigbt26acKECZo/f74GDRrkaJOUlKTvv/9eHTt2vO035L169dK3336rMWPG/OduKOm93202m+N1u3LlSj311FNq0aKF3nnnHUnSvn37tHHjRr344ouSrn/InThxop555hnVq1dPsbGx2rZtm3bs2KGHHnrops/9888/y9vbW48//niGYh03bpzGjx+v8PBw9e/fXwcOHNBHH32krVu3auPGjS5VrIsXL6pVq1Z67LHH9MQTT+j777/XiBEjVL16dbVu3TpT7ylJ+uijjzRo0CA1btxYQ4YM0bFjx9ShQwcVLFhQJUqUyFD86Tl//rxat26tzp076+mnn3a8pufMmSNfX18NHTpUvr6+Wr16tcaMGaPY2FhNnjxZUubf67/99ptat26tsmXLaty4cYqPj9cHH3ygRo0aaceOHWk+aD/xxBMKCQnRxIkTtWPHDn322WcKDAx0vA5uZtOmTSpcuLBKly59y3bnzp3TQw89pAsXLmjdunUZ7pL079e
2024-05-06 19:23:42 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
2024-05-06 19:23:42 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
2024-05-04 09:59:27 +02:00
"source": [
2024-05-07 20:20:09 +02:00
"import matplotlib.ticker as ticker\n",
2024-05-07 21:06:03 +02:00
"\n",
"if not os.path.isdir('data'):\n",
" os.makedirs('data')\n",
"\n",
"save_data(results, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-results')\n",
"save_data(costs, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-costs')\n",
"save_data(overload_cnt, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-overload_cnt')\n",
2024-05-04 09:59:27 +02:00
"df=results\n",
2024-05-04 16:35:55 +02:00
"df = df.astype(float)\n",
2024-05-06 19:23:42 +02:00
"df.index = df.index / 1000\n",
"df.columns = df.columns / 1000\n",
2024-05-07 10:27:45 +02:00
"min_value = df.min().min()\n",
"max_value = df.max().max()\n",
"max_scale = max(abs(min_value/1000), abs(max_value/1000))\n",
2024-05-06 19:23:42 +02:00
"plt.figure(figsize=figure_size)\n",
2024-05-07 10:27:45 +02:00
"cmap = sns.color_palette(\"coolwarm\", as_cmap=True)\n",
2024-05-07 20:20:09 +02:00
"ax = sns.heatmap(df/1000, fmt=\".1f\", cmap=cmap, vmin=-max_scale, vmax=max_scale, annot=annot_benefit)\n",
"# ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))\n",
"plt.title(title_benefit)\n",
2024-05-06 19:23:42 +02:00
"plt.gca().invert_yaxis()\n",
"plt.xlabel('ESS Capacity (MWh)')\n",
2024-05-07 10:27:45 +02:00
"plt.ylabel('PV Capacity (MW)')\n",
"plt.savefig('plots/benefit.png')"
2024-05-04 09:59:27 +02:00
]
},
{
"cell_type": "code",
"execution_count": 9,
2024-05-04 09:59:27 +02:00
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxAAAAOVCAYAAAD5hAaWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADPbUlEQVR4nOzdeZyN9f//8eeZFTMMY5uxji37lkqD7JFkKSmpxl6KFrLkI1lKU0ilRItIJaUQFbI0ZN8pO1mSrewGY8x5//7o6/zOacZxjWbmOo7H/Xu7bt/O9b7mXM9zZj51Xue9OYwxRgAAAABgQYDdAQAAAADcOCggAAAAAFhGAQEAAADAMgoIAAAAAJZRQAAAAACwjAICAAAAgGUUEAAAAAAso4AAAAAAYBkFBAAAAADLKCAAZKo1a9aoVq1aCgsLk8Ph0MaNGzP8HjExMerYsWOGP29W2LdvnxwOhyZNmnTNazt27KiYmJhMz+QPJk2aJIfD4Tr+/vtvuyNlmZkzZ3q89rVr19odCYCfoYAAstiePXv05JNPqmTJksqWLZty5cql2rVr65133tGFCxcy/H7nz5/XkCFDlJCQkOHPfS3Jyclq27atTpw4obfeekufffaZihcvnua1CQkJrg88n3/+eZrX1K5dWw6HQ5UqVcrM2EiH5cuXa8iQITp16pTdUdJ05e8uZ86cmX6vIUOGeHxw//dx5MgRSf//b/2bb75J83l69uwph8PhcS4mJsbjucLCwnTHHXdo8uTJqX7+tttu02effaYnnngi418kAEgKsjsAcDP54Ycf1LZtW4WGhiouLk6VKlXSpUuXtHTpUvXt21dbtmzRhx9+mKH3PH/+vIYOHSpJql+/foY+97Xs2bNH+/fv10cffaSuXbta+pls2bJpypQpeuyxxzzO79u3T8uXL1e2bNlS/cyOHTsUEHBjfh9SvHhxXbhwQcHBwXZHuS7Lly/X0KFD1bFjR+XOndvuOKm0bt06y3ttxo0bp/Dw8FTn/+v7U61aNb3wwguSpMOHD+vjjz9Whw4dlJSUpG7durmuK1KkiB577DFdvnw5w/99AgASBQSQZfbu3at27dqpePHiWrRokaKjo11tPXr00O7du/XDDz/YmDDjHTt2TFL6Pjjde++9mjVrlv7++2/ly5fPdX7KlCkqWLCgypQpo5MnT3r8TGhoaIbkvXjxokJCQrKkGLl8+bKcTqdCQkLSLIpw43rwwQc9/nYzSuHChT0K644dO6pkyZJ66623PAoIAMhsN+ZXdsANaMSIETp37pwmTJjgUTxcUbp0aT333HOux5cvX9Yrr7yiUqVKKTQ0VDExMfrf//6npKQkj59bu3atmjZtqnz58il79uwqUaKEOnfuLOmfb+3z588vSRo6dKhr+MOQIUMkSUeOHFGnTp1UpEgRhYaGKjo6Wq1atdK+ffuu+XoWLVqku+66S2FhYcqdO7datWqlbdu2udo7duyoevXqSZLatm0rh8NhqQekVatWCg0N1bRp0zzOT5kyRQ899JACAwNT/UxacyBOnTqlXr16KSYmRqGhoSpSpIji4uJcY+GvDCOZOnWqXnrpJRUuXFg5cuTQmTNnJEnTpk1TjRo1lD17duXLl0+PPfaY/vzzz1T3njZtmipUqKBs2bKpUqVKmjFjRqq5ClfmOYwaNUpvv/2263e6devWq86BmDlzpipVquTxvFZ5+5swxigmJkatWrVK9XMXL15URESEnnzySde5d999VxUrVlSOHDmUJ08e3XbbbZoyZYqkf4bs9O3bV5JUokQJ19+X+9/P559/7nofIyMj1a5dO/3xxx8e961fv74qVaqkzZs3q169esqRI4dKly7tGuKzePFi1axZU9mzZ1fZsmW1YMECy+9FWrL6fpklf/78KleunPbs2WN3FAA3GXoggCwye/ZslSxZUrVq1bJ0fdeuXfXpp5/qwQcf1AsvvKBVq1YpPj5e27Ztc32YPHbsmJo0aaL8+fPrxRdfVO7cubVv3z5Nnz5d0j8fMMaNG6ennnpK999/vx544AFJUpUqVSRJbdq00ZYtW/TMM88oJiZGx44d0/z583XgwAGvwz4WLFigZs2aqWTJkhoyZIguXLigd999V7Vr19b69esVExOjJ598UoULF9Zrr72mZ599VrfffrsKFix4zdedI0cOtWrVSl9++aWeeuopSdKmTZu0ZcsWffzxx9q8efM1n+PcuXO66667tG3bNnXu3Fm33nqr/v77b82aNUsHDx70+Hb4lVdeUUhIiPr06aOkpCSFhIRo0qRJ6tSpk26//XbFx8fr6NGjeuedd7Rs2TJt2LDB1aPyww8/6OGHH1blypUVHx+vkydPqkuXLipcuHCauSZOnKiLFy/qiSeeUGhoqCIjI+V0OlNd99NPP6lNmzaqUKGC4uPjdfz4cVehdy3X+ptwOBx67LHHNGLECJ04cUKRkZGun509e7bOnDnj+pb7o48+0rPPPqsHH3xQzz33nC5evKjNmzdr1apVat++vR544AHt3LlTX375pd566y3X+3qlaB0+fLgGDRqkhx56SF27dtVff/2ld999V3Xr1vV4HyXp5MmTuu+++9SuXTu1bdtW48aNU7t27fTFF1/o+eefV/fu3dW+fXuNHDlSDz74oP7444//NK8hM+934sSJVOeCgoIyfIjX5cuXdfDgQeXJkydDnxcArskAyHSnT582kkyrVq0sXb9x40YjyXTt2tXjfJ8+fYwks2jRImOMMTNmzDCSzJo1a676XH/99ZeRZAYPHuxx/uTJk0aSGTlyZLpeizHGVKtWzRQoUMAcP37cdW7Tpk0mICDAxMXFuc79/PPPRpKZNm3aNZ/T/drvv//eOBwOc+DAAWOMMX379jUlS5Y0xhhTr149U7FiRY+fLV68uOnQoYPr8csvv2wkmenTp6e6j9Pp9LhfyZIlzfnz513tly5dMgUKFDCVKlUyFy5ccJ3//vvvjSTz8ssvu85VrlzZFClSxJw9e9Z1LiEhwUgyxYsXd53bu3evkWRy5cpljh075pHnStvEiRNd56pVq2aio6PNqVOnXOd++umnVM+bFit/Ezt27DCSzLhx4zzOt2zZ0sTExLjeo1atWqV6r/9t5MiRRpLZu3evx/l9+/aZwMBAM3z4cI/zv/76qwkKCvI4X69ePSPJTJkyxXVu+/btRpIJCAgwK1eudJ2fN29eqvcrLRMnTkwzV2bdzxhjBg8ebCSleZQtW9Z13bX+d9GjRw/z7/88Fy9e3DRp0sT89ddf5q+//jK//vqrefzxx40k06NHD6/vgbe/BQC4HgxhArLAlWExVr/B/PHHHyVJvXv39jh/ZQLllbkSV77R/P7775WcnJyuTNmzZ1dISIgSEhJSzSnw5vDhw9q4caM6duzo8e11lSpVdPfdd7uy/xdNmjRRZGSkpk6dKmOMpk6dqkceecTyz3/77beqWrWq7r///lRt/17dpkOHDsqePbvr8dq1a3Xs2DE9/fTTHnMTmjdvrnLlyrne+0OHDunXX39VXFycx4TZevXqqXLlymnmatOmjevb+au58v526NBBERERrvN33323KlSo4PVnJWt/E7fccotq1qypL774wnXuxIkTmjNnjh599FHXe5Q7d24dPHhQa9asueZ9/2369OlyOp166KGH9Pfff7uOqKgolSlTRj///LPH9eHh4WrXrp3rcdmyZZU7d26VL19eNWvWdJ2/8s+///57ujNl1f2+/fZbzZ8/3+OYOHHif8or/dMzlT9/fuXPn1+VK1fWZ599pk6dOmnkyJH/+bkBID0oIIAskCtXLknS2bNnLV2/f/9+BQQEqHTp0h7no6KilDt3bu3fv1/SPx9W27Rpo6FDhypfvnxq1aqVJk6cmGqeRFpCQ0P1xhtvaM6cOSpYsKDq1q2rESNGuJaa9JZN+ucD17+VL19ef//9txITEy29zqsJDg5W27ZtNWXKFC1ZskR//PGH2rdvb/nn9+zZY3mp1xIlSng89vb6ypUr52q/8v///Tu62rm07pWWK89bpkyZVG1pZfo3q38TcXFxWrZsmet+06Z
2024-05-04 09:59:27 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
2024-05-04 09:59:27 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2024-05-07 21:06:03 +02:00
"\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"df = costs\n",
"df = df.astype(int)\n",
2024-05-06 19:23:42 +02:00
"df.index = df.index / 1000\n",
"df.columns = df.columns / 1000\n",
"\n",
"plt.figure(figsize=figure_size)\n",
2024-05-07 20:20:09 +02:00
"sns.heatmap(df/1000000, fmt=\".1f\", cmap='viridis', annot=annot_cost)\n",
"plt.title(title_cost)\n",
2024-05-04 09:59:27 +02:00
"plt.gca().invert_yaxis()\n",
"plt.xlabel('ESS Capacity (MWh)')\n",
"plt.ylabel('PV Capacity (MW)')\n",
2024-05-07 10:27:45 +02:00
"plt.savefig('plots/costs.png')\n",
2024-05-04 09:59:27 +02:00
"\n",
" # pv = pv_config(capacity=100000,cost_per_kW=200,lifetime=25,loss=0.95)\n",
" # ess = ess_config(capacity=100000,cost_per_kW=300,lifetime=25,loss=0.95,charge_power=100000,discharge_power=100000)\n",
" # grid = grid_config(price_schedule=price_schedule, capacity=5000, grid_loss=0.95, sell_price=0.4)\n",
" # grid = grid_config(capacity=50000, grid_loss=0.95, sell_price=0.4)\n",
"\n",
"\n",
" # print(benefit)"
]
2024-05-06 19:23:42 +02:00
},
{
"cell_type": "code",
"execution_count": 18,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyUAAAOVCAYAAAB3Xk/qAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd1xUd77/8dfMAEPvIGBDUVQgVizYQEVNYhLTNU2T3bRNdvdufsnd3dzdm03bze7eLXezd1M30fSipppiwy42xIZipaiI9A7DlPP7gzAyAgrCzJlhPs/Hg4c45ZzPd2aY+b7n+z3fo1EURUEIIYQQQgghVKJVuwAhhBBCCCGEe5NQIoQQQgghhFCVhBIhhBBCCCGEqiSUCCGEEEIIIVQloUQIIYQQQgihKgklQgghhBBCCFVJKBFCCCGEEEKoSkKJEEIIIYQQQlUSSoQQQgghhBCqklAihHALFy5c4PbbbycsLAyNRsP//u//ql1Sn5GWlkZaWpraZdhYvnw5Go2G/Px8u2z/2WefRaPR2GXbfZEzvkaEEM5FQonoE06dOsUjjzzC0KFD8fb2JjAwkGnTpvGPf/yDxsZGtctzKffffz8ajcb6o9friY+P55lnnqGpqemqtnnkyBGeffZZu3UQu+KJJ55gzZo1PP3007z33ntce+21nd62bfvb/kRFRfV6Xa+88grLly/v9e32VH5+fqePg0aj4Y9//KPDanHWx6grLv178vf3Z+jQodx+++2sWrUKi8WidolCCOEUPNQuQIie+uabb7jjjjvQ6/UsWbKEpKQkmpub2bZtG//5n/9JTk4Ob7zxhtpluhS9Xs+///1vAKqrq/nyyy954YUXOHXqFB988EG3t3fkyBGee+450tLSiI2N7eVquyYjI4OFCxfy1FNPden2c+fOZcmSJTaX+fj49Hpdr7zyCuHh4dx///29vu3ecNddd3H99de3u3zcuHEOq+FqHqP77ruPxYsXo9fr7VdYF7X9e2psbKSgoICvv/6a22+/nbS0NL788ksCAwNVrlIIIdQloUS4tLy8PBYvXszgwYPJyMggOjraet3jjz/OyZMn+eabb1SssHMNDQ34+vqqXUaHPDw8uPfee63/f+yxx5g6dSofffQRf/vb3+jXr5+K1V2dkpISgoODu3z7+Ph4m8fAlTQ1NeHl5YVW2/PB8PHjx7vU41BfX4+fnx86nQ6dTqd2OUD7vyeAF198kT/+8Y88/fTTPPTQQ3zyyScqVSeEEM5Bpm8Jl/bnP/+Zuro63nrrLZtA0mrYsGH8x3/8h/X/JpOJF154gbi4OPR6PbGxsfzXf/0XBoPBepsbbriBoUOHdri/lJQUkpOTbS57//33mTBhAj4+PoSGhrJ48WLOnDljc5u0tDSSkpLIyspi5syZ+Pr68l//9V8AfPnllyxYsICYmBj0ej1xcXG88MILmM3mdvv/17/+xdChQ/Hx8WHSpEls3bq1w7naBoOB3/3udwwbNgy9Xs/AgQP55S9/adPO7tBoNEyfPh1FUTh9+rT18oKCAh577DFGjBiBj48PYWFh3HHHHTbTtJYvX84dd9wBwKxZs6zTWDZt2mS9zXfffceMGTPw8/MjICCABQsWkJOT06XaTp8+zR133EFoaCi+vr5MmTLFJoi2HlugKAr/+te/rPvvib/85S9MnTqVsLAwfHx8mDBhAitXruzwtu+//z6TJk3C19eXkJAQZs6cydq1awGIjY0lJyeHzZs3W+tq+1xeqW0AmzZtQqPR8PHHH/Pb3/6W/v374+vry/79+9FoNPz9739vV9OOHTvQaDR89NFHPXocLqc7r8GrfYxan9vNmzfz2GOPERkZyYABA2yuu3TK4HfffUdqaioBAQEEBgYyceJEPvzwQ+v1W7du5Y477mDQoEHWup944gm7TAP99a9/zbx581ixYgXHjx9vV+eV/ibuv/9+/P39KSws5IYbbsDf35/+/fvzr3/9C4BDhw4xe/Zs/Pz8GDx4sE07ASoqKnjqqae45ppr8Pf3JzAwkOuuu44DBw7Y3K71Nfbpp5/y+9//ngEDBuDt7c2cOXM4efJku3a98cYbxMXF2bxPdeSf//wniYmJ1uc9OTm5XY1CCPchIyXCpX399dcMHTqUqVOndun2Dz74IO+88w633347Tz75JLt27eKll17i6NGjfP755wAsWrSIJUuWsGfPHiZOnGi9b0FBATt37uR//ud/rJf9/ve/57//+7+58847efDBByktLeWf//wnM2fOJDs72+ab+fLycq677joWL17Mvffeax1tWL58Of7+/vy///f/8Pf3JyMjg2eeeYaamhqbfb366qv89Kc/ZcaMGTzxxBPk5+dz8803ExISYu2IAVgsFm666Sa2bdvGww8/zKhRozh06BB///vfOX78OF988cXVPNTWzl1ISIj1sj179rBjxw4WL17MgAEDyM/P59VXXyUtLY0jR47g6+vLzJkz+fnPf87LL7/Mf/3XfzFq1CgA67/vvfceS5cuZf78+fzpT3+ioaGBV199lenTp5OdnX3Z6V4XLlxg6tSpNDQ08POf/5ywsDDeeecdbrrpJlauXMktt9zCzJkzee+997jvvvs6nJLVmaamJsrKymwuCwgIQK/X849//IObbrqJe+65h+bmZj7++GPuuOMOVq9ezYIFC6y3f+6553j22WeZOnUqzz//PF5eXuzatYuMjAzmzZvH//7v//Kzn/0Mf39/fvOb3wBYXxddaVtbL7zwAl5eXjz11FMYDAZGjhzJtGnT+OCDD3jiiSdsbvvBBx8QEBDAwoULr/g4NDQ0tHscAIKDg/Hw6PgjpDuvwZ48Rq0ee+wxIiIieOaZZ6ivr++0LcuXL+dHP/oRiYmJPP300wQHB5Odnc3333/P3XffDcCKFStoaGjgJz/5CWFhYezevZt//vOfnD17lhUrVlzx8equ++67j7Vr17Ju3Tri4+OB7v1NmM1mrrvuOmbOnMmf//xnPvjgA37605/i5+fHb37zG+655x5uvfVWXnvtNZYsWUJKSgpDhgwBWkLvF198wR133MGQIUO4cOECr7/+OqmpqRw5coSYmBibWv/4xz+i1Wp56qmnqK6u5s9//jP33HMPu3btst7mrbfe4pFHHmHq1Kn84he/4PTp09x0002EhoYycOBA6+3efPNNfv7zn3P77bfzH//xHzQ1NXHw4EF27dplfS6EEG5GEcJFVVdXK4CycOHCLt1+//79CqA8+OCDNpc/9dRTCqBkZGRYt6vX65Unn3zS5nZ//vOfFY1GoxQUFCiKoij5+fmKTqdTfv/739vc7tChQ4qHh4fN5ampqQqgvPbaa+3qamhoaHfZI488ovj6+ipNTU2KoiiKwWBQwsLClIkTJypGo9F6u+XLlyuAkpqaar3svffeU7RarbJ161abbb722msKoGzfvr3Tx0hRFGXp0qWKn5+fUlpaqpSWlionT55U/vKXvygajUZJSkpSLBbLZWvPzMxUAOXdd9+1XrZixQoFUDZu3Ghz29raWiU4OFh56KGHbC4vLi5WgoKC2l1+qV/84hcKYNPW2tpaZciQIUpsbKxiNputlwPK448/ftnttb1tRz/Lli3rsN3Nzc1KUlKSMnv2bOtlJ06cULRarXLLLbfY1KEois1jmJiYaPP8dbdtGzduVABl6NCh7ep6/fXXFUA5evSoTa3h4eHK0qVLL/sY5OXldfo4AEpmZqb1tqmpqVf1GuzpY7Rs2TIFUKZPn66YTKYOr8vLy1MURVGqqqqUgIAAZfLkyUpjY2On++roNf3SSy/Z/O0riqL87ne/U7ryEdr699SZ7OxsBVCeeOIJRVG69zexdOlSBVD+8Ic/WC+rrKxUfHx8FI1Go3z88cfWy3NzcxVA+d3vfme9rKmpqd3jnpeXp+j1euX555+3Xtb6Ghs1apRiMBisl//jH/9QAOXQoUOKorS8tiIjI5WxY8fa3O6NN95o9z61cOFCJTExsdPHRQjhfmT6lnBZNTU1QMu3113x7bffAvD//t//s7n8ySefBLBOi2mdwvDpp5+iKIr1dp9
2024-05-06 19:23:42 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
2024-05-06 19:23:42 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2024-05-07 10:27:45 +02:00
"from matplotlib.colors import LinearSegmentedColormap\n",
2024-05-06 19:23:42 +02:00
"df = overload_cnt\n",
"df = df.astype(int)\n",
"df.index = df.index / 1000\n",
"df.columns = df.columns / 1000\n",
2024-05-07 10:27:45 +02:00
"min_value = df.min().min()\n",
"max_value = df.max().max()\n",
"max_scale = max(abs(min_value/1000), abs(max_value/1000))\n",
2024-05-06 19:23:42 +02:00
"\n",
"plt.figure(figsize=figure_size)\n",
2024-05-07 10:27:45 +02:00
"cmap = LinearSegmentedColormap.from_list(\"\", [\"white\", \"blue\"])\n",
2024-05-07 20:20:09 +02:00
"ax = sns.heatmap(df/(4*24*365), fmt=\".00%\", cmap=cmap, vmin=0, vmax=1, annot=annot_unmet)\n",
"cbar = ax.collections[0].colorbar\n",
"cbar.set_ticks([0, 0.25, 0.5, 0.75, 1])\n",
"cbar.set_ticklabels(['0%', '25%', '50%', '75%', '100%'])\n",
"cbar.ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f'{x:.0%}'))\n",
"\n",
"X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
"\n",
"CS = ax.contour(X, Y, df, levels=np.linspace(df.min().min(), df.max().max(), 20), colors='black', alpha=0.5)\n",
"\n",
"ax.clabel(CS, inline=True, fontsize=10)\n",
"\n",
"\n",
2024-05-07 20:20:09 +02:00
"plt.title(title_unmet)\n",
2024-05-06 19:23:42 +02:00
"plt.gca().invert_yaxis()\n",
"plt.xlabel('ESS Capacity (MWh)')\n",
2024-05-07 10:27:45 +02:00
"plt.ylabel('PV Capacity (MW)')\n",
"plt.savefig('plots/unmet.png')"
2024-05-06 19:23:42 +02:00
]
2024-05-04 09:59:27 +02:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.9"
2024-05-04 09:59:27 +02:00
}
},
"nbformat": 4,
"nbformat_minor": 2
}