2024-05-04 09:59:27 +02:00
|
|
|
{
|
|
|
|
"cells": [
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2024-05-07 21:06:03 +02:00
|
|
|
"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",
|
2024-05-07 21:06:03 +02:00
|
|
|
"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",
|
2024-05-07 21:06:03 +02:00
|
|
|
"execution_count": 3,
|
2024-05-06 19:23:42 +02:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
2024-05-07 10:27:45 +02:00
|
|
|
"import json\n",
|
|
|
|
"\n",
|
|
|
|
"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",
|
2024-05-07 21:06:03 +02:00
|
|
|
"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",
|
2024-05-07 21:06:03 +02:00
|
|
|
"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",
|
2024-05-07 21:06:03 +02:00
|
|
|
"execution_count": 6,
|
2024-05-06 19:23:42 +02:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [
|
|
|
|
{
|
|
|
|
"name": "stdout",
|
|
|
|
"output_type": "stream",
|
|
|
|
"text": [
|
2024-05-07 20:20:09 +02:00
|
|
|
"pv_capacity:5000.0\n",
|
|
|
|
"ess_capacity:5000.0\n",
|
|
|
|
"ess_capacity:27500.0\n",
|
2024-05-07 10:27:45 +02:00
|
|
|
"ess_capacity:50000.0\n",
|
2024-05-07 20:20:09 +02:00
|
|
|
"pv_capacity:27500.0\n",
|
|
|
|
"ess_capacity:5000.0\n",
|
|
|
|
"ess_capacity:27500.0\n",
|
2024-05-07 10:27:45 +02:00
|
|
|
"ess_capacity:50000.0\n",
|
|
|
|
"pv_capacity:50000.0\n",
|
2024-05-07 20:20:09 +02:00
|
|
|
"ess_capacity:5000.0\n",
|
|
|
|
"ess_capacity:27500.0\n",
|
|
|
|
"ess_capacity:50000.0\n"
|
2024-05-06 19:23:42 +02:00
|
|
|
]
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"source": [
|
2024-05-04 09:59:27 +02:00
|
|
|
"for pv_capacity in pv_capacities:\n",
|
|
|
|
" print(f\"pv_capacity:{pv_capacity}\")\n",
|
|
|
|
" for ess_capacity in ess_capacities:\n",
|
|
|
|
" print(f\"ess_capacity:{ess_capacity}\")\n",
|
|
|
|
" 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",
|
2024-05-04 16:35:55 +02:00
|
|
|
" plt.xlabel('day #')\n",
|
2024-05-06 19:23:42 +02:00
|
|
|
" 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",
|
2024-05-06 19:23:42 +02:00
|
|
|
" 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",
|
2024-05-06 19:23:42 +02:00
|
|
|
" 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",
|
|
|
|
"\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",
|
|
|
|
"\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",
|
2024-05-07 21:06:03 +02:00
|
|
|
"execution_count": null,
|
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)"
|
2024-05-06 19:23:42 +02:00
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2024-05-07 21:06:03 +02:00
|
|
|
"execution_count": 8,
|
2024-05-06 19:23:42 +02:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [
|
|
|
|
{
|
|
|
|
"data": {
|
2024-05-07 21:06:03 +02:00
|
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABesAAAW/CAYAAAA8eqjRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACraUlEQVR4nOzdd5hU1f0/8M8sZWkBLCwLFqpKUzGoiEbBBirWqIlYAHtBE7ETE7EGe02UFAUbsUZjJ2iwI5aosaGAoEkUMCogKv3+/vC382VYhN114bDwej3PPA9777l3PvfOmVl9z9lzclmWZQEAAAAAACRTlLoAAAAAAABY2wnrAQAAAAAgMWE9AAAAAAAkJqwHAAAAAIDEhPUAAAAAAJCYsB4AAAAAABIT1gMAAAAAQGLCegAAAAAASExYDwAAAAAAiQnrAVhtzJkzJ4455pgoLS2NXC4Xp556akydOjVyuVyMHDkydXnUUK1bt46BAwemLmON5h6vHnK5XJx//vkVapvqNfv3v/8d9erVixdeeGGFbZ9++unI5XJx3333rYLKVm+9evWKXr16pS5jjbNgwYLYaKON4sYbb0xdCgBARAjrAdZ4I0eOjFwuV/AoKSmJnXfeOR5//PHU5RX47W9/GyNHjowTTzwxbr/99jjiiCOW2e6xxx6rcCAV8V3I0aVLl2XuK/sy4Morr6xKyRX229/+Nh588MGV+hwrU1lotuRj3XXXje222y7uvPPO1OXVGGX9rexRq1at2HjjjeOAAw6IN954IyIi/vrXv0Yul4s///nP33ueMWPGRC6Xi+uvv34VVV49lu5DSz5OOOGEgrYPP/xw9OzZM0pKSqJBgwbRtm3b+NnPfhZPPPFEQbvPPvssfvnLX0aHDh2ifv36UVJSEttuu22cffbZMWfOnArVNXny5Dj++OOjbdu2Ua9evWjcuHHssMMOcd1118W3335bbde/qr344otx/vnnx8yZM1OXknfhhRdG9+7dY4cddshvGzVqVFx77bXpilqDtG7d+nvfY3vssUe+3cCBA6NRo0bfe55GjRoVfJmz9O+AWrVqRUlJSRx00EHx3nvvfe953nrrrcjlcvHyyy9Xy/VVtzp16sRpp50Wl1xyScydOzd1OQAAUTt1AQCsGhdeeGG0adMmsiyL6dOnx8iRI2OvvfaKhx9+OPbee+/U5UVExD/+8Y/YbrvtYujQofltWZbFt99+G3Xq1Mlve+yxx+L3v/99pQL71H7729/GQQcdFPvvv3/qUn6QX/ziF7HNNttERMTnn38ed999dxx++OExc+bMGDRoUOLqao5+/frFXnvtFYsWLYr33nsvbrrppnj88cfjpZdeir59+0aTJk1i1KhRccwxxyzz+FGjRkWtWrXikEMOWcWV/3C777579O/fv9z2TTfdNP/vK6+8Ms4888zo2bNnDBkyJBo0aBCTJk2KJ598Mu6666586PjFF1/E1ltvHbNnz46jjjoqOnToEJ9//nn861//iptuuilOPPHE5QaSERGPPvpoHHzwwVFcXBz9+/ePLl26xPz58+P555+PM888M95555344x//WL03YSX59ttvo3bt//vP+xdffDEuuOCCGDhwYDRt2rSg7fvvvx9FRat23M5nn30Wt956a9x6660F20eNGhVvv/12nHrqqau0njVV165d4/TTTy+3vWXLlj/43GW/AxYsWBD/+te/Yvjw4fH000/H22+/HaWlpeXaP/roo1FSUpL/vbE6OvLII+Occ86JUaNGxVFHHZW6HABgLSesB1hL7LnnnrH11lvnfz766KOjefPm8Ze//GW1CetnzJgRnTp1KtiWy+WiXr16iSpiaTvuuGMcdNBB+Z9PPPHEaNu2bYwaNUpYXwk//vGP4/DDD8//vMMOO8S+++4bN910U/zhD3+Igw46KEaMGBGffPJJuYBt7ty58cADD8Tuu+8eJSUlq7r0H2zTTTctuPalLVy4MC666KLYfffd4+9//3u5/TNmzMj/++abb46PP/44Xnjhhdh+++0L2s2ePTvq1q273FqmTJkShxxySLRq1Sr+8Y9/RIsWLfL7Bg0aFJMmTYpHH320opeWXGU+K4uLi1diJct2xx13RO3atWOfffZZ5c+9Ntlggw2W+x77IZb+HbDZZpvFiSeeGLfddlucddZZ5do/9thjseeee0Yul1sp9VRVlmUxd+7cqF+/fjRt2jR69+4dI0eOFNYDAMmZBgdgLdW0adOoX79+wSjMiIjFixfHtddeG507d4569epF8+bN4/jjj48vv/yyoF3r1q1j7733jueffz623XbbqFevXrRt2zZuu+22cs81c+bMOPXUU2OjjTaK4uLiaN++fVx22WWxePHiiPi/P6+fMmVKPProo/k/s586dWq5OesHDhwYv//97yOicEqN6raimstceeWVsf3228d6660X9evXj27dupWbXzmXy8XXX38dt956a77esukFzj///MjlcvHBBx/E4YcfHk2aNIlmzZrFb37zm8iyLP7973/HfvvtF40bN47S0tK46qqrCs49f/78OO+886Jbt27RpEmTaNiwYey4444xduzYgnZLTvdzzTXXRKtWraJ+/frRs2fPePvtt6t8n+rWrRvrrLNOuX40YsSI2GWXXaKkpCSKi4ujU6dOcdNNN5U7/tVXX40+ffrE+uuvH/Xr1482bdqUC0sq2iezLIuLL744Ntxww2jQoEHsvPPO8c4771T4Wr7++us4/fTT86/5ZpttFldeeWVkWVbQLpfLxcknnxwPPvhgdOnSJYqLi6Nz587lpmepjF122SUivguPIyIOP/zwWLx4cdx1113l2j766KMxa9asOOyww5Z7zo8++ihOOumk2GyzzaJ+/fqx3nrrxcEHHxxTp04taFc2VdYLL7wQp512WjRr1iwaNmwYBxxwQHz22WcFbX/oPa6I//3vfzF79uyCaVKWtOQXFJMnT45atWrFdtttV65d48aNVxheX3755TFnzpy4+eabC4L6Mu3bt49f/vKX+Z8r2q/LPh///ve/R9euXaNevXrRqVOn+Otf/1rQ7osvvogzzjgjNt9882jUqFE0btw49txzz3jzzTfLnXPu3Llx/vnnx6abbhr16tWLFi1axE9/+tOYPHlyvs2Sc9aff/75ceaZZ0ZERJs2bQo+V8tqXHrO+op+7t11113RrVu3+NGPfhSNGzeOzTffPK677rrvv9H/34MPPhjdu3cv+GuHXr16xaOPPhofffRRvsbWrVsXHLd48eK45JJLYsMNN4x69erFrrvuGpMmTSp3/nvvvTe6desW9evXj/XXXz8OP/zw+O9//1vQ5vvmfh84cGC5513RdVb09Sv7HXfPPfdU6Dr++Mc/Rrt27aJ+/fqx7bbbxnPPPfd9tzS5HXfcMSKioB+WmTlzZrz44ovRt2/fyLIsWrduHfvtt1+5dnPnzo0mTZrE8ccfn982b968GDp0aLRv3z6Ki4tjo402irPOOivmzZtXcGxl35OjR4+OrbfeOurXrx9/+MMf8vt33333eP755+OLL76o8r0AAKgORtYDrCVmzZoV//vf/yLLspgxY0bccMMNMWfOnHKj744//vgYOXJkHHnkkfGLX/wipkyZEr/73e/i9ddfjxdeeKFgOppJkybFQQcdFEcffXQMGDAgbrnllhg4cGB069YtOnfuHBER33zzTfTs2TP++9//xvHHHx8bb7xxvPjiizFkyJD49NNP49prr42OHTvG7bffHoMHD44NN9ww/+f7zZo1KxcWHn/88fHJJ5/EmDFj4vbbb6/w9S9atCj+97//ldu+dOBb0ZrLXHfddbHvvvvGYYcdFvPnz4+77rorDj744HjkkUeib9++ERFx++23xzHHHBPbbrttHHfccRER0a5du4Ln/PnPfx4dO3aMSy+9NB599NG4+OKLY911140//OEPscsuu8Rll10Wd955Z5xxxhmxzTbbxE477RQR340e/vOf/xz9+vWLY489Nr766qu4+eabo0+fPvHyyy9H165dC57ntttui6+++ioGDRoUc+fOjeuuuy522WW
|
2024-05-06 19:23:42 +02:00
|
|
|
"text/plain": [
|
2024-05-07 20:20:09 +02:00
|
|
|
"<Figure size 2000x1800 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.csv')\n",
|
|
|
|
"save_data(costs, f'/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-costs.csv')\n",
|
|
|
|
"save_data(overload_cnt, f'/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-overload_cnt.csv')\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.xaxis.set_major_formatter(ticker.FuncFormatter(lambda x, _: f\"{x:.2f}\"))\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",
|
2024-05-07 21:06:03 +02:00
|
|
|
"execution_count": 9,
|
2024-05-04 09:59:27 +02:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [
|
|
|
|
{
|
|
|
|
"data": {
|
2024-05-07 21:06:03 +02:00
|
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABdIAAAW/CAYAAAConAEjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACkbklEQVR4nOzdd5hdZbk34N9OhkxCSIN0ShqHGooiTVpCCxylCShFQ+giRZogHiVwUCKgyAEVjgKhowIGEBSkhCDSm0gLCSTkAOmkkJA++/uDj9EhyWIGZthhct/XtS6y37XWu581ezD4m2fet1Qul8sBAAAAAACWqUWlCwAAAAAAgBWZIB0AAAAAAAoI0gEAAAAAoIAgHQAAAAAACgjSAQAAAACggCAdAAAAAAAKCNIBAAAAAKCAIB0AAAAAAAoI0gEAAAAAoIAgHQDgE3jqqafy5S9/OW3btk2pVMrzzz/f4Dl69+6dr371q41fHM1GqVTKOeecU/v6mmuuSalUyvjx42vHBgwYkAEDBtS+Hj9+fEqlUq655prPrE4AAGjuBOkAQKN4/fXXc+yxx6Zv375p3bp12rdvn+222y7/8z//k3nz5jX6+73//vs555xz8tBDDzX63B9n0aJFOfDAA/Puu+/mF7/4Ra6//vr06tVrmde+/PLLOeecc+oEn5+1AQMGpFQq1R6rr756ttxyy1x99dWpqanJokWL0rlz52y//fbLnaNcLmfttdfOF7/4xcL3mjNnToYOHZr+/funbdu2WWONNbL55pvnu9/9bt55553GfrQkyfnnn5/bb7+9SeZuqMsuuywdOnTIokWLKl1KRQwZMqTO99q/H61bt650eQAA8IlVVboAAODz7+67786BBx6Y6urqDB48OP3798/ChQvzyCOP5Hvf+15eeuml/OY3v2nU93z//fdz7rnnJkmdbtzPwuuvv54333wzv/3tb3PUUUcVXvvyyy/n3HPPzYABA9K7d+/PpsBlWGuttTJs2LAkydSpU3PdddflyCOPzGuvvZaf/vSnOfDAA/O///u/efPNN5f5Q4GHH344b731Vk455ZTlvseiRYuy44475tVXX81hhx2WE088MXPmzMlLL72Um266Kfvtt1969uzZ6M92/vnn54ADDsi+++7b6HM31N13353dd989q6yySqPMN2/evFRVNew/2Xv16pV58+Y1Wg0NVV1dnSuvvHKp8ZYtW1agGgAAaByCdADgUxk3blwOOuig9OrVKw8++GB69OhRe+7444/P2LFjc/fdd1ewwsY3ZcqUJEnHjh0rW0gDdOjQId/85jdrXx977LFZf/3188tf/jLnnXdeDj300FxxxRW5+eab8/3vf3+p+2+66aa0aNEiBx100HLf4/bbb89zzz2XG2+8MYccckidc/Pnz8/ChQsb74FWQO+//35GjRqVyy+/vNHm/CRd3JXu/q6qqqrzvdbYyuVy5s+fnzZt2jTZewAAwEdZ2gUA+FQuvPDCzJkzJ1dddVWdEP1D6667br773e/Wvl68eHHOO++89OvXL9XV1endu3d+8IMfZMGCBXXue/rppzNo0KB07tw5bdq0SZ8+fXLEEUck+WAN6C5duiRJzj333NqlIz5cS3rSpEk5/PDDs9Zaa6W6ujo9evTIPvvsU6/lVR588MHssMMOadu2bTp27Jh99tknr7zySu35IUOGZKeddkqSHHjggSmVSsvtiL/mmmty4IEHJkkGDhxYW+dHl6N55JFHstVWW6V169bp27dvrrvuuqXmmjlzZk4++eSsvfbaqa6uzrrrrpsLLrggNTU1H/tMy7Lqqqtmm222ydy5czN16tRst9126d27d2666aalrl20aFFuvfXWDBw4sLCj/PXXX0+SbLfddkud+3C5nyQZPnx4SqVSnnvuuaWuO//889OyZcu8/fbbSZIxY8Zk//33T/fu3dO6deustdZaOeiggzJr1qwkH4TGc+fOzbXXXlv79R0yZEjtfG+//XaOOOKIdOvWLdXV1dl4441z9dVX13nPhx56KKVSKX/4wx9y7rnnZs0110y7du1ywAEHZNasWVmwYEFOPvnkdO3aNauttloOP/zwpb5fk+SBBx7IggULsueeeyb513rmjzzySE466aR06dIlHTt2zLHHHpuFCxdm5syZGTx4cDp16pROnTrljDPOSLlcrjPnR9dIr4/lrZH+cd/bSXLOOeekVCpl7NixGTJkSDp27JgOHTrk8MMPz/vvv9+gOop8+D4ftaw14D/cS+Dee+/Nl770pbRp0yb/+7//22i1AABAfehIBwA+lT/96U/p27dvvvzlL9fr+qOOOirXXnttDjjggJx22ml54oknMmzYsLzyyisZMWJEkg86vnffffd06dIl3//+99OxY8eMHz8+f/zjH5MkXbp0yeWXX57jjjsu++23X772ta8lSTbddNMkyf7775+XXnopJ554Ynr37p0pU6bkvvvuy4QJEwqXV7n//vuz5557pm/fvjnnnHMyb968XHbZZdluu+3y7LPPpnfv3jn22GOz5ppr5vzzz89JJ52ULbfcMt26dVvmfDvuuGNOOumkXHrppfnBD36QDTfcMElq/5kkY8eOzQEHHJAjjzwyhx12WK6++uoMGTIkW2yxRTbeeOMkH3Q677TTTnn77bdz7LHHZp111smjjz6as846KxMnTswll1xSr6/9R73xxhtp2bJlOnbsmFKplEMOOSTnn39+Xnrppdr3TpJ77rkn7777bg499NDC+T5cEua6667LD3/4w2UGpUlywAEH5Pjjj8+NN96YL3zhC3XO3XjjjRkwYEDWXHPNLFy4MIMGDcqCBQty4oknpnv37nn77bdz1113ZebMmenQoUOuv/76HHXUUdlqq61yzDHHJEn69euXJJk8eXK22WablEqlnHDCCenSpUv+8pe/5Mgjj8zs2bNz8skn13nvYcOGpU2bNvn+97+fsWPH5rLLLssqq6ySFi1aZMaMGTnnnHPy+OOP55prrkmfPn1y9tln17n/z3/+c7bYYoulvh8+rP3cc8/N448/nt/85jfp2LFjHn300ayzzjo5//zz8+c//zkXXXRR+vfvn8GDBxd+nT+J+nxv/7uvf/3r6dOnT4YNG5Znn302V155Zbp27ZoLLrigXu83bdq0pcZatWpV+8OUhho9enQOPvjgHHvssTn66KOz/vrrf6J5AADgEysDAHxCs2bNKicp77PPPvW6/vnnny8nKR911FF1xk8//fRykvKDDz5YLpfL5REjRpSTlJ966qnlzjV16tRykvLQoUPrjM+YMaOcpHzRRRc16FnK5XJ58803L3ft2rU8ffr02rF//OMf5RYtWpQHDx5cOzZy5MhykvItt9zysXPecsst5STlkSNHLnWuV69e5STlhx9+uHZsypQp5erq6vJpp51WO3beeeeV27ZtW37ttdfq3P/973+/3LJly/KECRMKa9hpp53KG2ywQXnq1KnlqVOnll955ZXySSedVE5S3muvvWqve+mll8pJymeddVad+w866KBy69aty7NmzSp8n/fff7+8/vrrl5OUe/XqVR4yZEj5qquuKk+ePHmpaw8++OByz549y0uWLKkde/bZZ8tJysOHDy+Xy+Xyc889V6+vc9u2bcuHHXbYUuNHHnlkuUePHuVp06Yt9TwdOnQov//+++Vy+V+fZ//+/csLFy6sU2OpVCrvueeede7fdttty7169Vrq/dZZZ50634/Dhw8vJykPGjSoXFNTU+f+UqlU/va3v107tnjx4vJaa61V3mmnnerM+dHv8Q/nHDduXO3YTjvtVOe+cePG1fk6lsv1/94eOnRoOUn5iCOOqFPHfvvtV15jjTWWeuaPOuyww8pJlnkMGjRoqff5qGU934f/ntxzzz0f+/4AANBULO0CAHxis2fPTpK0a9euXtf/+c9/TpKceuqpdcZPO+20JKldS/3DtcfvuuuuLFq0qEE1tWnTJq1atcpDDz2UGTNm1Pu+iRMn5vnnn8+QIUOy+uqr145vuumm2W233Wprb2wbbbRRdthhh9rXXbp0yfrrr5833ni
|
2024-05-04 09:59:27 +02:00
|
|
|
"text/plain": [
|
2024-05-07 20:20:09 +02:00
|
|
|
"<Figure size 2000x1800 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",
|
2024-05-07 10:27:45 +02:00
|
|
|
"execution_count": null,
|
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": []
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2024-05-07 21:06:03 +02:00
|
|
|
"execution_count": 10,
|
2024-05-06 19:23:42 +02:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [
|
|
|
|
{
|
|
|
|
"data": {
|
2024-05-07 21:06:03 +02:00
|
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABdsAAAW/CAYAAABUiSrpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACgxElEQVR4nOzdebid470//vdKduaRzAmSCGJWjaGpeUxoTTUrCUrMSjltfXs0KFWK9lCUXzWIeSiKmiXGSEw5PeaEJMZIKkKIzOv3x252bQkSz05WZL9e17WuK+t5nnWvzxqSm/e+9/0plcvlcgAAAAAAgG+sQaULAAAAAACAbzthOwAAAAAAFCRsBwAAAACAgoTtAAAAAABQkLAdAAAAAAAKErYDAAAAAEBBwnYAAAAAAChI2A4AAAAAAAUJ2wEAAAAAoCBhOwBQWKlUyrHHHltn41155ZUplUp55plnvvbarbfeOltvvXXN/fHjx6dUKuXKK6+sOXbaaaelVCrVWX114f33389ee+2Vdu3apVQq5Y9//GOlS/pWWRY/04V99xbF/O/7+PHjl0hdX2f48OEplUoZPnx4RZ5/aTn44IPTo0ePSpcBAMByTNgOAMup+QHe/FvTpk2zxhpr5Nhjj837779f6fIq7re//W1uv/32ij3/iSeemPvuuy+nnHJKhg4dmv79+1esliXpH//4R0477bRKl7HYKl33JZdcstihPQAAUFnCdgBYzp1xxhkZOnRo/vSnP+X73/9+Lr300vTt2zfTp0+vdGl14v7778/999//ldf893//dz777LNaxyodtj/88MPZbbfdcvLJJ+fAAw/MmmuuWbFalqR//OMfOf300ytdxmL7JnV37949n332WQ466KDFetxBBx2Uzz77LN27d685JmwHAIBvn6pKFwAALFk77bRTNtpooyTJYYcdlnbt2uWCCy7IHXfckf3333+hj/n000/TokWLpVnmN9a4ceOvvaaqqipVVcvWf/ZMmjQpbdu2rXQZ1IE5c+Zk3rx5ady4cZo2bbrYj2/YsGEaNmy4BCoDAACWJivbAaCe2XbbbZMk48aNS1K9j3HLli3z+uuvZ+edd06rVq3y4x//OEl16H7SSSdl5ZVXTpMmTdK7d++cd955KZfLCx372muvTe/evdO0adP06dMnjz76aK3zEyZMyNFHH53evXunWbNmadeuXfbee+8v3at6+vTpOeKII9KuXbu0bt06AwYMyIcffljrmi/u2b4wX9zfu1Qq5dNPP81VV11Vs83OwQcfnGHDhqVUKuW2225bYIzrrrsupVIpI0aM+MrneuONN7L33ntnxRVXTPPmzfO9730vd999d835+dv7lMvlXHzxxTXP/2W+bD/the0PPv+zfOedd7L77runZcuW6dChQ04++eTMnTt3gceed955ufjii7PqqqumefPm2XHHHfPWW2+lXC7nN7/5TVZaaaU0a9Ysu+22W6ZMmbJAbffcc0+22GKLtGjRIq1atcoPfvCDvPjii7Xqufjii2ve8697rYs67le55ppr0qdPnzRr1iwrrrhi9ttvv7z11lsLXDdy5MjsvPPOWWGFFdKiRYusv/76+Z//+Z+vrfvz790f//jH9OrVK02aNMlLL730pXu2v/LKK9lnn33SoUOHNGvWLL17986vfvWrmvNf3LO9R48eefHFF/PII4/UPPfWW2+dN954I6VSKX/4wx8WeD1PPvlkSqVSrr/++q98f95+++3svvvuadGiRTp27JgTTzwxM2fOXOi1I0eOTP/+/dOmTZs0b948W221VZ544ola18z/u/Xaa6/lwAMPTJs2bdKhQ4eceuqpKZfLeeutt7LbbruldevW6dy5c84///xaj581a1Z+/etfp0+fPmnTpk1atGiRLbbYIsOGDat13eff98svv7zmfd94443z9NNPL1D77bffnnXXXTdNmzbNuuuuu9C/00lyww03pE+fPmnVqlVat26d9dZbr+Z7AAAAi2vZWuIFACxxr7/+epKkXbt2NcfmzJmTfv36ZfPNN895552X5s2bp1wuZ9ddd82wYcPyk5/8JN/5zndy33335b/+67/yzjvvLBD4PfLII7nxxhtz/PHHp0mTJrnkkkvSv3//jBo1Kuuuu26S5Omnn86TTz6Z/fbbLyuttFLGjx+fSy+9NFtvvXVeeumlNG/evNaYxx57bNq2bZvTTjstr776ai699NJMmDChJoD+poYOHZrDDjssm2yySQYNGpQk6dWrV773ve9l5ZVXzrXXXps99tij1mOuvfba9OrVK3379v3Scd9///18//vfz/Tp03P88cenXbt2ueqqq7LrrrvmlltuyR577JEtt9wyQ4cOzUEHHZQddtghAwYM+MavY2Hmzp2bfv36ZdNNN815552XBx98MOeff3569eqVo446aoHXNGvWrBx33HGZMmVKzj333Oyzzz7ZdtttM3z48PziF7/I2LFjc9FFF+Xkk0/OX//615rHDh06NAMHDky/fv1yzjnnZPr06bn00kuz+eab5/nnn0+PHj1yxBFH5N13380DDzyQoUOHLlL9izLulznrrLNy6qmnZp999slhhx2WyZMn56KLLsqWW26Z559/vuY3CR544IH88Ic/TJcuXfLTn/40nTt3zssvv5y77rorP/3pTxep7iFDhmTGjBkZNGhQmjRpkhVXXDHz5s1b4Lp//vOf2WKLLdKoUaMMGjQoPXr0yOuvv54777wzZ5111kLH/uMf/5jjjjsuLVu2rAnlO3XqlFVXXTWbbbZZrr322px44om1HnPttdemVatW2W233b70/fnss8+y3Xbb5c0338zxxx+frl27ZujQoXn44YcXuPbhhx/OTjvtlD59+mTw4MFp0KBBhgwZkm233TaPPfZYNtlkk1rX77vvvllrrbXyu9/9LnfffXfOPPPMrLjiirnsssuy7bbb5pxzzsm1116bk08+ORtvvHG23HLLJMnHH3+cv/zlL9l///1z+OGHZ9q0abniiivSr1+/jBo1Kt/5zndqPc91112XadOm5YgjjkipVMq5556bH/3oR3njjTfSqFGjJNVbS+25555Ze+21c/bZZ+eDDz7IIYcckpVWWqnWWA888ED233//bLfddjnnnHOSJC+//HKeeOKJ/PSnP/3S9xEAAL5UGQBYLg0ZMqScpPzggw+WJ0+eXH7rrbfKN9xwQ7ldu3blZs2ald9+++1yuVwuDxw4sJyk/Mtf/rLW42+//fZykvKZZ55Z6/hee+1VLpVK5bFjx9YcS1JOUn7mmWdqjk2YMKHctGnT8h577FFzbPr06QvUOWLEiHKS8tVXX71A7X369CnPmjWr5vi5555bTlK+4447ao5ttdVW5a222qrm/rhx48pJykOGDKk5Nnjw4PIX/7OnRYsW5YEDBy5QzymnnFJu0qRJeerUqTXHJk2aVK6qqioPHjx4ges/74QTTignKT/22GM1x6ZNm1bu2bNnuUePHuW5c+fWHE9SPuaYY75yvHK5XB42bFg5SXnYsGG1ji/sdc7/LM8444xa12644YblPn36LPDYDh061Hqdp5xySjlJeYMNNijPnj275vj+++9fbty4cXnGjBk1r6lt27blww8/vNbzTJw4sdymTZtax4855pgF3vsvszjjfvEzHT9+fLlhw4bls846q9Zj/+///q9cVVVVc3zOnDnlnj17lrt3717+8MMPa107b968r617/nvXunXr8qRJkxZ67vOfyZZbbllu1apVecKECV/6XPO/7+PGjas5ts4669T6Xs932WWXlZOUX3755Zpjs2bNKrdv336h3+fP++Mf/1hOUr7ppptqjn366afl1VZbrdZ3bN68eeXVV1+93K9fv1p1Tp8+vdyzZ8/yDjvsUHNs/ucwaNCgmmNz5swpr7TSSuVSqVT+3e9+V3P8ww8/LDdr1qxWnXPmzCnPnDmzVp0ffvhhuVOnTuVDDz205tj897Zdu3blKVOm1By/4447yknKd955Z82x73znO+UuXbrU+m7ff//95STl7t271xz76U9/Wm7dunV5zpw5X/m+AQD
|
2024-05-06 19:23:42 +02:00
|
|
|
"text/plain": [
|
2024-05-07 20:20:09 +02:00
|
|
|
"<Figure size 2000x1800 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",
|
|
|
|
"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",
|
2024-05-07 21:06:03 +02:00
|
|
|
"version": "3.11.0"
|
2024-05-04 09:59:27 +02:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"nbformat": 4,
|
|
|
|
"nbformat_minor": 2
|
|
|
|
}
|