simple-pv-simulator/draw.py

210 lines
7.2 KiB
Python
Raw Normal View History

2024-05-09 23:49:48 +02:00
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
2024-05-10 01:10:55 +02:00
from matplotlib.ticker import FuncFormatter
2024-05-09 23:49:48 +02:00
import numpy as np
import pandas as pd
import os
import seaborn as sns
import json
from matplotlib.colors import LinearSegmentedColormap
def read_data(file_name: str):
with open(file_name, 'r') as f:
data = json.load(f)
for key, value in data.items():
for subkey, subvalue in value.items():
data[key][subkey] = float(subvalue)
df = pd.DataFrame.from_dict(data, orient='index')
2024-05-10 01:10:55 +02:00
df = df.T
2024-05-09 23:49:48 +02:00
df.index = pd.to_numeric(df.index)
df.columns = pd.to_numeric(df.columns)
return df
2024-05-10 01:10:55 +02:00
def draw_results(results, filename, title_benefit, annot_benefit=False, figure_size=(10, 10)):
df=results
2024-05-09 23:49:48 +02:00
df = df.astype(float)
df.index = df.index / 1000
2024-05-10 01:10:55 +02:00
df.index = df.index.map(int)
2024-05-09 23:49:48 +02:00
df.columns = df.columns / 1000
2024-05-10 01:10:55 +02:00
df.columns = df.columns.map(int)
2024-05-09 23:49:48 +02:00
min_value = df.min().min()
max_value = df.max().max()
max_scale = max(abs(min_value/1000), abs(max_value/1000))
2024-05-10 01:10:55 +02:00
df[df.columns[-1] + 1] = df.iloc[:, -1]
new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns)
for i in df.columns:
new_Data[i] = df[i].iloc[-1]
df = pd.concat([df, new_Data])
X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))
def fmt(x,pos):
return '{:.0f}'.format(x/1000)
2024-05-09 23:49:48 +02:00
cmap = sns.color_palette("coolwarm", as_cmap=True)
2024-05-10 01:10:55 +02:00
plt.figure(figsize=figure_size)
2024-05-09 23:49:48 +02:00
ax = sns.heatmap(df/1000, fmt=".1f", cmap=cmap, vmin=-max_scale, vmax=max_scale, annot=annot_benefit)
2024-05-10 01:10:55 +02:00
CS = ax.contour(X, Y, df, colors='black', alpha=0.5)
ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt))
plt.title(title_benefit)
2024-05-09 23:49:48 +02:00
plt.gca().invert_yaxis()
2024-05-10 01:10:55 +02:00
plt.xlim(0, df.shape[1] - 1)
plt.ylim(0, df.shape[0] - 1)
2024-05-09 23:49:48 +02:00
plt.xlabel('ESS Capacity (MWh)')
plt.ylabel('PV Capacity (MW)')
plt.savefig(filename)
def draw_cost(costs, filename, title_cost, annot_cost=False, figure_size=(10, 10)):
df = costs
df = df.astype(int)
df.index = df.index / 1000
2024-05-10 01:10:55 +02:00
df.index = df.index.map(int)
2024-05-09 23:49:48 +02:00
df.columns = df.columns / 1000
2024-05-10 01:10:55 +02:00
df.columns = df.columns.map(int)
df[df.columns[-1] + 1] = df.iloc[:, -1]
new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns)
for i in df.columns:
new_Data[i] = df[i].iloc[-1]
df = pd.concat([df, new_Data])
X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))
def fmt(x, pos):
return '{:.0f}'.format(x / 1000000)
2024-05-09 23:49:48 +02:00
plt.figure(figsize=figure_size)
2024-05-10 01:10:55 +02:00
ax = sns.heatmap(df/1000000, fmt=".1f", cmap='viridis', annot=annot_cost)
CS = ax.contour(X, Y, df, colors='black', alpha=0.5)
ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt))
2024-05-09 23:49:48 +02:00
plt.title(title_cost)
plt.gca().invert_yaxis()
2024-05-10 01:10:55 +02:00
plt.xlim(0, df.shape[1] - 1)
plt.ylim(0, df.shape[0] - 1)
2024-05-09 23:49:48 +02:00
plt.xlabel('ESS Capacity (MWh)')
plt.ylabel('PV Capacity (MW)')
plt.savefig(filename)
2024-05-10 01:10:55 +02:00
2024-05-09 23:49:48 +02:00
def draw_overload(overload_cnt, filename, title_unmet, annot_unmet=False, figure_size=(10, 10)):
df = overload_cnt
2024-05-10 01:10:55 +02:00
df = (4 * 24 * 365 - df) / (4 * 24 * 365)
df = df.astype(float)
2024-05-09 23:49:48 +02:00
df.index = df.index / 1000
2024-05-10 01:10:55 +02:00
df.index = df.index.map(int)
2024-05-09 23:49:48 +02:00
df.columns = df.columns / 1000
2024-05-10 01:10:55 +02:00
df.columns = df.columns.map(int)
2024-05-09 23:49:48 +02:00
min_value = df.min().min()
max_value = df.max().max()
2024-05-10 01:10:55 +02:00
df[df.columns[-1] + 1] = df.iloc[:, -1]
new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns)
for i in df.columns:
new_Data[i] = df[i].iloc[-1]
# print(new_Data)
df = pd.concat([df, new_Data])
2024-05-09 23:49:48 +02:00
plt.figure(figsize=figure_size)
cmap = LinearSegmentedColormap.from_list("", ["white", "blue"])
2024-05-10 01:10:55 +02:00
ax = sns.heatmap(df, fmt=".00%", cmap=cmap, vmin=0, vmax=1, annot=annot_unmet)
2024-05-09 23:49:48 +02:00
cbar = ax.collections[0].colorbar
cbar.set_ticks([0, 0.25, 0.5, 0.75, 1])
cbar.set_ticklabels(['0%', '25%', '50%', '75%', '100%'])
cbar.ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f'{x:.0%}'))
2024-05-10 01:10:55 +02:00
X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))
2024-05-09 23:49:48 +02:00
2024-05-10 01:10:55 +02:00
def fmt(x, pos):
return '{:.0f}%'.format(x * 100)
CS = ax.contour(X, Y, df, colors='black', alpha=0.5)
ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt))
plt.xlim(0, df.shape[1] - 1)
plt.ylim(0, df.shape[0] - 1)
2024-05-09 23:49:48 +02:00
plt.title(title_unmet)
plt.xlabel('ESS Capacity (MWh)')
plt.ylabel('PV Capacity (MW)')
plt.savefig(filename)
2024-05-10 10:08:08 +02:00
with open('config.json', 'r') as f:
js_data = json.load(f)
data = pd.read_csv('combined_data.csv')
time_interval = js_data["time_interval"]["numerator"] / js_data["time_interval"]["denominator"]
pv_loss = js_data["pv"]["loss"]
pv_cost_per_kW = js_data["pv"]["cost_per_kW"]
pv_lifetime = js_data["pv"]["lifetime"]
ess_loss = js_data["ess"]["loss"]
ess_cost_per_kW = js_data["ess"]["cost_per_kW"]
ess_lifetime = js_data["ess"]["lifetime"]
grid_loss = js_data["grid"]["loss"]
sell_price = js_data["grid"]["sell_price"]
grid_capacity = js_data["grid"]["capacity"]
pv_begin = js_data["pv_capacities"]["begin"]
pv_end = js_data["pv_capacities"]["end"]
pv_groups = js_data["pv_capacities"]["groups"]
ess_begin = js_data["ess_capacities"]["begin"]
ess_end = js_data["ess_capacities"]["end"]
ess_groups = js_data["ess_capacities"]["groups"]
annot_unmet = js_data["annotated"]["unmet_prob"]
annot_benefit = js_data["annotated"]["benefit"]
annot_cost = js_data["annotated"]["cost"]
title_unmet = js_data["plot_title"]["unmet_prob"]
title_cost = js_data["plot_title"]["cost"]
title_benefit = js_data["plot_title"]["benefit"]
figure_size = (js_data["figure_size"]["length"], js_data["figure_size"]["height"])
2024-05-10 01:10:55 +02:00
2024-05-09 23:49:48 +02:00
directory = 'data/'
file_list = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
split_files = [f.split('-') for f in file_list]
costs_files = [f for f in split_files if f[-1].endswith('costs.json')]
print(f'find costs files: {costs_files}')
overload_files = [f for f in split_files if f[-1].endswith('overload_cnt.json')]
2024-05-10 10:08:08 +02:00
print(f'find coverage/unmet files: {overload_files}')
2024-05-09 23:49:48 +02:00
results_files = [f for f in split_files if f[-1].endswith('results.json')]
2024-05-10 10:08:08 +02:00
print(f'find profit/benefit files: {results_files}')
2024-05-09 23:49:48 +02:00
costs_dfs = [read_data(directory + '-'.join(f)) for f in costs_files]
overload_dfs = [read_data(directory + '-'.join(f)) for f in overload_files]
results_dfs = [read_data(directory + '-'.join(f)) for f in results_files]
for costs_df, overload_df, results_df in zip(costs_dfs, overload_dfs, results_dfs):
2024-05-10 01:10:55 +02:00
draw_cost(costs_df,
2024-05-10 10:08:08 +02:00
f'plots/costs-ess-{int(costs_df.columns[0])}-{int(costs_df.columns[-1])}-pv-{int(costs_df.index[0])}-{int(costs_df.index[-1])}.png',
title_cost=title_cost,
annot_cost=annot_cost)
2024-05-10 01:10:55 +02:00
draw_overload(overload_df,
2024-05-10 10:08:08 +02:00
f'plots/overload-ess-{overload_df.columns[0]}-{overload_df.columns[-1]}-pv-{overload_df.index[0]}-{overload_df.index[-1]}.png',
title_unmet=title_unmet,
2024-05-10 01:10:55 +02:00
annot_unmet=False)
draw_results(results_df,
2024-05-10 10:08:08 +02:00
f'plots/results-ess-{results_df.columns[0]}-{results_df.columns[-1]}-pv-{results_df.index[0]}-{results_df.index[-1]}.png',
title_benefit=title_benefit,
annot_benefit=False)
2024-05-09 23:49:48 +02:00