simple-pv-simulator/main.ipynb

775 lines
462 KiB
Plaintext
Raw Normal View History

2024-05-04 09:59:27 +02:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import glob\n",
"import shutil\n",
"\n",
"def clear_folder_make_ess_pv(folder_path):\n",
2024-05-07 20:20:09 +02:00
" if os.path.isdir(folder_path):\n",
" shutil.rmtree(folder_path)\n",
2024-05-06 19:23:42 +02:00
" os.makedirs(folder_path)\n",
" os.makedirs(os.path.join(folder_path,'ess'))\n",
" os.makedirs(os.path.join(folder_path,'pv'))\n",
"\n",
"folder_path = 'plots'\n",
"clear_folder_make_ess_pv(folder_path)"
]
},
{
"cell_type": "code",
"execution_count": 2,
2024-05-04 09:59:27 +02:00
"metadata": {},
2024-05-04 16:35:55 +02:00
"outputs": [],
2024-05-04 09:59:27 +02:00
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np\n",
"import pandas as pd\n",
"from EnergySystem import EnergySystem\n",
2024-05-07 20:20:09 +02:00
"from config import pv_config, grid_config, ess_config\n"
2024-05-06 19:23:42 +02:00
]
},
{
"cell_type": "code",
"execution_count": 3,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Version 0.0.2\n"
]
}
],
2024-05-06 19:23:42 +02:00
"source": [
2024-05-07 10:27:45 +02:00
"import json\n",
"\n",
"print(\"Version 0.0.2\")\n",
"\n",
2024-05-07 10:27:45 +02:00
"with open('config.json', 'r') as f:\n",
" js_data = json.load(f)\n",
"\n",
2024-05-04 09:59:27 +02:00
"data = pd.read_csv('combined_data.csv')\n",
2024-05-07 10:27:45 +02:00
"time_interval = js_data[\"time_interval\"][\"numerator\"] / js_data[\"time_interval\"][\"denominator\"]\n",
"\n",
"pv_loss = js_data[\"pv\"][\"loss\"]\n",
"pv_cost_per_kW = js_data[\"pv\"][\"cost_per_kW\"]\n",
"pv_lifetime = js_data[\"pv\"][\"lifetime\"]\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"ess_loss = js_data[\"ess\"][\"loss\"]\n",
"ess_cost_per_kW = js_data[\"ess\"][\"cost_per_kW\"]\n",
"ess_lifetime = js_data[\"ess\"][\"lifetime\"]\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"grid_loss = js_data[\"grid\"][\"loss\"]\n",
"sell_price = js_data[\"grid\"][\"sell_price\"] #kWh\n",
"grid_capacity = js_data[\"grid\"][\"capacity\"] #kWh\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"pv_begin = js_data[\"pv_capacities\"][\"begin\"]\n",
"pv_end = js_data[\"pv_capacities\"][\"end\"]\n",
"pv_groups = js_data[\"pv_capacities\"][\"groups\"]\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"ess_begin = js_data[\"ess_capacities\"][\"begin\"]\n",
"ess_end = js_data[\"ess_capacities\"][\"end\"]\n",
"ess_groups = js_data[\"ess_capacities\"][\"groups\"]\n",
2024-05-07 20:20:09 +02:00
"\n",
"annot_unmet = js_data[\"annotated\"][\"unmet_prob\"]\n",
"annot_benefit = js_data[\"annotated\"][\"benefit\"]\n",
"annot_cost = js_data[\"annotated\"][\"cost\"]\n",
"\n",
"title_unmet = js_data[\"plot_title\"][\"unmet_prob\"]\n",
"title_cost = js_data[\"plot_title\"][\"cost\"]\n",
"title_benefit = js_data[\"plot_title\"][\"benefit\"]\n",
"\n",
"figure_size = (js_data[\"figure_size\"][\"length\"], js_data[\"figure_size\"][\"height\"])\n",
"\n",
2024-05-07 10:27:45 +02:00
"pv_capacities = np.linspace(pv_begin, pv_end, pv_groups)\n",
"ess_capacities = np.linspace(ess_begin, ess_end, ess_groups)\n",
2024-05-06 19:23:42 +02:00
"results = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"affords = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
2024-05-07 10:27:45 +02:00
"costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
2024-05-06 19:23:42 +02:00
"overload_cnt = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"hour_demand = []\n",
"for index, row in data.iterrows():\n",
" time = row['time']\n",
" demand = row['demand']\n",
" if time.endswith('00'):\n",
" hour_demand.append(demand)\n",
"plt.figure(figsize=(10,8))\n",
"plt.plot(hour_demand)\n",
"plt.ylabel('Demand Power / kW')\n",
"plt.savefig('plots/demand.png')\n",
"plt.close()"
]
},
{
"cell_type": "code",
"execution_count": 5,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"def cal_profit(es: EnergySystem, saved_money):\n",
" profit = saved_money - es.ess.get_cost_per_year() - es.pv.get_cost_per_year()\n",
" return profit"
]
},
{
"cell_type": "code",
"execution_count": 6,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ess_capacity:0.0\n",
"pv_capacity:0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2024-05-09 13:15:53 +02:00
"d:\\simple-pv-simulator\\EnergySystem.py:52: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
2024-05-09 13:15:53 +02:00
"d:\\simple-pv-simulator\\EnergySystem.py:95: RuntimeWarning: invalid value encountered in scalar divide\n",
" log = f\"index: {index}, time: {time}, SoC:{self.ess.storage / self.ess.capacity}%, storage: {self.ess.storage}, pv_gen:{generated_pv_power}, power_demand: {factory_demand}, overload_cnt:{self.overload_cnt}, day:{int(index/96) + 1}\"\n",
2024-05-09 13:15:53 +02:00
"d:\\simple-pv-simulator\\EnergySystem.py:49: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
2024-05-09 13:15:53 +02:00
"d:\\simple-pv-simulator\\EnergySystem.py:120: RuntimeWarning: invalid value encountered in scalar divide\n",
" self.spring_week_soc.append(self.ess.storage / self.ess.capacity)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
2024-05-09 13:15:53 +02:00
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:11111.111111111111\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:22222.222222222223\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:33333.333333333336\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:44444.444444444445\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:55555.555555555555\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:66666.66666666667\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:77777.77777777778\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:88888.88888888889\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:100000.0\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n"
2024-05-06 19:23:42 +02:00
]
}
],
"source": [
"for ess_capacity in ess_capacities:\n",
" print(f\"ess_capacity:{ess_capacity}\")\n",
" for pv_capacity in pv_capacities:\n",
" print(f\"pv_capacity:{pv_capacity}\")\n",
2024-05-04 09:59:27 +02:00
" pv = pv_config(capacity=pv_capacity, \n",
" cost_per_kW=pv_cost_per_kW,\n",
" lifetime=pv_lifetime, \n",
" loss=pv_loss)\n",
" ess = ess_config(capacity=ess_capacity, \n",
" cost_per_kW=ess_cost_per_kW, \n",
" lifetime=ess_lifetime, \n",
" loss=ess_loss,\n",
" charge_power=ess_capacity,\n",
" discharge_power=ess_capacity)\n",
" grid = grid_config(capacity=grid_capacity, \n",
" grid_loss=grid_loss,\n",
" sell_price= sell_price)\n",
" energySystem = EnergySystem(pv_type=pv, \n",
" ess_type=ess, \n",
" grid_type= grid)\n",
" benefit = energySystem.simulate(data, time_interval)\n",
2024-05-06 19:23:42 +02:00
" results.loc[pv_capacity,ess_capacity] = cal_profit(energySystem, benefit)\n",
" affords.loc[pv_capacity,ess_capacity] = energySystem.afford\n",
" overload_cnt.loc[pv_capacity,ess_capacity] = energySystem.overload_cnt\n",
2024-05-07 10:27:45 +02:00
" costs.loc[pv_capacity,ess_capacity] = energySystem.ess.capacity * energySystem.ess.cost_per_kW + energySystem.pv.capacity * energySystem.pv.cost_per_kW\n",
2024-05-06 19:23:42 +02:00
" pv_generated = energySystem.day_generated\n",
" ess_generated = energySystem.hour_stored\n",
" ess_generated_2 = energySystem.hour_stored_2\n",
" plt.figure(figsize=(10,8));\n",
" plt.plot(ess_generated)\n",
" plt.xlabel('day #')\n",
" plt.ylabel('SoC %')\n",
" plt.title(f'14:00 ESS SoC \\n PV cap:{pv_capacity}, ESS cap:{ess_capacity}')\n",
" plt.savefig(f'plots/ess/1400-{pv_capacity}-{ess_capacity}.png')\n",
" plt.close()\n",
" plt.figure(figsize=(10,8));\n",
" plt.plot(ess_generated_2)\n",
" plt.xlabel('day #')\n",
" plt.ylabel('SoC%')\n",
" plt.title(f'08:00 ESS SoC \\n PV cap:{pv_capacity}, ESS cap:{ess_capacity}')\n",
" plt.savefig(f'plots/ess/0800-{pv_capacity}-{ess_capacity}.png')\n",
" plt.close()\n",
2024-05-07 20:20:09 +02:00
" # print(energySystem.unmet)\n",
" # spring_week_start = energySystem.season_start\n",
" # spring_week_end = spring_week_start + energySystem.week_length\n",
2024-05-07 10:27:45 +02:00
" # summer_week_start = energySystem.season_start + 1 * energySystem.season_step\n",
" # summer_week_end = summer_week_start + energySystem.week_length\n",
" # autumn_week_start = energySystem.season_start + 2 * energySystem.season_step\n",
" # autumn_week_end = autumn_week_start + energySystem.week_length\n",
" # winter_week_start = energySystem.season_start + 3 * energySystem.season_step\n",
" # winter_week_end = winter_week_start+ energySystem.week_length\n",
2024-05-06 19:23:42 +02:00
"\n",
" # spring_consume_data = []\n",
2024-05-07 10:27:45 +02:00
" # summer_consume_data = []\n",
" # autumn_consume_data = []\n",
" # winter_consume_data = []\n",
" # for index, row in data.iterrows():\n",
" # if index in range(spring_week_start, spring_week_end):\n",
" # spring_consume_data.append(row['demand'])\n",
2024-05-07 10:27:45 +02:00
" # elif index in range(summer_week_start, summer_week_end):\n",
" # summer_consume_data.append(row['demand'])\n",
" # elif index in range(autumn_week_start, autumn_week_end):\n",
" # autumn_consume_data.append(row['demand'])\n",
" # elif index in range(winter_week_start, winter_week_end):\n",
" # winter_consume_data.append(row['demand'])\n",
2024-05-06 19:23:42 +02:00
"\n",
" # spring_week_time = list(range(spring_week_start, spring_week_end))\n",
2024-05-07 10:27:45 +02:00
" # summer_week_time = list(range(summer_week_start, summer_week_end))\n",
" # autumn_week_time = list(range(autumn_week_start, autumn_week_end))\n",
" # winter_week_time = list(range(winter_week_start, winter_week_end))\n",
2024-05-06 19:23:42 +02:00
"\n",
" # spring_pv_generated = energySystem.spring_week_gen\n",
2024-05-07 10:27:45 +02:00
" # summer_pv_generated = energySystem.summer_week_gen\n",
" # autumn_pv_generated = energySystem.autumn_week_gen\n",
" # winter_pv_generated = energySystem.winter_week_gen\n",
"\n",
" # spring_soc = energySystem.spring_week_soc\n",
" # summer_soc = energySystem.summer_week_soc\n",
" # autumn_soc = energySystem.autumn_week_soc\n",
" # winter_soc = energySystem.winter_week_soc\n",
"\n",
"\n",
" # fig, ax1 = plt.subplots()\n",
2024-05-06 19:23:42 +02:00
"\n",
" # plt.plot(spring_week_time, spring_pv_generated, label = 'pv generation')\n",
" # plt.plot(spring_week_time, spring_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW spring week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-spring.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
" # plt.plot(summer_week_time, summer_pv_generated, label = 'pv generation')\n",
" # plt.plot(summer_week_time, summer_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW summer week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-summer.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
" # plt.plot(autumn_week_time, autumn_pv_generated, label = 'pv generation')\n",
" # plt.plot(autumn_week_time, autumn_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW autumn week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-autumn.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
" # plt.plot(winter_week_time, winter_pv_generated, label = 'pv generation')\n",
" # plt.plot(winter_week_time, winter_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW winter week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-winter.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
" # plt.figure();\n",
" # plt.plot(pv_generated)\n",
" # plt.xlabel('day #')\n",
" # plt.ylabel('Electricity kWh')\n",
" # plt.title(f'PV generated pv cap:{pv_capacity}, ess cap:{ess_capacity}')\n",
" # plt.savefig(f'plots/pv/{pv_capacity}-{ess_capacity}.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
"\n",
2024-05-04 16:35:55 +02:00
" # plt.show()\n",
"\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-04 16:35:55 +02:00
" \n",
"\n",
"# results = results.astype(float)\n",
2024-05-04 09:59:27 +02:00
"\n",
"\n",
"# pv = pv_config(capacity=100000,cost_per_kW=200,lifetime=25,loss=0.95)\n",
"# ess = ess_config(capacity=100000,cost_per_kW=300,lifetime=25,loss=0.95,charge_power=100000,discharge_power=100000)\n",
"# grid = grid_config(price_schedule=price_schedule, capacity=5000, grid_loss=0.95, sell_price=0.4)\n",
"# grid = grid_config(capacity=50000, grid_loss=0.95, sell_price=0.4)\n",
"\n",
"\n",
" # print(benefit)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
2024-05-06 19:23:42 +02:00
"metadata": {},
2024-05-07 21:06:03 +02:00
"outputs": [],
2024-05-06 19:23:42 +02:00
"source": [
2024-05-07 21:06:03 +02:00
"def save_data(data, filename):\n",
" data.to_csv(filename+'.csv')\n",
" data.to_json(filename + '.json')"
2024-05-06 19:23:42 +02:00
]
},
{
"cell_type": "code",
2024-05-09 13:15:53 +02:00
"execution_count": 17,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"data": {
2024-05-09 13:15:53 +02:00
"image/png": "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
2024-05-06 19:23:42 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
2024-05-06 19:23:42 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
2024-05-04 09:59:27 +02:00
"source": [
2024-05-07 20:20:09 +02:00
"import matplotlib.ticker as ticker\n",
2024-05-09 13:15:53 +02:00
"from matplotlib.ticker import MaxNLocator, MultipleLocator, FuncFormatter\n",
2024-05-07 21:06:03 +02:00
"\n",
"if not os.path.isdir('data'):\n",
" os.makedirs('data')\n",
"\n",
"save_data(results, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-results')\n",
"save_data(costs, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-costs')\n",
"save_data(overload_cnt, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-overload_cnt')\n",
2024-05-04 09:59:27 +02:00
"df=results\n",
2024-05-04 16:35:55 +02:00
"df = df.astype(float)\n",
2024-05-06 19:23:42 +02:00
"df.index = df.index / 1000\n",
2024-05-09 13:15:53 +02:00
"df.index = df.index.map(int)\n",
2024-05-06 19:23:42 +02:00
"df.columns = df.columns / 1000\n",
2024-05-09 13:15:53 +02:00
"df.columns = df.columns.map(int)\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",
2024-05-09 13:15:53 +02:00
"ax = plt.gca().invert_yaxis()\n",
"# ax = plt.gca()\n",
"# 定义一个函数,确保刻度标签为整数\n",
"# def format_func(value, tick_number):\n",
" # 返回格式化的刻度标签\n",
" # return f\"{int(value)}\"\n",
"\n",
"# 使用 FuncFormatter 确保坐标轴刻度为整数\n",
"# ax.xaxis.set_major_formatter(FuncFormatter(format_func))\n",
"# ax.yaxis.set_major_formatter(FuncFormatter(format_func))\n",
"\n",
2024-05-07 20:20:09 +02:00
"plt.title(title_benefit)\n",
2024-05-06 19:23:42 +02:00
"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-09 13:15:53 +02:00
"execution_count": 18,
2024-05-04 09:59:27 +02:00
"metadata": {},
"outputs": [
{
"data": {
2024-05-09 13:15:53 +02:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxAAAAMKCAYAAAAVtKIAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABsC0lEQVR4nO3deXxMd////+dEkrFEohEk1tiDWFqKoJZSS1W1VaW01tIl1FLa5rraC+1Ho6paVOmi0YVqKS5tLxQVqvat9n3rInZCEJF5//7oz3xnmhgnJGbwuN9u51bzPmfOec0kdF7zer3P22aMMQIAAAAAC/y8HQAAAACAWwcJBAAAAADLSCAAAAAAWEYCAQAAAMAyEggAAAAAlpFAAAAAALCMBAIAAACAZSQQAAAAACwjgQAAAABgGQkEgBy1Zs0a1atXT/ny5ZPNZtPGjRuz/RqRkZHq1q1btp/3Zjhw4IBsNpsmT558zWO7deumyMjIHI/pdjB58mTZbDbndvz4cW+HdNPMnj3b7bWvXbvW2yEBuM2QQAA32d69e/Xss8+qTJkyyp07t4KDg1W/fn2NGTNGFy5cyPbrnT9/XkOHDlViYmK2n/ta0tLS1L59e508eVLvvfeevvzyS5UqVSrTYxMTE50feL766qtMj6lfv75sNpuio6NzMmxkwfLlyzV06FCdPn3a26Fk6srvXf78+XP8WkOHDnX74P7PLSkpSdL/+12fMWNGpufp06ePbDab21hkZKTbufLly6fatWvriy++yPD8WrVq6csvv1Tv3r2z/0UCgCR/bwcA3El+/PFHtW/fXna7XV26dFF0dLQuXbqkZcuWafDgwdq6das+/vjjbL3m+fPnNWzYMElS48aNs/Xc17J3714dPHhQn3zyiZ555hlLz8mdO7emTp2qp556ym38wIEDWr58uXLnzp3hOTt37pSf3635fUipUqV04cIFBQQEeDuU67J8+XINGzZM3bp1U4ECBbwdTgaPPPLITa/aTJgwQUFBQRnGb/T9qVGjhl566SVJ0uHDh/Xpp5+qa9euSk1NVa9evZzHFS9eXE899ZQuX76c7f+eAIBEAgHcNPv371fHjh1VqlQp/fzzz4qIiHDui42N1Z49e/Tjjz96McLsd/ToUUlZ++D04IMPas6cOTp+/LjCwsKc41OnTlWRIkVUvnx5nTp1yu05drs9W+K9ePGiAgMDb0oycvnyZTkcDgUGBmaaFOHW9fjjj7v97maXYsWKuSXW3bp1U5kyZfTee++5JRAAkNNuza/sgFvQyJEjde7cOU2aNMktebiiXLly6tevn/Px5cuX9eabb6ps2bKy2+2KjIzUv/71L6Wmpro9b+3atWrRooXCwsKUJ08elS5dWj169JD097f2hQoVkiQNGzbM2f4wdOhQSVJSUpK6d++u4sWLy263KyIiQm3bttWBAweu+Xp+/vln3XfffcqXL58KFCigtm3bavv27c793bp1U6NGjSRJ7du3l81ms1QBadu2rex2u6ZPn+42PnXqVD3xxBPKlStXhudkNgfi9OnTGjBggCIjI2W321W8eHF16dLF2Qt/pY1k2rRpeu2111SsWDHlzZtXycnJkqTp06erZs2aypMnj8LCwvTUU0/pzz//zHDt6dOnq3LlysqdO7eio6M1a9asDHMVrsxzGDVqlN5//33nz3Tbtm1XnQMxe/ZsRUdHu53XKk+/E8YYRUZGqm3bthmed/HiRYWEhOjZZ591jo0bN05VqlRR3rx5ddddd6lWrVqaOnWqpL9bdgYPHixJKl26tPP3y/X356uvvnK+j6GhoerYsaN+//13t+s2btxY0dHR2rRpkxo1aqS8efOqXLlyzhafJUuWqE6dOsqTJ48qVqyohQsXWn4vMnOzr5dTChUqpKioKO3du9fboQC4w1CBAG6S77//XmXKlFG9evUsHf/MM8/o888/1+OPP66XXnpJq1atUnx8vLZv3+78MHn06FE1b95chQoV0quvvqoCBQrowIEDmjlzpqS/P2BMmDBBzz//vB599FE99thjkqRq1apJktq1a6etW7eqb9++ioyM1NGjR7VgwQIdOnTIY9vHwoUL1apVK5UpU0ZDhw7VhQsXNG7cONWvX1/r169XZGSknn32WRUrVkxvvfWWXnzxRd17770qUqTINV933rx51bZtW3399dd6/vnnJUm//fabtm7dqk8//VSbNm265jnOnTun++67T9u3b1ePHj10zz336Pjx45ozZ47++OMPt2+H33zzTQUGBmrQoEFKTU1VYGCgJk+erO7du+vee+9VfHy8jhw5ojFjxujXX3/Vhg0bnBWVH3/8UR06dFDVqlUVHx+vU6dOqWfPnipWrFimcSUkJOjixYvq3bu37Ha7QkND5XA4Mhz3008/qV27dqpcubLi4+N14sQJZ6J3Ldf6nbDZbHrqqac0cuRInTx5UqGhoc7nfv/990pOTnZ+y/3JJ5/oxRdf1OOPP65+/frp4sWL2rRpk1atWqVOnTrpscce065du/T111/rvffec76vV5LW4cOH6/XXX9cTTzyhZ555RseOHdO4cePUsGFDt/dRkk6dOqWHHnpIHTt2VPv27TVhwgR17NhRU6ZMUf/+/fXcc8+pU6dOeuedd/T444/r999/v6F5DTl5vZMnT2YY8/f3z/YWr8uXL+uPP/7QXXfdla3nBYBrMgBy3JkzZ4wk07ZtW0vHb9y40UgyzzzzjNv4oEGDjCTz888/G2OMmTVrlpFk1qxZc9VzHTt2zEgyQ4YMcRs/deqUkWTeeeedLL0WY4ypUaOGKVy4sDlx4oRz7LfffjN+fn6mS5cuzrHFixcbSWb69OnXPKfrsT/88IOx2Wzm0KFDxhhjBg8ebMqUKWOMMaZRo0amSpUqbs8tVaqU6dq1q/Pxf/7zHyPJzJw5M8N1HA6H2/XKlCljzp8/79x/6dIlU7hwYRMdHW0uXLjgHP/hhx+MJPOf//zHOVa1alVTvHhxc/bsWedYYmKikWRKlSrlHNu/f7+RZIKDg83Ro0fd4rmyLyEhwTlWo0YNExERYU6fPu0c++mnnzKcNzNWfid27txpJJkJEya4jT/88MMmMjLS+R61bds2w3v9T++8846RZPbv3+82fuDAAZMrVy4zfPhwt/HNmzcbf39/t/FGjRoZSWbq1KnOsR07dhhJxs/Pz6xcudI5Pn/+/AzvV2YSEhIyjSunrmeMMUOGDDGSMt0qVqzoPO5afy9iY2PNP//3XKpUKdO8eXNz7Ngxc+zYMbN582bz9NNPG0kmNjbW43vg6XcBAK4HLUzATXClLcbqN5j/+9//JEkDBw50G78ygfLKXIkr32j+8MMPSktLy1JMefLkUWBgoBITEzPMKfDk8OHD2rhxo7p16+b27XW1atX0wAMPOGO/Ec2bN1doaKimTZsmY4ymTZumJ5980vLzv/vuO1WvXl2PPvpohn3/vLtN165dlSdPHufjtWvX6ujRo3rhhRfc5ia0bt1aUVFRzvf+r7/+0ubNm9WlSxe3CbONGjVS1apVM42rXbt2zm/nr+bK+9u1a1eFhIQ4xx944AFVrlzZ43Mla78TFSpUUJ06dTRlyhTn2MmTJzV37lx17tzZ+R4VKFBAf/zxh9asWXPN6/7TzJkz5XA49MQTT+j48ePOLTw8XOXLl9fixYvdjg8KClLHjh2djytWrKgCBQqoUqVKqlOnjnP8yp/37duX5Zhu1vW+++47LViwwG1LSEi4oXilvytThQoVUqFChVS1alV9+eWX6t69u955550bPjcAZAUJBHATBAcHS5LOnj1r6fiDBw/Kz89P5cqVcxsPDw9XgQIFdPDgQUl/f1ht166dhg0bprCwMLVt21YJCQkZ5klkxm636+2339bcuXNVpEgRNWzYUCNHjnTeatJTbNLfH7j+qVKlSjp+/LhSUlIsvc6rCQgIUPv27TV16lQtXbpUv//+uzp16mT5+Xv37rV8q9fSpUu7Pfb0+qKiopz7r/z3nz+jq41ldq3MXDlv+fLlM+zLLKZ/svo70aVLF/3666/O602fPl1paWl6+um
2024-05-04 09:59:27 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
2024-05-04 09:59:27 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2024-05-07 21:06:03 +02:00
"\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"df = costs\n",
"df = df.astype(int)\n",
2024-05-06 19:23:42 +02:00
"df.index = df.index / 1000\n",
2024-05-09 13:15:53 +02:00
"df.index = df.index.map(int)\n",
2024-05-06 19:23:42 +02:00
"df.columns = df.columns / 1000\n",
2024-05-09 13:15:53 +02:00
"df.columns = df.columns.map(int)\n",
2024-05-06 19:23:42 +02:00
"\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-09 13:15:53 +02:00
"execution_count": 42,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
2024-05-09 13:15:53 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.3954337899543379 0.809189497716895 0.0008091894977168949\n",
"10 5\n",
"[[0 1 2 3 4 5 6 7 8 9]\n",
" [0 1 2 3 4 5 6 7 8 9]\n",
" [0 1 2 3 4 5 6 7 8 9]\n",
" [0 1 2 3 4 5 6 7 8 9]\n",
" [0 1 2 3 4 5 6 7 8 9]] [[0 0 0 0 0 0 0 0 0 0]\n",
" [1 1 1 1 1 1 1 1 1 1]\n",
" [2 2 2 2 2 2 2 2 2 2]\n",
" [3 3 3 3 3 3 3 3 3 3]\n",
" [4 4 4 4 4 4 4 4 4 4]]\n"
]
},
2024-05-06 19:23:42 +02:00
{
"data": {
2024-05-09 13:15:53 +02:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyUAAAMKCAYAAACbbut8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADUrUlEQVR4nOzdd3wUdfoH8M/MbO/pPYHQi6gHgtJBBSsqiiAcoij2U1GueMWCenr+Tr2zoOIpKHbB3gsgoAiIKAihh/ReNtne5vdHyJo1ARJIMkn283699gWZmZ19ZlN2n32e7/cryLIsg4iIiIiISCGi0gEQEREREVF0Y1JCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRFGhrKwMl112GeLi4iAIAv7zn/8oHVKPMXHiREycOFHpMCIsX74cgiDg0KFDHXL+e++9F4IgdMi5e6Ku+DNCRF0LkxLqEQ4cOIDrr78e2dnZ0Ol0sFgsGDNmDP773//C7XYrHV63ctVVV0EQhPBNq9Wif//+uPvuu+HxeI7rnLt27cK9997bYW8QW2PhwoX4/PPPcdddd2HFihU455xzjnhs0+tvektOTm73uJYsWYLly5e3+3lP1KFDh474PAiCgIcffrjTYumqz1Fr/Pb3yWQyITs7G5dddhlWrVqFUCikdIhERF2CSukAiE7Uxx9/jBkzZkCr1eLKK6/E0KFD4fP5sGHDBvzxj3/Ezp07sXTpUqXD7Fa0Wi3+97//AQDsdjvef/993H///Thw4ABeffXVNp9v165duO+++zBx4kT06tWrnaNtndWrV+Oiiy7CokWLWnX82WefjSuvvDJim16vb/e4lixZgvj4eFx11VXtfu72cMUVV+C8885rtv3UU0/ttBiO5zmaO3cuZs2aBa1W23GBtVLT3ye32428vDx8+OGHuOyyyzBx4kS8//77sFgsCkdJRKQsJiXUreXm5mLWrFnIysrC6tWrkZKSEt538803Y//+/fj4448VjPDIXC4XDAaD0mG0SKVS4fe//33465tuugmjR4/G66+/jsceewxJSUkKRnd8ysvLYbPZWn18//79I56D7sTj8UCj0UAUT7wY/rvf/a5bPQ9OpxNGoxGSJEGSJKXDAdD89wkAHnjgATz88MO46667sGDBArz55psKRUdE1DWwfYu6tUceeQQOhwMvvPBCRELSqG/fvrjtttvCXwcCAdx///3o06cPtFotevXqhb/+9a/wer3hYy644AJkZ2e3+HhnnHEGRowYEbHtlVdewfDhw6HX6xEbG4tZs2ahoKAg4piJEydi6NCh2Lp1K8aPHw+DwYC//vWvAID3338f559/PlJTU6HVatGnTx/cf//9CAaDzR7/6aefRnZ2NvR6PUaOHIn169e32Kvt9Xpxzz33oG/fvtBqtcjIyMCf/vSniOtsC0EQMHbsWMiyjIMHD4a35+Xl4aabbsKAAQOg1+sRFxeHGTNmRLRpLV++HDNmzAAATJo0KdzGsnbt2vAxn376KcaNGwej0Qiz2Yzzzz8fO3fubFVsBw8exIwZMxAbGwuDwYDTTz89IhFtHFsgyzKefvrp8OOfiH//+98YPXo04uLioNfrMXz4cKxcubLFY1955RWMHDkSBoMBMTExGD9+PL744gsAQK9evbBz505888034biafi+PdW0AsHbtWgiCgDfeeAN///vfkZaWBoPBgJ9++gmCIODxxx9vFtN3330HQRDw+uuvn9DzcDRt+Rk83ueo8Xv7zTff4KabbkJiYiLS09Mj9v22ZfDTTz/FhAkTYDabYbFYcNppp+G1114L71+/fj1mzJiBzMzMcNwLFy7skDbQv/zlL5gyZQrefvtt7N27t1mcx/qduOqqq2AymZCfn48LLrgAJpMJaWlpePrppwEAO3bswOTJk2E0GpGVlRVxnQBQXV2NRYsW4aSTToLJZILFYsG5556Ln3/+OeK4xp+xt956Cw8++CDS09Oh0+lw5plnYv/+/c2ua+nSpejTp0/E36mWPPnkkxgyZEj4+z5ixIhmMRJR9GClhLq1Dz/8ENnZ2Rg9enSrjr/22mvx0ksv4bLLLsOdd96JTZs24aGHHkJOTg7effddAMDMmTNx5ZVXYsuWLTjttNPC983Ly8P333+P//u//wtve/DBB/GPf/wDl19+Oa699lpUVFTgySefxPjx47Ft27aIT+arqqpw7rnnYtasWfj9738frjYsX74cJpMJd9xxB0wmE1avXo27774bdXV1EY/1zDPP4JZbbsG4ceOwcOFCHDp0CBdffDFiYmLCb8QAIBQKYdq0adiwYQOuu+46DBo0CDt27MDjjz+OvXv34r333juepzr85i4mJia8bcuWLfjuu+8wa9YspKen49ChQ3jmmWcwceJE7Nq1CwaDAePHj8ett96KJ554An/9618xaNAgAAj/u2LFCsybNw9Tp07Fv/71L7hcLjzzzDMYO3Ystm3bdtR2r7KyMowePRoulwu33nor4uLi8NJLL2HatGlYuXIlLrnkEowfPx4rVqzA3LlzW2zJOhKPx4PKysqIbWazGVqtFv/9738xbdo0zJkzBz6fD2+88QZmzJiBjz76COeff374+Pvuuw/33nsvRo8ejcWLF0Oj0WDTpk1YvXo1pkyZgv/85z/4wx/+AJPJhL/97W8AEP65aM21NXX//fdDo9Fg0aJF8Hq9GDhwIMaMGYNXX30VCxcujDj21VdfhdlsxkUXXXTM58HlcjV7HgDAZrNBpWr5JaQtP4Mn8hw1uummm5CQkIC7774bTqfziNeyfPlyzJ8/H0OGDMFdd90Fm82Gbdu24bPPPsPs2bMBAG+//TZcLhduvPFGxMXFYfPmzXjyySdRWFiIt99++5jPV1vNnTsXX3zxBb788kv0798fQNt+J4LBIM4991yMHz8ejzzyCF599VXccsstMBqN+Nvf/oY5c+Zg+vTpePbZZ3HllVfijDPOQO/evQE0JL3vvfceZsyYgd69e6OsrAzPPfccJkyYgF27diE1NTUi1ocffhiiKGLRokWw2+145JFHMGfOHGzatCl8zAsvvIDrr78eo0ePxu23346DBw9i2rRpiI2NRUZGRvi4559/Hrfeeisuu+wy3HbbbfB4PNi+fTs2bdoU/l4QUZSRibopu90uA5AvuuiiVh3/008/yQDka6+9NmL7okWLZADy6tWrw+fVarXynXfeGXHcI488IguCIOfl5cmyLMuHDh2SJUmSH3zwwYjjduzYIatUqojtEyZMkAHIzz77bLO4XC5Xs23XX3+9bDAYZI/HI8uyLHu9XjkuLk4+7bTTZL/fHz5u+fLlMgB5woQJ4W0rVqyQRVGU169fH3HOZ599VgYgf/vtt0d8jmRZlufNmycbjUa5oqJCrqiokPfv3y//+9//lgVBkIcOHSqHQqGjxr5x40YZgPzyyy+Ht7399tsyAHnNmjURx9bX18s2m01esGBBxPbS0lLZarU22/5bt99+uwwg4lrr6+vl3r17y7169ZKDwWB4OwD55ptvPur5mh7b0m3ZsmUtXrfP55OHDh0qT548Obxt3759siiK8iWXXBIRhyzLEc/hkCFDIr5/bb22NWvWyADk7OzsZnE999xzMgA5JycnItb4+Hh53rx5R30OcnNzj/g8AJA3btwYPnbChAnH9TN4os/RsmXLZADy2LFj5UAg0OK+3NxcWZZluba2VjabzfKoUaNkt9t9xMdq6Wf6oYceivjdl2VZvueee+TWvIQ2/j4dybZt22QA8sKFC2VZbtvvxLx582QA8j//+c/wtpqaGlmv18uCIMhvvPFGePvu3btlAPI999wT3ubxeJo977m5ubJWq5UXL14c3tb4MzZo0CDZ6/WGt//3v/+VAcg7duyQZbnhZysxMVE+5ZRTIo5bunRps79TF110kTxkyJAjPi9EFH3YvkXdVl1dHYCGT69b45NPPgEA3HHHHRHb77zzTgAIt8U0tjC89dZbkGU5fNybb76J008
2024-05-06 19:23:42 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
2024-05-06 19:23:42 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2024-05-07 10:27:45 +02:00
"from matplotlib.colors import LinearSegmentedColormap\n",
2024-05-06 19:23:42 +02:00
"df = overload_cnt\n",
2024-05-09 13:15:53 +02:00
"df = (4 * 24 * 365 - df) / (4 * 24 * 365)\n",
"df = df.astype(float)\n",
2024-05-06 19:23:42 +02:00
"df.index = df.index / 1000\n",
2024-05-09 13:15:53 +02:00
"df.index = df.index.map(int)\n",
2024-05-06 19:23:42 +02:00
"df.columns = df.columns / 1000\n",
2024-05-09 13:15:53 +02:00
"df.columns = df.columns.map(int)\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-09 13:15:53 +02:00
"print(min_value, max_value, max_scale)\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-09 13:15:53 +02:00
"ax = sns.heatmap(df, fmt=\".00%\", cmap=cmap, vmin=0, vmax=1, annot=annot_unmet)\n",
"\n",
2024-05-07 20:20:09 +02:00
"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",
2024-05-09 13:15:53 +02:00
"print(df.shape[1], df.shape[0])\n",
"X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
2024-05-09 13:15:53 +02:00
"print(X, Y)\n",
"\n",
2024-05-09 13:15:53 +02:00
"# CS = ax.contour(X, Y, df, levels=np.linspace(df.min().min(), df.max().max(), 20), colors='black', alpha=0.5)\n",
"CS = ax.contour(X, Y, df, colors='black', alpha=0.5)\n",
"\n",
"ax.clabel(CS, inline=True, fontsize=10)\n",
"\n",
"\n",
2024-05-07 20:20:09 +02:00
"plt.title(title_unmet)\n",
2024-05-06 19:23:42 +02:00
"plt.gca().invert_yaxis()\n",
"plt.xlabel('ESS Capacity (MWh)')\n",
2024-05-07 10:27:45 +02:00
"plt.ylabel('PV Capacity (MW)')\n",
"plt.savefig('plots/unmet.png')"
2024-05-06 19:23:42 +02:00
]
2024-05-09 13:15:53 +02:00
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0 1 2 3 4 5 6 7 8 9 10 11] [0 1 2 3 4 5 6 7 8 9]\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 800x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np\n",
"\n",
"# 创建一些随机数据\n",
"data = np.random.rand(10, 12)\n",
"\n",
"# 创建热力图\n",
"plt.figure(figsize=(8, 6))\n",
"ax = sns.heatmap(data, cmap='viridis')\n",
"\n",
"# 为等高线创建匹配的 X 和 Y 轴坐标\n",
"x = np.arange(data.shape[1])\n",
"y = np.arange(data.shape[0])\n",
"print(x, y)\n",
"# 使用 meshgrid 创建坐标网格\n",
"X, Y = np.meshgrid(x, y)\n",
"\n",
"# 添加等高线\n",
"contour = ax.contour( data, colors='white')\n",
"\n",
"# 显示图形\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.3954337899543379 0.809189497716895 0.0008091894977168949\n",
"10 5\n",
"10 5\n",
"50 100\n",
" 0 11 22 33 44 55 66 \\\n",
"0 0.395434 0.395434 0.395434 0.395434 0.395434 0.395434 0.395434 \n",
"12 0.518978 0.520776 0.522974 0.524087 0.524886 0.525428 0.525685 \n",
"25 0.604737 0.617123 0.627597 0.634932 0.642951 0.650314 0.654766 \n",
"37 0.647232 0.664840 0.682820 0.697745 0.714640 0.728881 0.737900 \n",
"50 0.674686 0.695805 0.716781 0.735074 0.756564 0.776056 0.790582 \n",
"\n",
" 77 88 100 101 \n",
"0 0.395434 0.395434 0.395434 0.395434 \n",
"12 0.525856 0.525913 0.525913 0.525913 \n",
"25 0.657905 0.660245 0.662357 0.662357 \n",
"37 0.742723 0.746518 0.749829 0.749829 \n",
"50 0.799429 0.804937 0.809189 0.809189 \n",
" 0 11 22 33 44 55 66 \\\n",
"51 0.674686 0.695805 0.716781 0.735074 0.756564 0.776056 0.790582 \n",
"\n",
" 77 88 100 101 \n",
"51 0.799429 0.804937 0.809189 0.809189 \n",
"11 6\n",
"[[ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]] [[0 0 0 0 0 0 0 0 0 0 0]\n",
" [1 1 1 1 1 1 1 1 1 1 1]\n",
" [2 2 2 2 2 2 2 2 2 2 2]\n",
" [3 3 3 3 3 3 3 3 3 3 3]\n",
" [4 4 4 4 4 4 4 4 4 4 4]\n",
" [5 5 5 5 5 5 5 5 5 5 5]]\n",
"100 50\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyUAAAMKCAYAAACbbut8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADJ7ElEQVR4nOzdd3xT9f4/8Nc5Jztpk6Z7A2WDOFBZMkQFJ04UJ+AVVHDLHXy9DhxX5XfVKyoqDkCc4ETvVRRBEWU4cEGBFijdezc7Ob8/2oaGtpBCm9Omr+fjkUfbk5Pk/UlXXvm8P+cIsizLICIiIiIiUoiodAFERERERNS7MZQQEREREZGiGEqIiIiIiEhRDCVERERERKQohhIiIiIiIlIUQwkRERERESmKoYSIiIiIiBTFUEJERERERIpiKCEiIiIiIkUxlBBRr1BSUoIrrrgC0dHREAQB//nPf5QuKWxMmjQJkyZNUrqMACtWrIAgCMjJyemS+3/ooYcgCEKX3Hc46o4/I0TUvTCUUFjYt28fbr75ZvTr1w86nQ6RkZEYN24cnn32WdjtdqXL61FmzZoFQRD8F61Wi4EDB+KBBx6Aw+E4pvvctWsXHnrooS57gRiMu+++G+vWrcPChQuxatUqnHvuue3u23L8LS8JCQmdXtfSpUuxYsWKTr/f45WTk9Pu8yAIAp544omQ1dJdn6NgHP77ZDKZ0K9fP1xxxRX44IMP4PP5lC6RiKhbUCldANHx+u9//4vp06dDq9XihhtuwPDhw+FyubB582b89a9/xc6dO7Fs2TKly+xRtFotXn31VQBATU0NPvnkEzzyyCPYt28f3nrrrQ7f365du7Bo0SJMmjQJffr06eRqg7NhwwZcfPHFWLBgQVD7n3POObjhhhsCtun1+k6va+nSpYiJicGsWbM6/b47w9VXX43zzz+/1faTTz45ZDUcy3N0/fXXY8aMGdBqtV1XWJBa/j7Z7XYcPHgQn376Ka644gpMmjQJn3zyCSIjIxWukohIWQwl1KMdOHAAM2bMQHp6OjZs2IDExET/dfPnz0d2djb++9//Klhh+2w2GwwGg9JltEmlUuG6667zfz1v3jyMHTsW77zzDp5++mnEx8crWN2xKS0thcViCXr/gQMHBjwHPYnD4YBGo4EoHv9k+CmnnNKjnoeGhgYYjUZIkgRJkpQuB0Dr3ycAePTRR/HEE09g4cKFmDNnDt577z2FqiMi6h7YvkU92uLFi1FfX4/XXnstIJA069+/P+68807/1x6PB4888ggyMjKg1WrRp08f/N///R+cTqd/nwsvvBD9+vVr8/HGjBmDU089NWDbm2++iZEjR0Kv18NqtWLGjBnIy8sL2GfSpEkYPnw4fv75Z0yYMAEGgwH/93//BwD45JNPcMEFFyApKQlarRYZGRl45JFH4PV6Wz3+Cy+8gH79+kGv1+P000/Hd99912avttPpxIMPPoj+/ftDq9UiNTUVf/vb3wLG2RGCIOCMM86ALMvYv3+/f/vBgwcxb948DBo0CHq9HtHR0Zg+fXpAm9aKFSswffp0AMCZZ57pb2P55ptv/Pt8/vnnGD9+PIxGIyIiInDBBRdg586dQdW2f/9+TJ8+HVarFQaDAaNHjw4Ios1rC2RZxgsvvOB//OPx73//G2PHjkV0dDT0ej1GjhyJ999/v81933zzTZx++ukwGAyIiorChAkT8OWXXwIA+vTpg507d+Lbb7/119Xye3m0sQHAN998A0EQ8O677+Kf//wnkpOTYTAY8Ouvv0IQBDzzzDOtavrhhx8gCALeeeed43oejqQjP4PH+hw1f2+//fZbzJs3D3FxcUhJSQm47vCWwc8//xwTJ05EREQEIiMjcdppp+Htt9/2X//dd99h+vTpSEtL89d99913d0kb6D/+8Q9MmTIFa9aswd69e1vVebTfiVmzZsFkMiE3NxcXXnghTCYTkpOT8cILLwAA/vjjD0yePBlGoxHp6ekB4wSAyspKLFiwACeccAJMJhMiIyNx3nnn4bfffgvYr/lnbPXq1XjssceQkpICnU6Hs846C9nZ2a3GtWzZMmRkZAT8nWrLc889h2HDhvm/76eeemqrGomo9+BMCfVon376Kfr164exY8cGtf9NN92ElStX4oorrsC9996Lbdu24fHHH0dmZiY++ugjAMBVV12FG264AT/++CNOO+00/20PHjyIrVu34v/9v//n3/bYY4/h/vvvx5VXXombbroJZWVleO655zBhwgTs2LEj4J35iooKnHfeeZgxYwauu+46/2zDihUrYDKZcM8998BkMmHDhg144IEHUFtbG/BYL774Im677TaMHz8ed999N3JycnDJJZcgKirK/0IMAHw+H6ZNm4bNmzdj7ty5GDJkCP744w8888wz2Lt3Lz7++ONjear9L+6ioqL823788Uf88MMPmDFjBlJSUpCTk4MXX3wRkyZNwq5du2AwGDBhwgTccccdWLJkCf7v//4PQ4YMAQD/x1WrVmHmzJmYOnUqnnzySdhsNrz44os444wzsGPHjiO2e5WUlGDs2LGw2Wy44447EB0djZUrV2LatGl4//33cemll2LChAlYtWoVrr/++jZbstrjcDhQXl4esC0iIgJarRbPPvsspk2bhmuvvRYulwvvvvsupk+fjs8++wwXXHCBf/9FixbhoYcewtixY/Hwww9Do9Fg27Zt2LBhA6ZMmYL//Oc/uP3222EymXDfffcBgP/nIpixtfTII49Ao9FgwYIFcDqdGDx4MMaNG4e33noLd999d8C+b731FiIiInDxxRcf9Xmw2WytngcAsFgsUKna/hfSkZ/B43mOms2bNw+xsbF44IEH0NDQ0O5YVqxYgRtvvBHDhg3DwoULYbFYsGPHDnzxxRe45pprAABr1qyBzWbDrbfeiujoaGzfvh3PPfcc8vPzsWbNmqM+Xx11/fXX48svv8RXX32FgQMHAujY74TX68V5552HCRMmYPHixXjrrbdw2223wWg04r777sO1116Lyy67DC+99BJuuOEGjBkzBn379gXQGHo//vhjTJ8+HX379kVJSQlefvllTJw4Ebt27UJSUlJArU888QREUcSCBQtQU1ODxYsX49prr8W2bdv8+7z22mu4+eabMXbsWNx1113Yv38/pk2bBqvVitTUVP9+r7zyCu644w5cccUVuPPOO+FwOPD7779j27Zt/u8FEfUyMlEPVVNTIwOQL7744qD2//XXX2UA8k033RSwfcGCBTIAecOGDf771Wq18r333huw3+LFi2VBEOSDBw/KsizLOTk5siRJ8mOPPRaw3x9//CGrVKqA7RMnTpQByC+99FKrumw2W6ttN998s2wwGGSHwyHLsiw7nU45OjpaPu2002S32+3fb8WKFTIAeeLEif5tq1atkkVRlL/77ruA+3zppZdkAPL333/f7nMky7I8c+ZM2Wg0ymVlZXJZWZmcnZ0t//vf/5YFQZCHDx8u+3y+I9a+ZcsWGYD8xhtv+LetWbNGBiBv3LgxYN+6ujrZYrHIc+bMCdheXFwsm83mVtsPd9ddd8kAAsZaV1cn9+3bV+7Tp4/s9Xr92wHI8+fPP+L9tdy3rcvy5cvbHLfL5ZKHDx8uT5482b8tKytLFkVRvvTSSwPqkGU54DkcNmxYwPevo2PbuHGjDEDu169fq7pefvllGYCcmZkZUGtMTIw8c+bMIz4HBw4caPd5ACBv2bLFv+/EiROP6WfweJ+j5cuXywDkM844Q/Z4PG1ed+DAAVmWZbm6ulqOiIiQR40aJdvt9nYfq62f6ccffzzgd1+WZfnBBx+Ug/kX2vz71J4dO3bIAOS7775bluWO/U7MnDlTBiD/61//8m+rqqqS9Xq9LAiC/O677/q37969WwYgP/jgg/5tDoej1fN+4MABWavVyg8//LB/W/PP2JAhQ2Sn0+nf/uyzz8oA5D/++EOW5cafrbi4OPmkk04K2G/ZsmWt/k5dfPHF8rBhw9p9Xoio92H7FvVYtbW1ABrfvQ7G//73PwDAPffcE7D93nvvBQB/W0xzC8Pq1ashy7J/v/f
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = overload_cnt\n",
"df = (4 * 24 * 365 - df) / (4 * 24 * 365)\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",
"xl = df.columns[-1]\n",
"yl = df.index[-1]\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",
"print(min_value, max_value, max_scale)\n",
"print(df.shape[1], df.shape[0])\n",
"print(df.shape[1], df.shape[0])\n",
"print(df.index[-1], df.columns[-1])\n",
"df[df.columns[-1] + 1] = df.iloc[:, -1] # 添加一列\n",
"print(df)\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",
"# df[df.index[-1] + 1] = df.iloc[-1, :] # 添加一行\n",
"# 获取原始数据的最小值和最大值,用于填充新行和列\n",
"\n",
"# 更新坐标,确保它们仍然从 0 开始\n",
"X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\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",
"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",
"print(df.shape[1], df.shape[0])\n",
"X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
"print(X, Y)\n",
"\n",
"# CS = ax.contour(X, Y, df, levels=np.linspace(df.min().min(), df.max().max(), 20), colors='black', alpha=0.5)\n",
"CS = ax.contour(X, Y, df, colors='black', alpha=0.5)\n",
"\n",
"ax.clabel(CS, inline=True, fontsize=10)\n",
"\n",
"print(xl, yl)\n",
"\n",
"# plt.xlim(df.columns[0], df.columns[-1])\n",
"# plt.ylim(df.index[0], df.index[-1])\n",
"plt.title(title_unmet)\n",
"plt.gca().invert_yaxis()\n",
"plt.xlabel('ESS Capacity (MWh)')\n",
"plt.ylabel('PV Capacity (MW)')\n",
"plt.savefig('plots/unmet.png')\n"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"# 创建随机数据\n",
"data = np.random.rand(10, 10)\n",
"\n",
"# 创建热力图只显示从第2行到第5行和第2列到第5列的数据\n",
"sns.heatmap(data, cmap='viridis',\n",
" xticklabels=2, yticklabels=2) # 每隔2个显示一次刻度标签\n",
"\n",
"# 设置坐标轴显示范围\n",
"# plt.xlim(1, 5)\n",
"# plt.ylim(1, 5)\n",
"\n",
"# 显示图形\n",
"plt.show()\n",
"\n"
]
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-09 13:15:53 +02:00
"version": "3.11.0"
2024-05-04 09:59:27 +02:00
}
},
"nbformat": 4,
"nbformat_minor": 2
}