pypsa-eur/notebooks/cross_border_data.ipynb

378 lines
11 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "e61f2a4e",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import pypsa\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import country_converter as coco"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "73333588",
"metadata": {},
"outputs": [],
"source": [
"cc = coco.CountryConverter()\n",
"historic = pd.read_csv(\n",
" \"../resources/validation-test/historical_cross_border_flows.csv\",\n",
" index_col=0,\n",
" header=0,\n",
" parse_dates=True,\n",
")\n",
"\n",
"n = pypsa.Network(\"../results/validation-test/networks/elec_s_37_ec_lv1.0_Ept.nc\")\n",
"n.loads.carrier = \"load\""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b38a3232",
"metadata": {},
"outputs": [],
"source": [
"len(historic.index)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "489739b8",
"metadata": {},
"outputs": [],
"source": [
"len(n.snapshots)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a79b025a",
"metadata": {},
"outputs": [],
"source": [
"if len(historic.index) > len(n.snapshots):\n",
" print(\"yes\")\n",
" historic = historic.resample(n.snapshots.inferred_freq).mean().loc[n.snapshots]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8e5b5b18",
"metadata": {},
"outputs": [],
"source": [
"all_country = sorted(\n",
" list(\n",
" set(\n",
" [link[:2] for link in historic.columns[1:]]\n",
" + [link[5:] for link in historic.columns[1:]]\n",
" )\n",
" )\n",
")\n",
"\n",
"color_country = {\n",
" \"AL\": \"#440154\",\n",
" \"AT\": \"#482677\",\n",
" \"BA\": \"#43398e\",\n",
" \"BE\": \"#3953a4\",\n",
" \"BG\": \"#2c728e\",\n",
" \"CH\": \"#228b8d\",\n",
" \"CZ\": \"#1f9d8a\",\n",
" \"DE\": \"#29af7f\",\n",
" \"DK\": \"#3fbc73\",\n",
" \"EE\": \"#5ec962\",\n",
" \"ES\": \"#84d44b\",\n",
" \"FI\": \"#addc30\",\n",
" \"FR\": \"#d8e219\",\n",
" \"GB\": \"#fde725\",\n",
" \"GR\": \"#f0f921\",\n",
" \"HR\": \"#f1c25e\",\n",
" \"HU\": \"#f4a784\",\n",
" \"IE\": \"#f78f98\",\n",
" \"IT\": \"#f87ea0\",\n",
" \"LT\": \"#f87a9a\",\n",
" \"LU\": \"#f57694\",\n",
" \"LV\": \"#f3758d\",\n",
" \"ME\": \"#f37685\",\n",
" \"MK\": \"#f37b7c\",\n",
" \"NL\": \"#f28774\",\n",
" \"NO\": \"#f1976b\",\n",
" \"PL\": \"#efaa63\",\n",
" \"PT\": \"#ebb160\",\n",
" \"RO\": \"#e6c260\",\n",
" \"RS\": \"#e2d75e\",\n",
" \"SE\": \"#dedc5b\",\n",
" \"SI\": \"#d9e35a\",\n",
" \"SK\": \"#d3e75a\",\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0b3c8b87",
"metadata": {},
"outputs": [],
"source": [
"optimized_links = n.links_t.p0.rename(\n",
" columns=dict(n.links.bus0.str[:2] + \" - \" + n.links.bus1.str[:2])\n",
")\n",
"optimized_lines = n.lines_t.p0.rename(\n",
" columns=dict(n.lines.bus0.str[:2] + \" - \" + n.lines.bus1.str[:2])\n",
")\n",
"optimized = pd.concat([optimized_links, optimized_lines], axis=1)\n",
"\n",
"# Drop internal country connection\n",
"optimized.drop([c for c in optimized.columns if c[:2] == c[5:]], axis=1, inplace=True)\n",
"\n",
"# align columns name\n",
"for c1 in optimized.columns:\n",
" for c2 in optimized.columns:\n",
" if c1[:2] == c2[5:] and c2[:2] == c1[5:]:\n",
" optimized = optimized.rename(columns={c1: c2})\n",
"\n",
"optimized = optimized.groupby(lambda x: x, axis=1).sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "118dcec1",
"metadata": {},
"outputs": [],
"source": [
"n.links_t.p0"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8cdc309f",
"metadata": {},
"outputs": [],
"source": [
"optimized_lines[\"AL - GR\"].plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "10e575d8",
"metadata": {},
"outputs": [],
"source": [
"optimized"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "66fd3180",
"metadata": {},
"outputs": [],
"source": [
"def sort_one_country(country, df):\n",
" indices = [link for link in df.columns if country in link]\n",
" df_country = df[indices].copy()\n",
" for link in df_country.columns:\n",
" if country in link[5:]:\n",
" df_country[link] = -df_country[link]\n",
" link_reverse = str(link[5:] + \" - \" + link[:2])\n",
" df_country = df_country.rename(columns={link: link_reverse})\n",
"\n",
" return df_country.reindex(sorted(df_country.columns), axis=1)\n",
"\n",
"\n",
"def cross_border_time_series(data):\n",
" fig, ax = plt.subplots(2 * len(all_country), 1, figsize=(15, 10 * len(all_country)))\n",
" axis = 0\n",
"\n",
" for country in all_country:\n",
" ymin = 0\n",
" ymax = 0\n",
" for df in data:\n",
" df_country = sort_one_country(country, df)\n",
" df_neg, df_pos = df_country.clip(upper=0), df_country.clip(lower=0)\n",
"\n",
" color = [color_country[link[5:]] for link in df_country.columns]\n",
"\n",
" df_pos.plot.area(\n",
" ax=ax[axis], stacked=True, linewidth=0.0, color=color, ylim=[-1, 1]\n",
" )\n",
"\n",
" df_neg.plot.area(\n",
" ax=ax[axis], stacked=True, linewidth=0.0, color=color, ylim=[-1, 1]\n",
" )\n",
" if (axis % 2) == 0:\n",
" title = \"Historic\"\n",
" else:\n",
" title = \"Optimized\"\n",
"\n",
" ax[axis].set_title(\n",
" title + \" Import / Export for \" + cc.convert(country, to=\"name_short\")\n",
" )\n",
"\n",
" # Custom legend elements\n",
" legend_elements = []\n",
"\n",
" for link in df_country.columns:\n",
" legend_elements = legend_elements + [\n",
" plt.fill_between(\n",
" [],\n",
" [],\n",
" color=color_country[link[5:]],\n",
" label=cc.convert(link[5:], to=\"name_short\"),\n",
" )\n",
" ]\n",
"\n",
" # Create the legend\n",
" ax[axis].legend(handles=legend_elements, loc=\"upper right\")\n",
"\n",
" # rescale the y axis\n",
" neg_min = df_neg.sum(axis=1).min() * 1.2\n",
" if neg_min < ymin:\n",
" ymin = neg_min\n",
"\n",
" pos_max = df_pos.sum(axis=1).max() * 1.2\n",
" if pos_max < ymax:\n",
" ymax = pos_max\n",
"\n",
" print(f\"{str(len(df_pos))} in {str(axis)}\")\n",
"\n",
" axis = axis + 1\n",
"\n",
" for x in range(axis - 2, axis):\n",
" ax[x].set_ylim([neg_min, pos_max])\n",
"\n",
" fig.savefig(f\"trade_time_series/trade_time_series.png\", bbox_inches=\"tight\")\n",
"\n",
"\n",
"def cross_border_bar(data):\n",
" df_positive = pd.DataFrame()\n",
" df_negative = pd.DataFrame()\n",
" color = []\n",
"\n",
" for country in all_country:\n",
" order = 0\n",
" for df in data:\n",
" if (order % 2) == 0:\n",
" title = \"Historic\"\n",
" else:\n",
" title = \"Optimized\"\n",
"\n",
" df_country = sort_one_country(country, df)\n",
" df_neg, df_pos = df_country.clip(upper=0), df_country.clip(lower=0)\n",
"\n",
" color = [color_country[link[5:]] for link in df_country.columns] + color\n",
" df_positive_new = pd.DataFrame(data=df_pos.sum()).T.rename(\n",
" {0: title + \" \" + cc.convert(country, to=\"name_short\")}\n",
" )\n",
" df_negative_new = pd.DataFrame(data=df_neg.sum()).T.rename(\n",
" {0: title + \" \" + cc.convert(country, to=\"name_short\")}\n",
" )\n",
"\n",
" df_positive = pd.concat([df_positive_new, df_positive])\n",
" df_negative = pd.concat([df_negative_new, df_negative])\n",
"\n",
" order = order + 1\n",
"\n",
" fig, ax = plt.subplots(figsize=(15, 60))\n",
"\n",
" # for i in range(3):\n",
" # color[i] = '#545454'\n",
"\n",
" df_positive.plot.barh(ax=ax, stacked=True, color=color, zorder=2)\n",
" df_negative.plot.barh(ax=ax, stacked=True, color=color, zorder=2)\n",
"\n",
" plt.grid(axis=\"x\", zorder=0)\n",
" plt.grid(axis=\"y\", zorder=0)\n",
"\n",
" # Custom legend elements\n",
" legend_elements = []\n",
"\n",
" for country in list(color_country.keys()):\n",
" legend_elements = legend_elements + [\n",
" plt.fill_between(\n",
" [],\n",
" [],\n",
" color=color_country[country],\n",
" label=cc.convert(country, to=\"name_short\"),\n",
" )\n",
" ]\n",
"\n",
" # Create the legend\n",
" plt.legend(handles=legend_elements, loc=\"upper right\")\n",
"\n",
" fig.savefig(\"cross_border_bar.png\", bbox_inches=\"tight\")\n",
"\n",
" # Show the plot\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b9684a69",
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"cross_border_bar([historic, optimized])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f8d67c3d",
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"cross_border_time_series([historic, optimized])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b5c36dbd",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "",
"language": "python",
"name": ""
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}