simple-pv-simulator/main.ipynb

1286 lines
1.2 MiB
Plaintext
Raw Normal View History

2024-05-04 09:59:27 +02:00
{
"cells": [
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 39,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import glob\n",
"import shutil\n",
2024-05-10 17:29:08 +02:00
"import matplotlib.pyplot as plt\n",
"import matplotlib.ticker as ticker\n",
"from matplotlib.ticker import FuncFormatter\n",
"import numpy as np\n",
"import pandas as pd\n",
"import os\n",
"import seaborn as sns\n",
"import json\n",
"from matplotlib.colors import LinearSegmentedColormap\n",
2024-05-06 19:23:42 +02:00
"\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-15 15:06:43 +02:00
"execution_count": 40,
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-15 15:06:43 +02:00
"execution_count": 41,
2024-05-06 19:23:42 +02:00
"metadata": {},
2024-05-15 15:06:43 +02:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Version 0.0.5\n",
"0.25\n"
]
}
],
2024-05-06 19:23:42 +02:00
"source": [
2024-05-07 10:27:45 +02:00
"import json\n",
"\n",
2024-05-10 23:57:58 +02:00
"print(\"Version 0.0.5\")\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-10 17:29:08 +02:00
"\n",
" \n",
"\n",
2024-05-07 10:27:45 +02:00
"time_interval = js_data[\"time_interval\"][\"numerator\"] / js_data[\"time_interval\"][\"denominator\"]\n",
2024-05-10 23:57:58 +02:00
"print(time_interval)\n",
2024-05-07 10:27:45 +02:00
"\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",
2024-05-10 23:57:58 +02:00
"annot_roi = js_data[\"annotated\"][\"roi\"]\n",
2024-05-07 20:20:09 +02:00
"\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",
2024-05-10 23:57:58 +02:00
"title_roi = js_data[\"plot_title\"][\"roi\"]\n",
"\n",
2024-05-07 20:20:09 +02:00
"\n",
"figure_size = (js_data[\"figure_size\"][\"length\"], js_data[\"figure_size\"][\"height\"])\n",
"\n",
2024-05-10 17:29:08 +02:00
"data = pd.read_csv('combined_data.csv')\n",
"\n",
"granularity = js_data[\"time_interval\"][\"numerator\"]\n",
"\n",
"months_days = [31,28,31,30,31,30,31,31,30,31,30,31]\n",
"def get_month_coe(num, granularity):\n",
" return 60 / granularity * 24 * months_days[num]\n",
"\n",
"months_index = [get_month_coe(num, granularity) for num in range(12)]\n",
"months_data = []\n",
"for i in range(1,12):\n",
" months_index[i] += months_index[i-1]\n",
"for i in range(12):\n",
" start = 0 if i == 0 else months_index[i-1]\n",
" end = months_index[i]\n",
" months_data.append(data.iloc[int(start):int(end)])\n",
" \n",
"\n",
"\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-10 17:29:08 +02:00
"# results = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"# affords = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"# costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"# overload_cnt = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n"
2024-05-06 19:23:42 +02:00
]
},
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 42,
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-15 15:06:43 +02:00
"execution_count": 43,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
2024-05-10 17:29:08 +02:00
"def draw_results(results, filename, title_benefit, annot_benefit=False, figure_size=(10, 10)):\n",
" df=results\n",
" df = df.astype(float)\n",
" df.index = df.index / 1000\n",
" df.index = df.index.map(int)\n",
" df.columns = df.columns / 1000\n",
" df.columns = df.columns.map(int)\n",
" min_value = df.min().min()\n",
" max_value = df.max().max()\n",
" max_scale = max(abs(min_value/1000), abs(max_value/1000))\n",
"\n",
" df[df.columns[-1] + 1] = df.iloc[:, -1] \n",
" new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns)\n",
" for i in df.columns:\n",
" new_Data[i] = df[i].iloc[-1]\n",
" df = pd.concat([df, new_Data])\n",
"\n",
" X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
"\n",
" def fmt(x,pos):\n",
" return '{:.0f}'.format(x/1000)\n",
"\n",
" cmap = sns.color_palette(\"coolwarm\", as_cmap=True)\n",
" plt.figure(figsize=figure_size)\n",
" ax = sns.heatmap(df/1000, fmt=\".1f\", cmap=cmap, vmin=-max_scale, vmax=max_scale, annot=annot_benefit)\n",
" CS = ax.contour(X, Y, df, colors='black', alpha=0.5)\n",
" ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt))\n",
" plt.title(title_benefit)\n",
" plt.gca().invert_yaxis()\n",
" plt.xlim(0, df.shape[1] - 1)\n",
" plt.ylim(0, df.shape[0] - 1)\n",
" plt.xlabel('ESS Capacity (MWh)')\n",
" plt.ylabel('PV Capacity (MW)')\n",
" plt.savefig(filename)"
2024-05-06 19:23:42 +02:00
]
},
2024-05-10 23:57:58 +02:00
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 44,
2024-05-10 23:57:58 +02:00
"metadata": {},
"outputs": [],
"source": [
"def draw_roi(costs, results, filename, title_roi, days=365, annot_roi=False, figure_size=(10, 10)):\n",
" costs = costs.astype(float)\n",
" costs = costs / 365 \n",
" costs = costs * days\n",
"\n",
" df = results\n",
" df = costs / df\n",
" if 0 in df.index and 0 in df.columns:\n",
" df.loc[0,0] = 100\n",
" df[df > 80] = 100\n",
" print(df)\n",
"\n",
" df = df.astype(float)\n",
" df.index = df.index / 1000\n",
" df.index = df.index.map(int)\n",
" df.columns = df.columns / 1000\n",
" df.columns = df.columns.map(int)\n",
" min_value = df.min().min()\n",
" max_value = df.max().max()\n",
" print(max_value)\n",
" max_scale = max(abs(min_value), abs(max_value))\n",
"\n",
" df[df.columns[-1] + 1] = df.iloc[:, -1] \n",
" new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns)\n",
" for i in df.columns:\n",
" new_Data[i] = df[i].iloc[-1]\n",
" df = pd.concat([df, new_Data])\n",
"\n",
" X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
"\n",
" def fmt(x,pos):\n",
" return '{:.0f}'.format(x)\n",
"\n",
" cmap = sns.color_palette(\"Greys\", as_cmap=True)\n",
" plt.figure(figsize=figure_size)\n",
" ax = sns.heatmap(df, fmt=\".1f\", cmap=cmap, vmin=0, vmax=100, annot=annot_benefit)\n",
" CS = ax.contour(X, Y, df, colors='black', alpha=0.5)\n",
" ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt))\n",
" plt.title(title_roi)\n",
" plt.gca().invert_yaxis()\n",
" plt.xlim(0, df.shape[1] - 1)\n",
" plt.ylim(0, df.shape[0] - 1)\n",
" plt.xlabel('ESS Capacity (MWh)')\n",
" plt.ylabel('PV Capacity (MW)')\n",
2024-05-15 15:06:43 +02:00
" plt.savefig(filename)\n",
" plt.close()"
2024-05-10 23:57:58 +02:00
]
},
2024-05-06 19:23:42 +02:00
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 45,
2024-05-06 19:23:42 +02:00
"metadata": {},
2024-05-10 17:29:08 +02:00
"outputs": [],
2024-05-06 19:23:42 +02:00
"source": [
2024-05-10 17:29:08 +02:00
"def draw_cost(costs, filename, title_cost, annot_cost=False, figure_size=(10, 10)):\n",
" df = costs\n",
" df = df.astype(int)\n",
" df.index = df.index / 1000\n",
" df.index = df.index.map(int)\n",
" df.columns = df.columns / 1000\n",
" df.columns = df.columns.map(int)\n",
"\n",
" df[df.columns[-1] + 1] = df.iloc[:, -1] \n",
" new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns)\n",
" for i in df.columns:\n",
" new_Data[i] = df[i].iloc[-1]\n",
" df = pd.concat([df, new_Data])\n",
" X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
"\n",
" def fmt(x, pos):\n",
" return '{:.0f}'.format(x / 1000000)\n",
"\n",
" plt.figure(figsize=figure_size)\n",
" ax = sns.heatmap(df/1000000, fmt=\".1f\", cmap='viridis', annot=annot_cost)\n",
" CS = ax.contour(X, Y, df, colors='black', alpha=0.5)\n",
" ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt))\n",
" plt.title(title_cost)\n",
" plt.gca().invert_yaxis()\n",
" plt.xlim(0, df.shape[1] - 1)\n",
" plt.ylim(0, df.shape[0] - 1)\n",
" plt.xlabel('ESS Capacity (MWh)')\n",
" plt.ylabel('PV Capacity (MW)')\n",
2024-05-15 15:06:43 +02:00
" plt.savefig(filename)\n",
" plt.close()"
2024-05-04 09:59:27 +02:00
]
},
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 46,
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-10 17:29:08 +02:00
"def draw_overload(overload_cnt, filename, title_unmet, annot_unmet=False, figure_size=(10, 10), days=365, granularity=15):\n",
" df = overload_cnt\n",
" print(days, granularity)\n",
" coef = 60 / granularity * days * 24\n",
" print(coef)\n",
" print(df)\n",
" df = ( coef - df) / coef\n",
" print(df)\n",
"\n",
" df = df.astype(float)\n",
" df.index = df.index / 1000\n",
" df.index = df.index.map(int)\n",
" df.columns = df.columns / 1000\n",
" df.columns = df.columns.map(int)\n",
"\n",
"\n",
" df[df.columns[-1] + 1] = df.iloc[:, -1] \n",
" new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns)\n",
" for i in df.columns:\n",
" new_Data[i] = df[i].iloc[-1]\n",
" # print(new_Data)\n",
" df = pd.concat([df, new_Data])\n",
"\n",
"\n",
" plt.figure(figsize=figure_size)\n",
" cmap = LinearSegmentedColormap.from_list(\"\", [\"white\", \"blue\"])\n",
" ax = sns.heatmap(df, fmt=\".00%\", cmap=cmap, vmin=0, vmax=1, annot=annot_unmet)\n",
"\n",
" cbar = ax.collections[0].colorbar\n",
2024-05-10 23:57:58 +02:00
" cbar.set_ticks([0, 0.10, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1])\n",
" cbar.set_ticklabels(['0%', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%'])\n",
2024-05-10 17:29:08 +02:00
" cbar.ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f'{x:.0%}'))\n",
" X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
"\n",
" def fmt(x, pos):\n",
" return '{:.0f}%'.format(x * 100)\n",
" CS = ax.contour(X, Y, df, colors='black', alpha=0.5)\n",
"\n",
" ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt))\n",
"\n",
" plt.xlim(0, df.shape[1] - 1)\n",
" plt.ylim(0, df.shape[0] - 1)\n",
" plt.title(title_unmet)\n",
" plt.xlabel('ESS Capacity (MWh)')\n",
" plt.ylabel('PV Capacity (MW)')\n",
2024-05-15 15:06:43 +02:00
" plt.savefig(filename)\n",
" plt.close()"
2024-05-06 19:23:42 +02:00
]
},
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 47,
2024-05-06 19:23:42 +02:00
"metadata": {},
2024-05-10 00:11:34 +02:00
"outputs": [],
2024-05-04 09:59:27 +02:00
"source": [
2024-05-10 17:29:08 +02:00
"def cal_profit(es: EnergySystem, saved_money, days):\n",
" profit = saved_money - es.ess.get_cost_per_year() / 365 * days - es.pv.get_cost_per_year() / 365 * days\n",
" return profit"
2024-05-04 09:59:27 +02:00
]
},
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 48,
2024-05-06 19:23:42 +02:00
"metadata": {},
2024-05-10 17:29:08 +02:00
"outputs": [],
2024-05-06 19:23:42 +02:00
"source": [
2024-05-15 15:06:43 +02:00
"def generate_data(pv_capacity, pv_cost_per_kW, pv_lifetime, pv_loss, ess_capacity, ess_cost_per_kW, ess_lifetime, ess_loss, grid_capacity, grid_loss, sell_price, time_interval, data, days, storage=0):\n",
2024-05-10 17:29:08 +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",
2024-05-15 15:06:43 +02:00
" discharge_power=ess_capacity,\n",
" storage=storage)\n",
2024-05-10 17:29:08 +02:00
" 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",
2024-05-10 23:57:58 +02:00
" (benefit, netto_benefit, gen_energy) = energySystem.simulate(data, time_interval)\n",
2024-05-10 17:29:08 +02:00
" results = cal_profit(energySystem, benefit, days)\n",
" overload_cnt = energySystem.overload_cnt\n",
" costs = energySystem.ess.capacity * energySystem.ess.cost_per_kW + energySystem.pv.capacity * energySystem.pv.cost_per_kW\n",
2024-05-15 15:06:43 +02:00
" return (results, \n",
" overload_cnt,\n",
" costs, \n",
" netto_benefit, \n",
" gen_energy, \n",
" energySystem.generated,\n",
" energySystem.ess_rest,\n",
" energySystem.factory_demand,\n",
" energySystem.buy_price_kWh,\n",
" energySystem.sell_price_kWh,\n",
" energySystem.pv_generated_kWh,\n",
" energySystem.grid_need_power_kW,\n",
" energySystem.time)\n"
2024-05-09 13:15:53 +02:00
]
},
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 49,
2024-05-09 13:15:53 +02:00
"metadata": {},
2024-05-15 15:06:43 +02:00
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:143: RuntimeWarning: invalid value encountered in scalar divide\n",
" self.spring_week_soc.append(self.ess.storage / self.ess.capacity)\n",
"/tmp/ipykernel_250854/3063795989.py:63: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise an error in a future version of pandas. Value '2390.212877551013' has dtype incompatible with int64, please explicitly cast to a compatible dtype first.\n",
" months_ess_rest.loc[pv_capacity, ess_capacity] = ess_rest\n",
"/tmp/ipykernel_250854/3063795989.py:63: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise an error in a future version of pandas. Value '2390.212877551013' has dtype incompatible with int64, please explicitly cast to a compatible dtype first.\n",
" months_ess_rest.loc[pv_capacity, ess_capacity] = ess_rest\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"31 15\n",
"2976.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 1232 1232 1232\n",
"25000.0 1220 1220 1220\n",
"50000.0 1125 1125 1125\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.586022 0.586022 0.586022\n",
"25000.0 0.590054 0.590054 0.590054\n",
"50000.0 0.621976 0.621976 0.621976\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"28 15\n",
"2688.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 1325 1325 1325\n",
"25000.0 1288 1288 1288\n",
"50000.0 1150 1149 1149\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.507068 0.507068 0.507068\n",
"25000.0 0.520833 0.520833 0.520833\n",
"50000.0 0.572173 0.572545 0.572545\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"31 15\n",
"2976.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 1580 1580 1580\n",
"25000.0 1542 1542 1542\n",
"50000.0 1317 1311 1311\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.469086 0.469086 0.469086\n",
"25000.0 0.481855 0.481855 0.481855\n",
"50000.0 0.55746 0.559476 0.559476\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"30 15\n",
"2880.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 2167 2167 2167\n",
"25000.0 1897 1897 1897\n",
"50000.0 1526 1516 1516\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.247569 0.247569 0.247569\n",
"25000.0 0.341319 0.341319 0.341319\n",
"50000.0 0.470139 0.473611 0.473611\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"31 15\n",
"2976.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 1948 1948 1948\n",
"25000.0 1661 1661 1661\n",
"50000.0 1355 1319 1319\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.34543 0.34543 0.34543\n",
"25000.0 0.441868 0.441868 0.441868\n",
"50000.0 0.544691 0.556788 0.556788\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"30 15\n",
"2880.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 1656 1656 1656\n",
"25000.0 1589 1589 1589\n",
"50000.0 1361 1325 1325\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.425 0.425 0.425\n",
"25000.0 0.448264 0.448264 0.448264\n",
"50000.0 0.527431 0.539931 0.539931\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"31 15\n",
"2976.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 1383 1383 1383\n",
"25000.0 1351 1351 1351\n",
"50000.0 974 968 968\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.535282 0.535282 0.535282\n",
"25000.0 0.546035 0.546035 0.546035\n",
"50000.0 0.672715 0.674731 0.674731\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"31 15\n",
"2976.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 1798 1798 1798\n",
"25000.0 1676 1676 1676\n",
"50000.0 1352 1346 1346\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.395833 0.395833 0.395833\n",
"25000.0 0.436828 0.436828 0.436828\n",
"50000.0 0.545699 0.547715 0.547715\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"30 15\n",
"2880.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 2553 2553 2553\n",
"25000.0 2364 2364 2364\n",
"50000.0 2309 2294 2294\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.113542 0.113542 0.113542\n",
"25000.0 0.179167 0.179167 0.179167\n",
"50000.0 0.198264 0.203472 0.203472\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"31 15\n",
"2976.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 2105 2105 2105\n",
"25000.0 1996 1996 1996\n",
"50000.0 1951 1950 1950\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.292675 0.292675 0.292675\n",
"25000.0 0.329301 0.329301 0.329301\n",
"50000.0 0.344422 0.344758 0.344758\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"30 15\n",
"2880.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 2146 2146 2146\n",
"25000.0 2090 2090 2090\n",
"50000.0 2074 2073 2073\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.254861 0.254861 0.254861\n",
"25000.0 0.274306 0.274306 0.274306\n",
"50000.0 0.279861 0.280208 0.280208\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:115: 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:65: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
"/home/stud/hanzhang/simple-pv-simulator/EnergySystem.py:62: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"31 15\n",
"2976.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 1291 1291 1291\n",
"25000.0 1256 1256 1256\n",
"50000.0 1191 1190 1190\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.566196 0.566196 0.566196\n",
"25000.0 0.577957 0.577957 0.577957\n",
"50000.0 0.599798 0.600134 0.600134\n",
"365 15\n",
"35040.0\n",
" 0.0 50000.0 100000.0\n",
"0.0 21184 21184 21184\n",
"25000.0 19930 19930 19930\n",
"50000.0 17685 17566 17566\n",
" 0.0 50000.0 100000.0\n",
"0.0 0.395434 0.395434 0.395434\n",
"25000.0 0.431221 0.431221 0.431221\n",
"50000.0 0.495291 0.498687 0.498687\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyQAAAMKCAYAAAB0rIBCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAD/IUlEQVR4nOzdd3wUdd4H8M/M9pJN75BKCQnVAIJUBSkiimIvCHrqUe5Oebzz8bk7LHceZznPs6Knot6peOLZUERQigrSQek9oaX3bLbOPH+ELFkJkCjZ35L5vF+vvF4wO9l8drI7me/8mqSqqgoiIiIiIiIBZNEBiIiIiIhIu1iQEBERERGRMCxIiIiIiIhIGBYkREREREQkDAsSIiIiIiIShgUJEREREREJw4KEiIiIiIiEYUFCRERERETCsCAhIiIiIiJhWJB0AIcOHYIkSXj99ddFR2m1FStWQJIkrFixos3f+9BDD0GSpHMf6mcoLi7GNddcg9jYWEiShKeffvpnvcbzXTj+juj80lE/U+Fwvr7ssstw5513Bv7/+uuvQ5IkbNiwQVgmatmOHTug1+uxbds20VGI2hULkvNA0x+Llr7+93//V3S8sDV16tSgY+VwONCnTx/87W9/g9vtPqc/695778WSJUvwwAMP4F//+hfGjRvX4n5vv/02nn766VY/b0ZGRtBrMJvN6Nq1K37729+ioqLiHKXv+EaOHBl0HGNiYjBgwAC89tprUBTlnP6sN954Az179oTVakXnzp0xZcoUHDt2rNXff6bPuyRJ+O67785p3jMpLi7Gfffdh5ycHFitVthsNuTn5+PPf/4zqqqq2vVnt/YzFa7a+lkPlW+//RZffPEF7r///nP2nD8+1/74nNXkbIXP5ZdfjoyMjKBtP34+h8OBESNG4NNPP21zzsmTJ+Oyyy5r8/eJlJubiwkTJmDOnDmioxC1K73oANR6jzzyCDIzM4O29ezZE+np6WhoaIDBYBCUrO2GDx+OhoYGGI3Gdv05JpMJr7zyCgCgqqoK77//Pu677z6sX78eCxYsOGc/56uvvsKVV16J++67L7CtW7dup7zGt99+G9u2bcM999zT6ufu27cv/ud//gcA4HK5sHHjRjz99NNYuXIl1q1bd85eQ0fXqVMnzJ07FwBQWlqKN998E3fccQf27NmDv/71r+fkZ3zwwQeYOnUqRowYgVmzZqGkpAQLFy7Enj17kJKS0qbnaunzDgBdunQ5J1nPZv369bjssstQV1eHW265Bfn5+QCADRs24K9//StWrVqFL774ot1+fms/U+HqdJ910efrJ554AqNGjTrn76Pm59rmdDrdz37uSy+9FFOmTIGqqigoKMCLL76IiRMnYvHixRg7dmyrnsPr9WLp0qWBc8D55Je//CUuu+wy7N+/H9nZ2aLjELULFiTnkfHjx6N///4tPtb8LtT5QJblkGTW6/W45ZZbAv+fMWMGLrzwQrz77rt46qmnWrxIVFUVLpcLFoul1T+npKQEUVFRQdvO1WtMTU0Neg2/+MUvYLfb8eSTT2Lv3r3o2rXrz/4ZWhAZGRl0HO+++250794dzz33HP70pz+dkwvEBQsWICYmBp9//nngdz9nzhx4PJ42P9eZPu/traqqCldddRV0Oh02b96MnJycoMcfffRR/POf/2zXDO35mfopnE4nrFbrz36eH7cahFJJSQk+/fRTzJs375w/94/PtedSt27dgp578uTJyM3NxT/+8Y9WFyRff/01amtrMWHChHbJeK75fD4oigKj0YjRo0cjOjoab7zxBh555BHR0YjaBbtsdQAt9UmeOnUq7HY7jh49ikmTJsFutyM+Ph733Xcf/H5/0Pc/+eSTuOiiixAbGwuLxYL8/HwsXLjwlJ8jSRJmzZqFDz/8ED179oTJZEJeXh4+//zzU/Y9evQo7rjjDqSkpMBkMiEzMxPTp08PXJi11Bf866+/xrXXXou0tDSYTCZ07twZ9957LxoaGs7NgULjBc3IkSMBNB43oLFb1OWXX44lS5agf//+sFgseOmllwAABw4cwLXXXouYmBhYrVYMGjQoqKtAUxcEVVXx/PPPB7oVtPQaR44ciU8//RQFBQWB/X7cPaG1kpKSADReBDT5/vvvMXXqVGRlZcFsNiMpKQm33347ysvLg763trYW99xzDzIyMmAymZCQkIBLL70UmzZtCtpv7dq1GDduHCIjI2G1WjFixAh8++23p2T55ptvMGDAAJjNZmRnZweOXWu99957yM/Ph8ViQVxcHG655RYcPXo0aJ+2vJ9bq+n3WV9fj9LSUjz44IMwGAwoLS09Zd+77roLUVFRcLlcZ3xOWZbh8/lOuSvcXnf0FyxYgPz8fERERMDhcKBXr174xz/+EXjc6/Xi4YcfRteuXWE2mxEbG4uhQ4di6dKlZ3zel156CUePHsVTTz11SjECAImJifjDH/4QtO2FF15AXl4eTCYTUlJSMHPmzFO6dY0cORI9e/bEjh07cPHFF8NqtSI1NRWPP/54YJ+2fKaaPP/888jKyoLFYsHAgQPx9ddfY+TIkYHPevPnbfrcN2npOZtybty4EcOHD4fVasX//d//AQA++ugjTJgwIXBuy87Oxp/+9Keg9+GZPuunG0Py1VdfYdiwYbDZbIiKisKVV16JnTt3Bu3TNDZr3759mDp1KqKiohAZGYlp06bB6XSe8nv6sU8//RQ+nw+jR48+676VlZUYOHAgOnXqhN27d591/1Dq0aMH4uLisH///lZ/z6efforc3NzTnnMPHDgASZLw97///ZTHVq9eDUmS8M477wS2HT16FLfffjsSExMDfwtfe+21oO/zeDyYM2cO8vPzERkZCZvNhmHDhmH58uVB+zW9J5588kk8/fTTyM7Ohslkwo4dOwAABoMBI0eOxEcffdTq10t0vmELyXmkuroaZWVlQdvi4uJOu7/f78fYsWNx4YUX4sknn8SyZcvwt7/9DdnZ2Zg+fXpgv3/84x+44oorcPPNN8Pj8WDBggW49tprsWjRolPuJn3zzTf473//ixkzZiAiIgLPPPMMJk+ejMLCQsTGxgIAjh07hoEDB6Kqqgp33XUXcnJycPToUSxcuBBOp/O0F2fvvfcenE4npk+fjtjYWKxbtw7PPvssjhw5gvfee++nHrZTNP0Ra8oLALt378aNN96Iu+++G3feeSe6d++O4uJiXHTRRXA6nfj1r3+N2NhYvPHGG7jiiiuwcOFCXHXVVRg+fDj+9a9/4dZbbw10Kzid3//+96iursaRI0cCf/TsdvtZ83q93sDv3eVyYfPmzXjqqacwfPjwoC49S5cuxYEDBzBt2jQkJSVh+/btePnll7F9+3Z89913gYu6X/7yl1i4cCFmzZqF3NxclJeX45tvvsHOnTtxwQUXAGi8OBo/fjzy8/Px4IMPQpZlzJ8/H5dccgm+/vprDBw4EADwww8/YMyYMYiPj8dDDz0En8+HBx98EImJia36Xbz++uuYNm0aBgwYgLlz56K4uBj/+Mc/8O2332Lz5s1Bd8hb+35uiwMHDkCn0yEqKgq33norHnnkEbz77ruYNWtWYB+Px4OFCxdi8uTJZ72zPW3aNCxYsABz5sz52V1DWvq8S5IUeN8uXboUN954I0aNGoXHHnsMALBz5058++23+M1vfgOg8QJ27ty5+MUvfoGBAweipqYGGzZswKZNm3DppZee9md//PHHsFgsuOaaa1qV9aGHHsLDDz+M0aNHY/r06di9ezdefPFFrF+/Ht9++21Q61NlZSXGjRuHq6++Gtdddx0WLlyI+++/H7169cL48ePb9JkCgBdffBGzZs3CsGHDcO+99+LQoUOYNGkSoqOj0alTp1blb0l5eTnGjx+PG264AbfcckvgPf3666/Dbrdj9uzZsNvt+OqrrzBnzhzU1NTgiSeeAND2z/qyZcswfvx4ZGVl4aGHHkJDQwOeffZZDBkyBJs2bTrlIvq6665DZmYm5s6di02bNuGVV15BQkJC4H1wOqtXr0ZsbCzS09PPuF9ZWRkuvfRSVFRUYOXKla3uJvTj9yvQWIw
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyQAAAMKCAYAAAB0rIBCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3zU9f0H8NftmbvLXfYmCRDCCBC2MkWmKEq1blCrrWj9qW1//dnh6rCO2larVauitSpWHFUciMiWjSgr7CQQstdl3f7+/gg5c5BAosl9vuRez8cjjwd873uXV763vu/vZykkSZJAREREREQkgFJ0ACIiIiIiilwsSIiIiIiISBgWJEREREREJAwLEiIiIiIiEoYFCRERERERCcOChIiIiIiIhGFBQkREREREwrAgISIiIiIiYViQEBERERGRMCxI+oDCwkIoFAq88soroqN02Zo1a6BQKLBmzZpu3/fBBx+EQqHo+VDfQ3l5OX7wgx/A4XBAoVDgr3/96/f6G893cnyO6PzSV99Tcvi8njNnDm699dbg/1955RUoFAps375dWCbq2L59+6BWq7Fnzx7RUYh6FQuS80Dbl0VHP//3f/8nOp5sLVq0KORYWSwW5OXl4c9//jPcbneP/q577rkHK1aswH333YfXXnsNs2bN6nC/N954A3/961+7/LgZGRkhf4Ner0f//v3xi1/8AjU1NT2Uvu+bMmVKyHG02+0YPXo0Xn75ZQQCgR79Xa+++iqGDBkCo9GI1NRU3HjjjTh58mSX73+297tCocDmzZt7NO/ZlJeX4+c//zlycnJgNBphMpmQn5+P3//+96irq+vV393V95Rcdfe9Hi4bN27EZ599hl/+8pc99pinf9ae/pnV5lyFzyWXXIKMjIyQbac/nsViweTJk/HRRx91O+eCBQswZ86cbt9PpNzcXMydOxf333+/6ChEvUotOgB13cMPP4x+/fqFbBsyZAjS09PR0tICjUYjKFn3TZo0CS0tLdBqtb36e3Q6HV588UUAQF1dHd555x38/Oc/x7Zt27B06dIe+z1ffPEFLrvsMvz85z8PbhswYMAZf+Mbb7yBPXv24O677+7yYw8fPhw/+9nPAAAulws7duzAX//6V6xduxZbt27tsb+hr0tJScEjjzwCAKisrMS//vUv3HLLLTh48CD+9Kc/9cjveO+997Bo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
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyQAAAMKCAYAAAB0rIBCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAD7JklEQVR4nOzdd3wb9f0/8Je2ZMmSpzzjmeE4e+9BCNmBQAoljIRAgZIECvnS8ksHq6VQVtkbwig77DCTkE32guzlkXhveWrd/f5wLGxsJ5Jt6ST59eShx4OcTvLLZ41732fJRFEUQUREREREJAG51AGIiIiIiKj7YkFCRERERESSYUFCRERERESSYUFCRERERESSYUFCRERERESSYUFCRERERESSYUFCRERERESSYUFCRERERESSYUFCRERERESSYUESBLKzsyGTyfDmm29KHcVtGzZsgEwmw4YNGzx+7P333w+ZTNb1oTqhqKgIv/vd7xAZGQmZTIannnqqU79joPPHvxEFlmB9T/nD5/WsWbNw8803u/795ptvQiaTYffu3ZJlorYdPnwYSqUSBw8elDoKkVexIAkATV8Wbd3+3//7f1LH81s33HBDi2NlNBoxaNAgPPHEE7BarV36s+666y58//33WLFiBd555x3MmDGjzf3ee+89PPXUU24/b0pKSovfQavVolevXvjzn/+M8vLyLkof/CZPntziOEZERGDEiBF44403IAhCl/6st956C/3790dISAh69OiBhQsXIj8/3+3Hn+/9LpPJsH379i7Nez5FRUW4++67kZGRgZCQEOj1egwbNgz/+te/UFlZ6dWf7e57yl95+l73la1bt+KHH37APffc02XP+dvP2t9+ZjW5UOEzZ84cpKSktNj22+czGo2YNGkSvv76a49zzp8/H7NmzfL4cVLKzMzE7Nmzce+990odhcirlFIHIPc9+OCDSE1NbbGtf//+SE5ORn19PVQqlUTJPDdx4kTU19dDrVZ79edoNBq89tprAIDKykp88sknuPvuu7Fr1y588MEHXfZzfvzxR1x22WW4++67Xdt69+7d6nd87733cPDgQdx5551uP/fgwYPxf//3fwCAhoYG7NmzB0899RQ2btyInTt3dtnvEOwSExPx8MMPAwBKSkrw9ttv46abbsLx48fxyCOPdMnP+Oyzz3DDDTdg0qRJWLZsGYqLi7Fq1SocP34c8fHxHj1XW+93AOjZs2eXZL2QXbt2YdasWaipqcF1112HYcOGAQB2796NRx55BJs2bcIPP/zgtZ/v7nvKX7X3Xpf68/qxxx7DxRdf3OWvo+aftc0pFIpOP/cll1yChQsXQhRF5OTk4MUXX8TcuXPx7bffYvr06W49h91ux5o1a1yfAYHkj3/8I2bNmoVTp04hPT1d6jhEXsGCJIDMnDkTw4cPb/O+5lehAoFcLvdJZqVSieuuu8717yVLlmDUqFH48MMP8eSTT7Z5kiiKIhoaGqDT6dz+OcXFxQgLC2uxrat+x4SEhBa/wx/+8AcYDAY8/vjjOHHiBHr16tXpn9EdmEymFsfx1ltvRZ8+ffDcc8/hn//8Z5ecIH7wwQeIiIjAd9995/rb33vvvbDZbB4/1/ne795WWVmJyy+/HAqFAvv27UNGRkaL+x966CG8+uqrXs3gzfdUR9TV1SEkJKTTz/PbVgNfKi4uxtdff42XXnqpy5/7t5+1Xal3794tnnv+/PnIzMzE008/7XZBsnnzZlRXV2P27NleydjVHA4HBEGAWq3G1KlTER4ejrfeegsPPvig1NGIvIJdtoJAW32Sb7jhBhgMBuTl5WHevHkwGAyIjo7G3XffDafT2eLxjz/+OMaOHYvIyEjodDoMGzYMq1atavVzZDIZli1bhs8//xz9+/eHRqNBv3798N1337XaNy8vDzfddBPi4+Oh0WiQmpqK2267zXVi1lZf8M2bN+PKK69EUlISNBoNevTogbvuugv19fVdc6DQeEIzefJkAI3HDWjsFjVnzhx8//33GD58OHQ6HV5++WUAwOnTp3HllVciIiICISEhGD16dIuuAk1dEERRxPPPP+/qVtDW7zh58mR8/fXXyMnJce332+4J7oqNjQXQeBLQ5Oeff8YNN9yAtLQ0aLVaxMbG4sYbb0RZWVmLx1ZXV+POO+9ESkoKNBoNzGYzLrnkEuzdu7fFfjt27MCMGTNgMpkQEhKCSZMmYevWra2ybNmyBSNGjIBWq0V6errr2Lnr448/xrBhw6DT6RAVFYXrrrsOeXl5Lfbx5PXsrqa/Z21tLUpKSnDfffdBpVKhpKSk1b633HILwsLC0NDQcN7nlMvlcDgcra4Ke+uK/gcffIBhw4YhNDQURqMRAwYMwNNPP+26326344EHHkCvXr2g1WoRGRmJ8ePHY82aNed93pdffhl5eXl48sknWxUjABATE4O///3vLba98MIL6NevHzQaDeLj47F06dJW3bomT56M/v374/Dhw7jooosQEhKChIQEPProo659PHlPNXn++eeRlpYGnU6HkSNHYvPmzZg8ebLrvd78eZve903aes6mnHv27MHEiRMREhKCv/71rwCAL774ArNnz3Z9tqWnp+Of//xni9fh+d7r7Y0h+fHHHzFhwgTo9XqEhYXhsssuw5EjR1rs0zQ26+TJk7jhhhsQFhYGk8mExYsXo66urtXf6be+/vprOBwOTJ069YL7VlRUYOTIkUhMTMSxY8cuuL8v9e3bF1FRUTh16pTbj/n666+RmZnZ7mfu6dOnIZPJ8N///rfVfT/99BNkMhnef/9917a8vDzceOONiImJcX0XvvHGGy0eZ7PZcO+992LYsGEwmUzQ6/WYMGEC1q9f32K/ptfE448/jqeeegrp6enQaDQ4fPgwAEClUmHy5Mn44osv3P59iQINW0gCSFVVFUpLS1tsi4qKand/p9OJ6dOnY9SoUXj88cexdu1aPPHEE0hPT8dtt93m2u/pp5/GpZdeimuvvRY2mw0ffPABrrzySqxevbrV1aQtW7bg008/xZIlSxAaGopnnnkG8+fPR25uLiIjIwEA+fn5GDlyJCorK3HLLbcgIyMDeXl5WLVqFerq6to9Ofv4449RV1eH2267DZGRkdi5cyeeffZZnD17Fh9//HFHD1srTV9iTXkB4NixY1iwYAFuvfVW3HzzzejTpw+KioowduxY1NXV4Y477kBkZCTeeustXHrppVi1ahUuv/xyTJw4Ee+88w6uv/56V7eC9vztb39DVVUVzp496/rSMxgMF8xrt9tdf/eGhgbs27cPTz75JCZOnNiiS8+aNWtw+vRpLF68GLGxsTh06BBeeeUVHDp0CNu3b3ed1P3xj3/EqlWrsGzZMmRmZqKsrAxbtmzBkSNHMHToUACNJ0czZ87EsGHDcN9990Eul2PlypWYMmUKNm/ejJEjRwIAfvnlF0ybNg3R0dG4//774XA4cN999yEmJsatv8Wbb76JxYsXY8SIEXj44YdRVFSEp59+Glu3bsW+fftaXCF39/XsidOnT0OhUCAsLAzXX389HnzwQXz44YdYtmyZax+bzYZVq1Zh/vz5F7yyvXjxYnzwwQe49957O901pK33u0wmc71u16xZgwULFuDiiy/Gf/7zHwDAkSNHsHXrVvzpT38C0HgC+/DDD+MPf/gDRo4cCYvFgt27d2Pv3r245JJL2v3ZX375JXQ6HX73u9+5lfX+++/HAw88gKlTp+K2227DsWPH8OKLL2LXrl3YunVri9aniooKzJgxA1dccQWuuuoqrFq1Cvfccw8GDBiAmTNnevSeAoAXX3wRy5Ytw4QJE3DXXXchOzsb8+bNQ3h4OBITE93K35aysjLMnDkTV199Na677jrXa/rNN9+EwWDA8uXLYTAY8OOPP+Lee++FxWLBY489BsDz9/ratWsxc+ZMpKWl4f7770d9fT2effZZjBs3Dnv37m11En3VVVchNTUVDz/8MPbu3YvXXnsNZrPZ9Tpoz08//YTIyEgkJyefd7/S0lJccsklKC8vx8aNG93uJvTb1yvQWIwbjUa3Hu+uqqoqVFR
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyQAAAMKCAYAAAB0rIBCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hUZd4+8Ht6zaT3BqGFEGqo0juIKIrdlaKLroC76uu+vv52F8uu6666rmvXVbGsiiv2LiBF6VV6KAkJpPc6/ZzfHyFDRpKQQJJnJnN/riuXcuZkcudk5sz5nqcpZFmWQUREREREJIBSdAAiIiIiIgpcLEiIiIiIiEgYFiRERERERCQMCxIiIiIiIhKGBQkREREREQnDgoSIiIiIiIRhQUJERERERMKwICEiIiIiImFYkBARERERkTAsSLqBU6dOQaFQ4M033xQdpc02bNgAhUKBDRs2tPt7H374YSgUio4PdQmKiopw7bXXIjw8HAqFAs8888wl/Y7+zhf/RuRfuut7yhfO15dffjmWLFni+febb74JhUKBXbt2CctEzTt8+DDUajUOHjwoOgpRp2JB4gcaPyya+/q///s/0fF81qJFi7yOlcViweDBg/GPf/wDdru9Q3/Wvffei++++w4PPvgg3nnnHcyaNavZ/d577z0888wzbX7eHj16eP0Oer0effr0we9//3uUl5d3UPrub9KkSV7HMSwsDCNGjMAbb7wBSZI69Ge99dZbSE9Ph9FoRGJiIhYsWID8/Pw2f39r73eFQoFt27Z1aN7WFBUV4f7770dqaiqMRiNMJhMyMjLwl7/8BZWVlZ36s9v6nvJV7X2vd5XNmzfj+++/xwMPPNBhz/nLc+0vz1mNLlT4XHHFFejRo4fXtl8+n8ViwcSJE/HVV1+1O+f8+fNx+eWXt/v7REpLS8OcOXOwYsUK0VGIOpVadABqu0cffRQ9e/b02paeno7k5GRYrVZoNBpBydpvwoQJsFqt0Gq1nfpzdDodXnvtNQBAZWUlPvroI9x///3YuXMnVq1a1WE/54cffsBVV12F+++/37Otb9++5/2O7733Hg4ePIh77rmnzc89ZMgQ/M///A8AwGazYffu3XjmmWewceNG7Nixo8N+h+4uISEBjz/+OACgpKQEb7/9Nm6//XYcO3YMf/vb3zrkZ3zyySdYtGgRJk6ciOXLl6O4uBirV6/GsWPHEBcX167nau79DgC9e/fukKwXsnPnTlx++eWora3Fr371K2RkZAAAdu3ahb/97W/YtGkTvv/++077+W19T/mqlt7ros/XTz75JKZOndrhr6Om59qmVCrVJT/39OnTsWDBAsiyjJycHLz00kuYO3cuvvnmG8ycObNNz+F0OrFmzRrPOcCf/OY3v8Hll1+OkydPolevXqLjEHUKFiR+ZPbs2Rg+fHizjzW9C+UPlEpll2RWq9X41a9+5fn30qVLMWrUKHzwwQd4+umnm71IlGUZNpsNBoOhzT+nuLgYISEhXts66neMj4/3+h1+/etfw2w246mnnsLx48fRp0+fS/4ZgSA4ONjrON55553o168fnn/+efz5z3/ukAvEVatWISwsDN9++63nb79ixQo4HI52P1dr7/fOVllZiauvvhoqlQp79+5Famqq1+OPPfYY/v3vf3dqhs58T12M+vp6GI3GS36eX7YadKXi4mJ89dVXePnllzv8uX95ru1Iffv29Xru+fPnIy0tDf/617/aXJD8+OOPqKmpwZw5czolY0dzuVyQJAlarRbTpk1DaGgo3nrrLTz66KOioxF1CnbZ6gaa65O8aNEimM1m5OXlYd68eTCbzYiMjMT9998Pt9vt9f1PPfUULrvsMoSHh8NgMCAjIwOrV68+7+coFAosX74cn376KdLT06HT6TBgwAB8++235+2bl5eH22+/HXFxcdDpdOjZsyfuuusuz4VZc33Bf/zxR1x33XVISkqCTqdDYmIi7r33Xlit1o45UGi4oJk0aRKAhuMGNHSLuuKKK/Ddd99h+PDhMBgMeOWVVwAAWVlZuO666xAWFgaj0YjRo0d7dRVo7IIgyzJeeOEFT7eC5n7HSZMm4auvvkJOTo5nv192T2irmJgYAA0XAY3279+PRYsWISUlBXq9HjExMbjttttQVlbm9b01NTW455570KNHD+h0OkRFRWH69OnYs2eP137bt2/HrFmzEBwcDKPRiIkTJ2Lz5s3nZfnpp58wYsQI6PV69OrVy3Ps2urDDz9ERkYGDAYDIiIi8Ktf/Qp5eXle+7Tn9dxWjX/Puro6lJSU4KGHHoJGo0FJScl5+95xxx0ICQmBzWZr9TmVSiVcLtd5d4U7647+qlWrkJGRgaCgIFgsFgwcOBD/+te/PI87nU488sgj6NOnD/R6PcLDwzFu3DisWbOm1ed95ZVXkJeXh6effvq8YgQAoqOj8cc//tFr24svvogBAwZAp9MhLi4Oy5YtO69b16RJk5Ceno7Dhw9j8uTJMBqNiI+PxxNPPOHZpz3vqUYvvPACUlJSYDAYMHLkSPz444+YNGmS573e9Hkb3/eNmnvOxpy7d+/GhAkTYDQa8f/+3/8DAHz22WeYM2eO59zWq1cv/PnPf/Z6Hbb2Xm9pDMkPP/yA8ePHw2QyISQkBFdddRWOHDnitU/j2KwTJ05g0aJFCAkJQXBwMBYvXoz6+vrz/k6/9NVXX8HlcmHatGkX3LeiogIjR45EQkICMjMzL7h/V+rfvz8iIiJw8uTJNn/PV199hbS0tBbPuVlZWVAoFPjnP/953mNbtmyBQqHA+++/79mWl5eH2267DdHR0Z7PwjfeeMPr+xwOB1asWIGMjAwEBwfDZDJh/PjxWL9+vdd+ja+Jp556Cs888wx69eoFnU6Hw4cPAwA0Gg0mTZqEzz77rM2/L5G/YQuJH6mqqkJpaanXtoiIiBb3d7vdmDlzJkaNGoWnnnoKa9euxT/+8Q/06tULd911l2e/f/3rX7jyyitxyy23wOFwYNWqVbjuuuvw5Zdfnnc36aeffsLHH3+MpUuXIigoCM8++yzmz5+P3NxchIeHAwDy8/MxcuRIVFZW4o477kBqairy8vKwevVq1NfXt3hx9uGHH6K+vh533XUXwsPDsWPHDjz33HM4c+YMPvzww4s9bOdp/BBrzAsAmZmZuOmmm3DnnXdiyZIl6NevH4qKinDZZZehvr4ev/3tbxEeHo633noLV155JVavXo2rr74aEyZMwDvvvINbb73V062gJX/4wx9QVVWFM2fOeD70zGbzBfM6nU7P391ms2Hv3r14+umnMWHCBK8uPWvWrEFWVhYWL16MmJgYHDp0CK+++ioOHTqEbdu2eS7qfvOb32D16tVYvnw50tLSUFZWhp9++glHjhzBsGHDADRcHM2ePRsZGRl46KGHoFQqsXLlSkyZMgU//vgjRo4cCQA4cOAAZsyYgcjISDz88MNwuVx46KGHEB0d3aa/xZtvvonFixdjxIgRePzxx1FUVIR//etf2Lx5M/bu3et1h7ytr+f2yMrKgkqlQkhICG699VY8+uij+OCDD7B8+XLPPg6HA6tXr8b8+fMveGd78eLFWLVqFVasWHHJXUOae78rFArP63bNmjW46aabMHXqVPz9738HABw5cgSbN2/G7373OwANF7CPP/44fv3rX2PkyJGorq7Grl27sGfPHkyfPr3Fn/3555/DYDDg2muvbVPWhx9+GI888gimTZuGu+66C5mZmXjppZewc+dObN682av1qaKiArNmzcI111yD66+/HqtXr8YDDzyAgQMHYvbs2e16TwHASy+9hOXLl2P8+PG49957cerUKcybNw+hoaFISEhoU/7mlJWVYfbs2bjxxhvxq1/9yvOafvPNN2E2m3HffffBbDbjhx9+wIoVK1BdXY0nn3wSQPvf62vXrsXs2bORkpKChx9+GFarFc899xzGjh2LPXv2nHcRff3116Nnz554/PHHsWfPHrz22muIioryvA5asmXLFoSHhyM5ObnV/UpLSzF9+nSUl5dj48aNbe4m9MvXK9BQjFssljZ9f1tVVVW
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyQAAAMKCAYAAAB0rIBCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hUdfo28Hv6TDKZJJNk0nsISQgQCB1pghQRRVldywqoq67A+lPWXdd3d2276lrXtWLFsioqdkQRkN57J4FU0ntPpp73j5iRgQRmQpKTmbk/15WLcObM5M7JlPOcb5MIgiCAiIiIiIhIBFKxAxARERERkfdiQUJERERERKJhQUJERERERKJhQUJERERERKJhQUJERERERKJhQUJERERERKJhQUJERERERKJhQUJERERERKJhQUJERERERKJhQeIB8vPzIZFI8N5774kdxWkbN26ERCLBxo0bXb7vo48+ColE0vOhLkF5eTl+85vfICgoCBKJBC+++OIl/Y7urj/+jci9eOprqj+8X1955ZW488477f9/7733IJFIsHfvXtEyUeeOHz8OuVyOo0ePih2FqFexIHEDHR8WnX399a9/FTtev7Vw4UKHY6XT6TB06FA8//zzMBqNPfqz7r//fqxZswYPPfQQPvzwQ8ycObPT/T7++GO8+OKLTj9uXFycw++gVqsxYMAA/PnPf0ZNTU0Ppfd8kydPdjiOer0eI0eOxLvvvgubzdajP+v9999Heno6fHx8EB0djfnz56OkpMTp+1/o9S6RSLBz584ezXsh5eXleOCBB5CSkgIfHx/4+voiMzMT//rXv1BXV9erP9vZ11R/5eprva9s27YNP/30Ex588MEee8xz32vPfc/qcLHC56qrrkJcXJzDtnMfT6fTYdKkSfj+++9dzjlv3jxceeWVLt9PTGlpaZg9ezYefvhhsaMQ9Sq52AHIeY8//jji4+MdtqWnpyM2Nhatra1QKBQiJXPdxIkT0draCqVS2as/R6VS4e233wYA1NXV4YsvvsADDzyAPXv2YMWKFT32c37++Wdcc801eOCBB+zbkpOTz/sdP/74Yxw9ehT33Xef04+dkZGBP/3pTwCAtrY27Nu3Dy+++CI2bdqE3bt399jv4OmioqLw1FNPAQAqKyvxwQcf4I477kB2djb+/e9/98jP+Oqrr7Bw4UJMmjQJS5YsQUVFBVauXIns7GxERES49Fidvd4BICkpqUeyXsyePXtw5ZVXoqmpCb/73e+QmZkJANi7dy/+/e9/Y/Pmzfjpp5967ec7+5rqr7p6rYv9fv3ss89i6tSpPf48Ovu99mwymeySH/uKK67A/PnzIQgCCgoK8Prrr2POnDn44YcfMGPGDKcew2w2Y+3atfb3AHfyhz/8AVdeeSVycnKQmJgodhyiXsGCxI3MmjULI0aM6PS2s69CuQOpVNonmeVyOX73u9/Z/79o0SKMHj0an376KV544YVOTxIFQUBbWxs0Go3TP6eiogIBAQEO23rqd4yMjHT4HX7/+99Dq9Xiueeew6lTpzBgwIBL/hnewN/f3+E43n333Rg4cCBeeeUV/POf/+yRE8QVK1ZAr9fjxx9/tP/tH374YZhMJpcf60Kv995WV1eHa6+9FjKZDAcOHEBKSorD7U888QTeeuutXs3Qm6+p7mhpaYGPj88lP865rQZ9qaKiAt9//z2WLVvW44997nttT0pOTnZ47Hnz5iEtLQ3//e9/nS5ItmzZgsbGRsyePbtXMvY0i8UCm80GpVKJadOmITAwEO+//z4ef/xxsaMR9Qp22fIAnfVJXrhwIbRaLYqLizF37lxotVqEhITggQcegNVqdbj/c889h3HjxiEoKAgajQaZmZlYuXLleT9HIpFgyZIl+Prrr5Geng6VSoVBgwbhxx9/PG/f4uJi3HHHHYiIiIBKpUJ8fDzuuece+4lZZ33Bt2zZguuvvx4xMTFQqVSIjo7G/fffj9bW1p45UGg/oZk8eTKA9uMGtHeLuuqqq7BmzRqMGDECGo0Gb7zxBgAgNzcX119/PfR6PXx8fDBmzBiHrgIdXRAEQcCrr75q71bQ2e84efJkfP/99ygoKLDvd273BGeFhYUBaD8J6HD48GEsXLgQCQkJUKvVCAsLw+23347q6mqH+zY2NuK+++5DXFwcVCoVDAYDrrjiCuzfv99hv127dmHmzJnw9/eHj48PJk2ahG3btp2XZevWrRg5ciTUajUSExPtx85Zn3/+OTIzM6HRaBAcHIzf/e53KC4udtjHleezszr+ns3NzaisrMQjjzwChUKBysrK8/a96667EBAQgLa2tgs+plQqhcViOe+qcG9d0V+xYgUyMzPh5+cHnU6HwYMH47///a/9drPZjMceewwDBgyAWq1GUFAQLrvsMqxdu/aCj/vGG2+guLgYL7zwwnnFCACEhobi73//u8O21157DYMGDYJKpUJERAQWL158XreuyZMnIz09HcePH8eUKVPg4+ODyMhIPPPMM/Z9XHlNdXj11VeRkJAAjUaDUaNGYcuWLZg8ebL9tX7243a87jt09pgdOfft24eJEyfCx8cH/+///T8AwDfffIPZs2fb39sSExPxz3/+0+F5eKHXeldjSH7++WdMmDABvr6+CAgIwDXXXIMTJ0447NMxNuv06dNYuHAhAgIC4O/vj9tuuw0tLS3n/Z3O9f3338NisWDatGkX3be2thajRo1CVFQUsrKyLrp/X0pNTUVwcDBycnKcvs/333+PtLS0Lt9zc3NzIZFI8J///Oe827Zv3w6JRIJPPvnEvq24uBi33347QkND7Z+F7777rsP9TCYTHn74YWRmZsLf3x++vr6YMGECNmzY4LBfx3Piueeew4svvojExESoVCocP34cAKBQKDB58mR88803Tv++RO6GLSRupL6+HlVVVQ7bgoODu9zfarVixowZGD16NJ577jmsW7cOzz//PBITE3HPPffY9/vvf/+Lq6++GrfccgtMJhNWrFiB66+/HqtWrTrvatLWrVvx5ZdfYtGiRfDz88NLL72EefPmobCwEEFBQQCAkpISjBo1CnV1dbjrrruQkpKC4uJirFy5Ei0tLV2enH3++edoaWnBPffcg6CgIOzevRsvv/wyioqK8Pnnn3f3sJ2n40OsIy8AZGVl4aabbsLdd9+NO++8EwMHDkR5eTnGjRuHlpYW3HvvvQgKCsL777+Pq6++GitXrsS1116LiRMn4sMPP8Stt95q71bQlb/97W+or69HUVGR/UNPq9VeNK/ZbLb/3dva2nDgwAG88MILmDhxokOXnrVr1yI3Nxe33XYbwsLCcOzYMbz55ps4duwYdu7caT+p+8Mf/oCVK1diyZIlSEtLQ3V1NbZu3YoTJ05g+PDhANpPjmbNmoXMzEw88sgjkEqlWL58OS6//HJs2bIFo0aNAgAcOXIE06dPR0hICB599FFYLBY88sgjCA0Ndepv8d577+G2227DyJEj8dRTT6G8vBz//e9/sW3bNhw4cMDhCrmzz2dX5ObmQiaTISAgALfeeisef/xxfPrpp1iyZIl9H5PJhJUrV2LevHkXvbJ92223YcWKFXj44YcvuWtIZ693iURif96uXbsWN910E6ZOnYqnn34aAHDixAls27YN//d//weg/QT2qaeewu9//3uMGjUKDQ0N2Lt3L/bv348rrriiy5/97bffQqPR4De/+Y1TWR999FE89thjmDZtGu655x5kZWXh9ddfx549e7Bt2zaH1qfa2lrMnDkT1113HW644QasXLkSDz74IAYPHoxZs2a59JoCgNdffx1LlizBhAkTcP/99yM/Px9z585FYGAgoqKinMrfmerqasyaNQs33ngjfve739mf0++99x60Wi2WLl0KrVaLn3/+GQ8//DAaGhrw7LPPAnD9tb5u3TrMmjULCQkJePTRR9Ha2oqXX34Z48ePx/79+887ib7hhhsQHx+Pp556Cvv378fbb78Ng8Fgfx50Zfv27QgKCkJsbOwF96uqqsIVV1yBmpoabNq0yeluQuc+X4H2Ylyn0zl1f2fV19ejtrb
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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Bw8++CCys7NhMBgQFRWF888/HytWrDjt8/773/9GUVERnnjiiZOKEQCIi4vDn/70pzbHnnvuOfTr1w96vR6JiYmYN2/eScO6JkyYgP79+2PPnj2YOHEiTCYTkpKS8MgjjwTO6cx7qsWzzz6LzMxMGI1GjBgxAl9//TUmTJgQeK+3ft6W932L9p6zJefWrVsxbtw4mEwm/PGPfwQAfPTRR5gxY0bgsy0rKwt/+ctf2rwOT/deP9Uckq+++gpjx46F2WxGeHg4Lr30Uuzdu7fNOS1zsw4dOoSbbroJ4eHhsNlsmDNnDhwOx0m/px/79NNP4fV6MXny5DOeW1NTgxEjRiA5ORn79+8/4/ndqW/fvoiOjsbhw4c7/D2ffvopcnNzT/mZm5+fD0mS8M9//vOkx9avXw9JkvDmm28GjhUVFeHmm29GXFxc4G/hyy+/3Ob73G437rvvPuTl5cFms8FsNmPs2LFYtWpVm/NaXhOPPfYYnnzySWRlZUGv12PPnj0AAK1WiwkTJuCjjz7q8M9LFGrYQxJC6urqUFlZ2eZYdHT0Kc/3+XyYOnUqRo4cicceewxffvklHn/8cWRlZeH2228PnPevf/0Ll1xyCa6//nq43W689dZbuOqqq7B06dKT7iZ98803eP/99zF37lyEhYXhqaeewqxZs3Ds2DFERUUBAIqLizFixAjU1tbitttuQ05ODoqKirBkyRI4HI5TNs7effddOBwO3H777YiKisKmTZvw9NNPo7CwEO++++7ZXraTtPwRa8kLAPv378e1116LX/7yl7j11lvRp08flJWV4bzzzoPD4cAdd9yBqKgovPrqq7jkkkuwZMkSXH755Rg3bhz++9//4oYbbggMKziV//u//0NdXR0KCwsDf/QsFssZ83o8nsDv3el0Yvv27XjiiScwbty4NkN6VqxYgfz8fMyZMwfx8fHYvXs3XnjhBezevRvffvttoFH3q1/9CkuWLMH8+fORm5uLqqoqfPPNN9i7dy+GDh0KoLlxNH36dOTl5eH++++HSqXC4sWLMWnSJHz99dcYMWIEAGDnzp2YMmUKYmJi8MADD8Dr9eL+++9HXFxch34Xr7zyCubMmYPhw4dj4cKFKCsrw7/+9S+sW7cO27dvb3OHvKOv587Iz8+HWq1GeHg4brjhBjz00EN4++23MX/+/MA5brcbS5YswaxZs854Z3vOnDl46623cN999/3koSHtvd8lSQq8blesWIFrr70WF1xwAf7xj38AAPbu3Yt169bhN7/5DYDmBuzChQvxi1/8AiNGjIDdbseWLVuwbds2XHjhhaf8tz/++GMYjUZceeWVHcr6wAMP4MEHH8TkyZNx++23Y//+/Xj++eexefNmrFu3rk3vU01NDaZNm4YrrrgCV199NZYsWYJ77rkHAwYMwPTp0zv1ngKA559/HvPnz8fYsWNx11134ejRo7jssssQERGB5OTkDuVvT1VVFaZPn45rrrkGP//5zwOv6VdeeQUWiwULFiyAxWLBV199hfvuuw92ux2PPvoogM6/17/88ktMnz4dmZmZeOCBB9DU1ISnn34aY8aMwbZt205qRF999dXIyMjAwoULsW3bNrz44ouIjY0NvA5OZf369YiKikJaWtppz6usrMSFF16I6upqrFmzpsPDhH78egWai3G
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyQAAAMKCAYAAAB0rIBCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADY00lEQVR4nOzdd3hUVf4G8PdOT+8NQgst9I4gUkSkiAVFXSsIrg2w4Oq67m/Xtuu6a8HeC1ZExYqK9BZAauihl9DSSG/T7vn9ETJkJIFEmTnJnPfzPHnEmcnknZM7k/u9p2lCCAEiIiIiIiIJDLIDEBERERGRuliQEBERERGRNCxIiIiIiIhIGhYkREREREQkDQsSIiIiIiKShgUJERERERFJw4KEiIiIiIikYUFCRERERETSsCAhIiIiIiJpWJAEgEOHDkHTNHz44Yeyo9TbsmXLoGkali1b1uDvfeKJJ6Bp2vkP9QdkZ2fj2muvRUxMDDRNw0svvfSHXmNT1xh/R9S0BOp7qjF8Xl922WW44447PP//4YcfQtM0bNiwQVomqt3OnTthMpmwfft22VGIfIoFSRNQ/ceitq+//e1vsuM1WrfddptXW4WHh6NHjx544YUXYLfbz+vPmj59OubPn49HH30Un3zyCUaPHl3r42bNmoWXXnqp3s/bunVrr9dgs9nQvn17PPzww8jPzz9P6QPfsGHDvNoxOjoa/fr1wwcffABd18/rz/roo4/QtWtXBAcHo0WLFpgwYQKOHz9e7+8/2/td0zT8+uuv5zXv2WRnZ+Ohhx5CamoqgoODERISgj59+uDf//43CgsLffqz6/ueaqwa+l73l1WrVmHBggV45JFHzttz/vaz9refWdXOVfhcfvnlaN26tddtv32+8PBwDB06FD/99FODc44fPx6XXXZZg79Pps6dO2Ps2LF47LHHZEch8imT7ABUf0899RTatGnjdVvXrl3RqlUrVFRUwGw2S0rWcEOGDEFFRQUsFotPf47VasV7770HACgsLMTXX3+Nhx56COvXr8fs2bPP289ZsmQJrrrqKjz00EOe2zp06HDGa5w1axa2b9+OBx54oN7P3bNnT/zlL38BAFRWVmLjxo146aWXsHz5cqxbt+68vYZAl5ycjGeeeQYAkJubi48//hi333479uzZg//+97/n5Wd8++23uO222zB06FBMmzYNOTk5mDNnDvbs2YNmzZo16Llqe78DQLt27c5L1nNZv349LrvsMpSWluKWW25Bnz59AAAbNmzAf//7X6xYsQILFizw2c+v73uqsarrvS778/q5557DJZdcct6Po5qftTUZjcY//NyXXnopJkyYACEEDh8+jDfffBNXXHEF5s2bh1GjRtXrOZxOJxYuXOj5DGhK7r77blx22WXYv38/2rZtKzsOkU+wIGlCxowZg759+9Z6X82rUE2BwWDwS2aTyYRbbrnF8/9TpkzBBRdcgC+++AIzZsyo9SRRCIHKykoEBQXV++fk5OQgMjLS67bz9RqbN2/u9Rr+/Oc/IzQ0FM8//zz27t2L9u3b/+GfoYKIiAivdrzrrrvQsWNHvPbaa/jXv/51Xk4QZ8+ejejoaPzyyy+e3/1jjz0Gh8PR4Oc62/vd1woLC3H11VfDaDQiPT0dqampXvc//fTTePfdd32awZfvqd+jvLwcwcHBf/h5fttr4E85OTn46aef8NZbb5335/7tZ+351KFDB6/nHj9+PDp37oyXX3653gXJypUrUVJSgrFjx/ok4/nmcrmg6zosFgtGjBiBqKgofPTRR3jqqadkRyPyCQ7ZCgC1jUm+7bbbEBoaimPHjmHcuHEIDQ1FXFwcHnroIbjdbq/vf/7553HhhRciJiYGQUFB6NOnD+bMmXPGz9E0DdOmTcN3332Hrl27wmq1okuXLvjll1/OeOyxY8dw++23o1mzZrBarWjTpg3uuecez4lZbWPBV65cieuuuw4tW7aE1WpFixYtMH36dFRUVJyfhkLVCc2wYcMAVLUbUDUs6vLLL8f8+fPRt29fBAUF4e233wYAHDhwANdddx2io6MRHByMAQMGeA0VqB6CIITA66+/7hlWUNtrHDZsGH766SccPnzY87jfDk+or8TERABVJwHVtm7dittuuw0pKSmw2WxITEzE5MmTcfLkSa/vLSkpwQMPPIDWrVvDarUiPj4el156KTZt2uT1uLVr12L06NGIiIhAcHAwhg4dilWrVp2RJS0tDf369YPNZkPbtm09bVdfX331Ffr06YOgoCDExsbilltuwbFjx7we05Djub6qf59lZWXIzc3F448/DrPZjNzc3DMee+eddyIyMhKVlZVnfU6DwQCXy3XGVWFfXdGfPXs2+vTpg7CwMISHh6Nbt254+eWXPfc7nU48+eSTaN++PWw2G2JiYnDRRRdh4cKFZ33et99+G8eOHcOMGTPOKEYAICEhAf/4xz+8bnvjjTfQpUsXWK1WNGvWDFOnTj1jWNewYcPQtWtX7Ny5ExdffDGCg4PRvHlzPPvss57HNOQ9Ve31119HSkoKgoKC0L9/f6xcuRLDhg3zvNdrPm/1+75abc9ZnXPjxo0YMmQIgoOD8fe//x0A8P3332Ps2LGez7a2bdviX//6l9dxeLb3el1zSJYsWYLBgwcjJCQEkZGRuOqqq5CRkeH1mOq5Wfv27cNtt92GyMhIREREYNKkSSgvLz/j9/RbP/30E1wuF0aMGHHOxxYUFKB///5ITk7G7t27z/l4f+rUqRNiY2Oxf//+en/PTz/9hM6dO9f5mXvgwAFomoYXX3zxjPtWr14NTdPw+eefe247duwYJk+ejISEBM/fwg8++MDr+xwOBx577DH06dMHERERCAkJweDBg7F06VKvx1UfE88//zxeeukltG3bFlarFTt37gQAmM1mDBs2DN9//329Xy9RU8MekiakqKgIeXl5XrfFxsbW+Xi3241Ro0bhggsuwPPPP49FixbhhRdeQNu2bXHPPfd4Hvfyyy/jyiuvxM033wyHw4HZs2fjuuuuw48//njG1aS0tDR88803mDJlCsLCwvDKK69g/PjxyMzMRExMDADg+PHj6N+/PwoLC3HnnXciNTUVx44dw5w5c1BeXl7nydlXX32F8vJy3HPPPYiJicG6devw6quv4ujRo/jqq69+b7OdofqPWHVeANi9ezduvPFG3HXXXbjjjjvQsWNHZGdn48ILL0R5eTnuu+8+xMTE4KOPPsKVV16JOXPm4Oqrr8aQIUPwySef4NZbb/UMK6jL//3f/6GoqAhHjx71/NELDQ09Z16n0+n5vVdWViI9PR0zZszAkCFDvIb0LFy4EAcOHMCkSZOQmJiIHTt24J133sGOHTvw66+/ek7q7r77bsyZMwfTpk1D586dcfLkSaSlpSEjIwO9e/cGUHVyNGbMGPTp0wePP/44DAYDZs6cieHDh2PlypXo378/AGDbtm0YOXIk4uLi8MQTT8DlcuHxxx9HQkJCvX4XH374ISZNmoR+/frhmWeeQXZ2Nl5++WWsWrUK6enpXlfI63s8N8SBAwdgNBoRGRmJW2+9FU899RS++OILTJs2zfMYh8OBOXPmYPz48ee8sj1p0iTMnj0bjz322B8eGlLb+13TNM9xu3DhQtx444245JJL8L///Q8AkJGRgVWrVuH+++8HUHUC+8wzz+DPf/4z+vfvj+LiYmzYsAGbNm3CpZdeWufP/uGHHxAUFIRrr722XlmfeOIJPPnkkxgxYgTuuece7N69G2+++SbWr1+PVatWefU+FRQUYPTo0bjmmmtw/fXXY86cOXjkkUfQrVs3jBkzpkHvKQB48803MW3aNAwePBjTp0/HoUOHMG7cOERFRSE5Oble+Wtz8uRJjBkzBjfccANuueUWzzH94YcfIjQ0FA8++CBCQ0OxZMkSPPbYYyguLsZzzz0HoOHv9UWLFmHMmDFISUnBE088gYqKCrz66qsYNGgQNm3adMZJ9PXXX482bdrgmWeewaZNm/Dee+8hPj7ecxzUZfXq1YiJiUGrVq3O+ri8vDxceumlyM/Px/Lly+s9TOi3xyt
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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4YcfRt++fWEymRATE4Pzzz8fy5cvP+X9/uMf/0BxcTGeeuqpEwoWAEhISMBvf/vbDtuef/555Obmwmg0Ijk5GQsWLDihC9mkSZMwcOBA7N69G5MnT4bFYkFKSgoee+yx8D6n855q8/e//x1ZWVkwm80YNWoU1qxZg0mTJoXf6+3vt+1936az+2zLuWXLFkyYMAEWiwW//vWvAQAfffQRZs2aFf5s6927N37/+993eB2e6r1+sjEtK1aswPjx42G1WhEVFYVLLrkE+fn5HfZpGyt24MAB3HjjjYiKioLT6cRNN92E5ubmE56n4y1ZsgSBQABTp07tct/a2lqMGjUKqamp2Lt3b5f7n00DBgxAbGwsDh482O3fWbJkCXJyck76mXvo0CFIkoS//vWvJ9z21VdfQZIkvP322+FtxcXFuPnmm5GQkBD+Lnz11Vc7/J7P58MDDzyAvLw8OJ1OWK1WjB8/Hl9++WWH/dpeE0888QSefvpp9O7dG0ajEbt37wYA6PV6TJo0CR999FG3Hy9RJGJLyzmkvr4eVVVVHbbFxsaedP9gMIjp06dj9OjReOKJJ/D555/jySefRO/evXH77beH93vmmWdw8cUX49prr4XP58M777yDK664AosXLz7hqtTatWvx3//+F3fccQfsdjueffZZzJs3D0VFRYiJiQEAlJSUYNSoUairq8Ntt92G7OxsFBcXY9GiRWhubj7pCdx7772H5uZm3H777YiJicHGjRvx3HPP4ejRo3jvvfe+72E7QdsXXVteANi7dy+uvvpq/OQnP8Gtt96K/v37o7y8HOeddx6am5vx85//HDExMXj99ddx8cUXY9GiRbj00ksxYcIE/Otf/8L1118f7sJwMr/5zW9QX1+Po0ePhr8YbTZbl3n9fn/4efd4PNi2bRueeuopTJgwoUP3oeXLl+PQoUO46aabkJiYiF27duGll17Crl278PXXX4dP/H76059i0aJFuPPOO5GTk4Pq6mqsXbsW+fn5GD58OIDWE6iZM2ciLy8PDz74IDQaDRYuXIgLLrgAa9aswahRowAAO3bswLRp0xAXF4eHHnoIgUAADz74IBISErr1XLz22mu46aabMHLkSDz66KMoLy/HM888g3Xr1mHbtm0drrR39/V8Og4dOgStVouoqChcf/31eOSRR/Duu+/izjvvDO/j8/mwaNEizJs3r8sr5DfddBPeeecdPPDAAz+4G0pn73dJksKv2+XLl+Pqq6/GlClT8Je//AUAkJ+fj3Xr1uEXv/gFgNaT3EcffRQ//vGPMWrUKLjdbmzevBlbt27FhRdeeNK//b///Q9msxmXX355t7I+9NBDePjhhzF16lTcfvvt2Lt3L1544QVs2rQJ69at69CKVVtbixkzZuCyyy7DlVdeiUWLFuG+++7DoEGDMHPmzNN6TwHACy+8gDvvvBPjx4/H3XffjYKCAsydOxfR0dFITU3tVv7OVFdXY+bMmbjqqqtw3XXXhV/Tr732Gmw2G+655x7YbDasWLECDzzwANxuNx5//HEAp/9e//zzzzFz5kxkZWXhoYceQktLC5577jmMGzcOW7duPeFE+8orr0RmZiYeffRRbN26FS+//DLi4+PDr4OT+eqrrxATE4P09PRT7ldVVYULL7wQNTU1WLVqVbe7JB3/egV
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2024-05-09 13:15:53 +02:00
"source": [
2024-05-10 17:29:08 +02:00
"months_results = []\n",
"months_costs = []\n",
"months_overload = []\n",
2024-05-10 23:57:58 +02:00
"months_nettos = []\n",
"months_gen_energy = []\n",
"months_gen_energy2 = []\n",
2024-05-15 15:06:43 +02:00
"months_ess_rest = pd.DataFrame(30, index=pv_capacities, columns= ess_capacities)\n",
"months_csv_data = {}\n",
2024-05-10 17:29:08 +02:00
"for index, month_data in enumerate(months_data):\n",
" results = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
" costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
" overload_cnt = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
2024-05-10 23:57:58 +02:00
" nettos = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
" gen_energies = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
" gen_energies2 = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
2024-05-15 15:06:43 +02:00
" factory_demands = {}\n",
" buy_prices= {}\n",
" sell_prices = {}\n",
" pv_generates = {}\n",
" grid_need_powers = {}\n",
" times = {}\n",
2024-05-10 17:29:08 +02:00
" for pv_capacity in pv_capacities:\n",
2024-05-15 15:06:43 +02:00
" factory_demands[pv_capacity] = {}\n",
" buy_prices[pv_capacity] = {}\n",
" sell_prices[pv_capacity] = {}\n",
" pv_generates[pv_capacity] = {}\n",
" grid_need_powers[pv_capacity] = {}\n",
" times[pv_capacity] = {}\n",
2024-05-10 17:29:08 +02:00
" for ess_capacity in ess_capacities:\n",
2024-05-15 15:06:43 +02:00
" (result, \n",
" overload, \n",
" cost, \n",
" netto,\n",
" gen_energy,\n",
" gen_energy2,\n",
" ess_rest,\n",
" factory_demand,\n",
" buy_price,\n",
" sell_price,\n",
" pv_generate,\n",
" grid_need_power,\n",
" time) = generate_data(pv_capacity=pv_capacity,\n",
" pv_cost_per_kW=pv_cost_per_kW,\n",
" pv_lifetime=pv_lifetime, \n",
" pv_loss=pv_loss, \n",
" ess_capacity=ess_capacity, \n",
" ess_cost_per_kW=ess_cost_per_kW, \n",
" ess_lifetime=ess_lifetime, \n",
" ess_loss=ess_loss, \n",
" grid_capacity=grid_capacity, \n",
" grid_loss=grid_loss, \n",
" sell_price=sell_price, \n",
" time_interval=time_interval, \n",
" data=month_data, \n",
" days=months_days[index],\n",
" storage=months_ess_rest.loc[pv_capacity, ess_capacity])\n",
2024-05-10 17:29:08 +02:00
" results.loc[pv_capacity,ess_capacity] = result\n",
" overload_cnt.loc[pv_capacity,ess_capacity] = overload\n",
" costs.loc[pv_capacity,ess_capacity] = cost\n",
2024-05-10 23:57:58 +02:00
" nettos.loc[pv_capacity,ess_capacity] = netto\n",
" gen_energies.loc[pv_capacity, ess_capacity] = gen_energy\n",
" gen_energies2.loc[pv_capacity, ess_capacity] = gen_energy2\n",
2024-05-15 15:06:43 +02:00
" months_ess_rest.loc[pv_capacity, ess_capacity] = ess_rest\n",
" factory_demands[pv_capacity][ess_capacity] = factory_demand\n",
" buy_prices[pv_capacity][ess_capacity] = buy_price\n",
" sell_prices[pv_capacity][ess_capacity] = sell_price\n",
" pv_generates[pv_capacity][ess_capacity] = pv_generate\n",
" grid_need_powers[pv_capacity][ess_capacity] = grid_need_power\n",
" times[pv_capacity][ess_capacity] = time\n",
" months_csv_data[index] = {\"factory_demand\": factory_demands, \"buy_price\": buy_prices, \"sell_price\": sell_prices, \"pv_generate\": pv_generates, \"grid_need_power\": grid_need_powers, \"time\": times}\n",
2024-05-10 17:29:08 +02:00
" months_results.append(results)\n",
" months_costs.append(costs)\n",
" months_overload.append(overload_cnt)\n",
2024-05-10 23:57:58 +02:00
" months_nettos.append(nettos)\n",
" months_gen_energy.append(gen_energies)\n",
" months_gen_energy2.append(gen_energies2)\n",
2024-05-10 17:29:08 +02:00
" draw_results(results=results, \n",
2024-05-10 23:57:58 +02:00
" filename=f'plots/pv-{pv_capacity}-ess-{ess_capacity}-month-{index+1}-benefit.png',\n",
2024-05-10 17:29:08 +02:00
" title_benefit=title_benefit,\n",
" annot_benefit=annot_benefit,\n",
" figure_size=figure_size)\n",
" draw_overload(overload_cnt=overload_cnt, \n",
2024-05-10 23:57:58 +02:00
" filename=f'plots/pv-{pv_capacity}-ess-{ess_capacity}-month-{index+1}-unmet.png',\n",
2024-05-10 17:29:08 +02:00
" title_unmet=title_unmet,\n",
" annot_unmet=annot_unmet,\n",
" figure_size=figure_size,\n",
" days=months_days[index],\n",
" granularity=granularity)\n",
"annual_result = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"annual_costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"annual_overload = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
2024-05-10 23:57:58 +02:00
"annual_nettos = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"annual_gen = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"annual_gen2 = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"\n",
"\n",
2024-05-10 17:29:08 +02:00
"# get the yearly results\n",
"for pv_capacity in pv_capacities:\n",
" for ess_capacity in ess_capacities:\n",
" results = 0\n",
" costs = 0\n",
" overload_cnt = 0\n",
2024-05-10 23:57:58 +02:00
" nettos = 0\n",
" gen = 0\n",
" gen2 = 0\n",
2024-05-10 17:29:08 +02:00
" for index, month_data in enumerate(months_data):\n",
" results += months_results[index].loc[pv_capacity,ess_capacity]\n",
" costs += months_costs[index].loc[pv_capacity,ess_capacity]\n",
" overload_cnt += months_overload[index].loc[pv_capacity, ess_capacity]\n",
2024-05-10 23:57:58 +02:00
" nettos += months_nettos[index].loc[pv_capacity, ess_capacity]\n",
" gen += months_gen_energy[index].loc[pv_capacity, ess_capacity]\n",
" gen2 += months_gen_energy[index].loc[pv_capacity, ess_capacity]\n",
2024-05-10 17:29:08 +02:00
" annual_result.loc[pv_capacity, ess_capacity] = results\n",
" annual_costs.loc[pv_capacity, ess_capacity] = costs\n",
" annual_overload.loc[pv_capacity, ess_capacity] = overload_cnt\n",
2024-05-10 23:57:58 +02:00
" annual_nettos.loc[pv_capacity, ess_capacity] = nettos\n",
" annual_gen.loc[pv_capacity, ess_capacity] = gen\n",
" annual_gen2.loc[pv_capacity, ess_capacity] = gen2\n",
2024-05-10 17:29:08 +02:00
"\n",
"draw_cost(costs=annual_costs,\n",
" filename='plots/annual_cost.png',\n",
" title_cost=title_cost,\n",
" annot_cost=annot_cost,\n",
" figure_size=figure_size)\n",
"draw_results(results=annual_result,\n",
" filename='plots/annual_benefit.png',\n",
" title_benefit=title_benefit,\n",
" annot_benefit=annot_benefit,\n",
" figure_size=figure_size)\n",
"draw_overload(overload_cnt=annual_overload,\n",
" filename='plots/annual_unmet.png',\n",
" title_unmet=title_unmet,\n",
" annot_unmet=annot_unmet,\n",
" figure_size=figure_size)"
2024-05-09 13:15:53 +02:00
]
},
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 50,
"metadata": {},
"outputs": [],
"source": [
"def collapse_months_csv_data(months_csv_data, column_name,pv_capacies, ess_capacities):\n",
" data = {}\n",
" for pv_capacity in pv_capacities:\n",
" data[pv_capacity] = {}\n",
" for ess_capacity in ess_capacities:\n",
" annual_data = []\n",
" for index, month_data in enumerate(months_data):\n",
" annual_data.extend(months_csv_data[index][column_name][pv_capacity][ess_capacity])\n",
" # months_csv_data[index][column_name][pv_capacity][ess_capacity] = months_csv_data[index][column_name][pv_capacity][ess_capacity].tolist()\n",
"\n",
" data[pv_capacity][ess_capacity] = annual_data\n",
" return data "
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [],
"source": [
"annual_pv_gen = collapse_months_csv_data(months_csv_data, \"pv_generate\", pv_capacities, ess_capacities)\n",
"annual_time = collapse_months_csv_data(months_csv_data, \"time\", pv_capacities, ess_capacities)\n",
"annual_buy_price = collapse_months_csv_data(months_csv_data, \"buy_price\",pv_capacities, ess_capacities)\n",
"annual_sell_price = collapse_months_csv_data(months_csv_data, \"sell_price\", pv_capacities, ess_capacities)\n",
"annual_factory_demand = collapse_months_csv_data(months_csv_data, \"factory_demand\", pv_capacities, ess_capacities)\n",
"annual_grid_need_power = collapse_months_csv_data(months_csv_data, \"grid_need_power\", pv_capacities, ess_capacities)\n",
"\n",
"for pv_capacity in pv_capacities:\n",
" for ess_capacity in ess_capacities:\n",
" with open(f'data/annual_data-pv-{pv_capacity}-ess-{ess_capacity}.csv', 'w') as f:\n",
" f.write(\"time,pv_generate,factory_demand,buy_price,sell_price,grid_need_power\\n\")\n",
" for i in range(len(annual_time[pv_capacity][ess_capacity])):\n",
" f.write(f\"{annual_time[pv_capacity][ess_capacity][i]}, {int(annual_pv_gen[pv_capacity][ess_capacity][i])}, {int(annual_factory_demand[pv_capacity][ess_capacity][i])}, {int(annual_buy_price[pv_capacity][ess_capacity][i]*1000)}, {int(annual_sell_price[pv_capacity][ess_capacity][i]*1000)}, {int(annual_grid_need_power[pv_capacity][ess_capacity][i])}\\n\")\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 52,
2024-05-09 13:15:53 +02:00
"metadata": {},
2024-05-10 17:29:08 +02:00
"outputs": [],
2024-05-09 13:15:53 +02:00
"source": [
2024-05-10 17:29:08 +02:00
"def save_data(data, filename):\n",
" data.to_csv(filename+'.csv')\n",
" data.to_json(filename + '.json')"
]
},
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 53,
2024-05-10 17:29:08 +02:00
"metadata": {},
"outputs": [],
"source": [
"if not os.path.isdir('data'):\n",
" os.makedirs('data')\n",
"\n",
2024-05-10 23:57:58 +02:00
"save_data(annual_result, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-results')\n",
"save_data(annual_costs, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-costs')\n",
"save_data(annual_overload, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-overload_cnt')"
]
},
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 54,
2024-05-10 23:57:58 +02:00
"metadata": {},
2024-05-15 15:06:43 +02:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x1000 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2024-05-10 23:57:58 +02:00
"source": [
"draw_results(annual_result, 'plots/test.png', 'test', False)"
]
},
{
"cell_type": "code",
2024-05-15 15:06:43 +02:00
"execution_count": 55,
2024-05-10 23:57:58 +02:00
"metadata": {},
2024-05-15 15:06:43 +02:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 0.0 50000.0 100000.0\n",
"0.0 100 100 100\n",
"25000.0 100 100 100\n",
"50000.0 100 100 100\n",
"100.0\n"
]
}
],
2024-05-10 23:57:58 +02:00
"source": [
"draw_roi(annual_costs, annual_nettos, 'plots/annual_roi.png', title_roi, 365, annot_benefit, figure_size)\n"
2024-05-09 13:15:53 +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-10 00:11:34 +02:00
"version": "3.11.9"
2024-05-04 09:59:27 +02:00
}
},
"nbformat": 4,
"nbformat_minor": 2
}