diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 44fd5c5ad2..48fb83e4bf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,13 +34,13 @@ repos: types_or: [python, rst, markdown] files: ^(scripts|doc)/ -# Remove output from Jupyter notebooks -- repo: https://github.com/aflc/pre-commit-jupyter - rev: v1.2.1 - hooks: - - id: jupyter-notebook-cleanup - args: ['--remove-kernel-metadata'] - exclude: examples/solve-on-remote.ipynb +## Remove output from Jupyter notebooks +#- repo: https://github.com/aflc/pre-commit-jupyter +# rev: v1.2.1 +# hooks: +# - id: jupyter-notebook-cleanup +# args: ['--remove-kernel-metadata'] +# exclude: examples/solve-on-remote.ipynb # YAML formatting - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks diff --git a/notebooks/test_pecd.ipynb b/notebooks/test_pecd.ipynb new file mode 100644 index 0000000000..74991deb38 --- /dev/null +++ b/notebooks/test_pecd.ipynb @@ -0,0 +1,5800 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "34b0c9d21186ed1b", + "metadata": {}, + "source": [ + "SPDX-FileCopyrightText: Open Energy Transition gGmbH\n", + "SPDX-License-Identifier: MIT" + ] + }, + { + "cell_type": "markdown", + "id": "26c90410", + "metadata": {}, + "source": [ + "This notebooks compares the available PECD data with the necessary data for TYNDP Scenarios for:\n", + "- [Wind Offshore](#wind-offshore)\n", + "- [Wind Onshore](#wind-onshore)\n", + "- [LF Solar PV Rooftop](#pv-rooftop)\n", + "- [LF Solar PV Utility](#pv-utility)" + ] + }, + { + "cell_type": "markdown", + "id": "fb198b53545bc593", + "metadata": {}, + "source": [ + "# Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "22c0b3ba418ce49e", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:33:55.140604Z", + "start_time": "2025-07-29T13:33:55.125697Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "86ce443498ca0a12", + "metadata": {}, + "source": [ + "# Load raw data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "95e919de88c25b3b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:33:56.213950Z", + "start_time": "2025-07-29T13:33:55.855834Z" + } + }, + "outputs": [], + "source": [ + "offshore_hubs = pd.read_excel(\n", + " \"../data/tyndp_2024_bundle/Offshore hubs/GENERATOR.xlsx\",\n", + " sheet_name=\"ZONE_POTENTIAL\",\n", + ").replace(\"UK\", \"GB\", regex=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8cbc562242c1ed4f", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T14:24:16.349766Z", + "start_time": "2025-07-29T14:24:16.246805Z" + } + }, + "outputs": [], + "source": [ + "investment_data_generators = pd.read_excel(\n", + " \"../data/tyndp_2024_bundle/Investment Datasets/GENERATOR.xlsx\"\n", + ")\n", + "investment_data_trajectories = pd.read_excel(\n", + " \"../data/tyndp_2024_bundle/Investment Datasets/TRAJECTORY.xlsx\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c7d621dd49ebd185", + "metadata": {}, + "source": [ + "# Load processed PECD data & compare" + ] + }, + { + "cell_type": "markdown", + "id": "5e5456d0a1947b3", + "metadata": {}, + "source": [ + "\n", + "## Wind Offshore" + ] + }, + { + "cell_type": "markdown", + "id": "0e9fec86", + "metadata": {}, + "source": [ + "Load and investigate processed pecd data for Wind Offshore for 2030, 2040 and 2050" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d1f880209ce3a46d", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:40:47.857968Z", + "start_time": "2025-07-29T13:40:47.833893Z" + } + }, + "outputs": [], + "source": [ + "pecd_offshore_2030 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_Wind_Offshore_2030.csv\", index_col=0\n", + ")\n", + "pecd_offshore_2040 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_Wind_Offshore_2040.csv\", index_col=0\n", + ")\n", + "pecd_offshore_2050 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_Wind_Offshore_2050.csv\", index_col=0\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ef166cb508f072c", + "metadata": {}, + "source": [ + "### 2030" + ] + }, + { + "cell_type": "markdown", + "id": "67c47bb8", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "450247c8", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:00.443028Z", + "start_time": "2025-07-29T13:34:00.428358Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ALOR001BGOR001CYOR001GROR002HROH001MEOR001MTOR001UAOR001GBOH001GBOH002
2013-03-01 00:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.00.00.00.00.0
.................................
2013-03-07 19:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.00.00.00.00.0
\n", + "

168 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " ALOR001 BGOR001 CYOR001 GROR002 HROH001 MEOR001 \\\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " MTOR001 UAOR001 GBOH001 GBOH002 \n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 \n", + "\n", + "[168 rows x 10 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_offshore_2030.loc[:, (pecd_offshore_2030 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "8d3a8b85", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:00.932277Z", + "start_time": "2025-07-29T13:34:00.928990Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 10 out of 56 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ALOR001',\n", + " 'BGOR001',\n", + " 'CYOR001',\n", + " 'GBOH001',\n", + " 'GBOH002',\n", + " 'GROR002',\n", + " 'HROH001',\n", + " 'MEOR001',\n", + " 'MTOR001',\n", + " 'UAOR001'}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_offshore_2030.loc[:, (pecd_offshore_2030 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_offshore_2030.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "4d50ced2", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0610400d", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T14:13:19.345193Z", + "start_time": "2025-07-29T14:13:19.339162Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ALOR001',\n", + " 'BGOR001',\n", + " 'CYOR001',\n", + " 'GBOH001',\n", + " 'GBOH002',\n", + " 'MEOR001',\n", + " 'NOMOH01',\n", + " 'NONOH01',\n", + " 'NOSOH02',\n", + " 'SEOH001',\n", + " 'UAOR001'}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " offshore_hubs.query(\"MAX_MW == 0 and YEAR == 2030\").OFFSHORE_NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "c3749668", + "metadata": {}, + "source": [ + "Look at the difference" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7767c4cf", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T14:13:22.080383Z", + "start_time": "2025-07-29T14:13:22.076716Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 3 out of 45 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'GROR002', 'HROH001', 'MTOR001'}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(offshore_hubs.OFFSHORE_NODE)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "35b7fcb9", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included with as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "6a5f083b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T14:13:31.838902Z", + "start_time": "2025-07-29T14:13:31.828327Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "set()" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference.difference(\n", + " set(\n", + " offshore_hubs.query(\n", + " \"OFFSHORE_NODE in @difference and YEAR == 2030 and MAX_MW > 0\"\n", + " ).OFFSHORE_NODE.unique()\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9059480a", + "metadata": {}, + "source": [ + "In fact the nodes are included in the Offshore Hub data for 2030 and have a max capacity > 0.\n", + "\n", + "- `GROR002`\n", + "- `HROH001`\n", + "- `MTOR001`\n", + "\n", + "⚠️ Therefore, some necessary PECD data is **missing** for `Wind Offshore` in 2030!" + ] + }, + { + "cell_type": "markdown", + "id": "6b3ff99e1c3d14fa", + "metadata": {}, + "source": [ + "### 2040" + ] + }, + { + "cell_type": "markdown", + "id": "3406b88fa28567db", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6802c55c4d33bb14", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T14:13:59.890480Z", + "start_time": "2025-07-29T14:13:59.877791Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ALOR001BGOR001CYOR001GROR002HROH001MEOR001MTOR001UAOR001GBOH001GBOH002
2013-03-01 00:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.00.00.00.00.0
.................................
2013-03-07 19:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.00.00.00.00.0
\n", + "

168 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " ALOR001 BGOR001 CYOR001 GROR002 HROH001 MEOR001 \\\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " MTOR001 UAOR001 GBOH001 GBOH002 \n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 \n", + "\n", + "[168 rows x 10 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_offshore_2040.loc[:, (pecd_offshore_2040 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d565538d22830980", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T14:14:00.358597Z", + "start_time": "2025-07-29T14:14:00.354696Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 10 out of 56 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ALOR001',\n", + " 'BGOR001',\n", + " 'CYOR001',\n", + " 'GBOH001',\n", + " 'GBOH002',\n", + " 'GROR002',\n", + " 'HROH001',\n", + " 'MEOR001',\n", + " 'MTOR001',\n", + " 'UAOR001'}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_offshore_2040.loc[:, (pecd_offshore_2040 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_offshore_2040.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "1d124e4ca0d80c80", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "d7d60fecdb4c4b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T14:14:03.655735Z", + "start_time": "2025-07-29T14:14:03.648661Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ALOR001', 'CYOR001', 'GBOH001', 'GBOH002', 'MEOR001', 'UAOR001'}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " offshore_hubs.query(\"MAX_MW == 0 and YEAR == 2040\").OFFSHORE_NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "5cdab24533285d9f", + "metadata": {}, + "source": [ + "Look at the difference" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "2205b9889c7a469d", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T14:14:06.912988Z", + "start_time": "2025-07-29T14:14:06.910031Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 4 out of 50 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'BGOR001', 'GROR002', 'HROH001', 'MTOR001'}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(offshore_hubs.OFFSHORE_NODE)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "cdcb6aa881854569", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c89162adc6ad9560", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T14:14:14.824511Z", + "start_time": "2025-07-29T14:14:14.815818Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "set()" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference.difference(\n", + " set(\n", + " offshore_hubs.query(\n", + " \"OFFSHORE_NODE in @difference and YEAR == 2040 and MAX_MW > 0\"\n", + " ).OFFSHORE_NODE.unique()\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "6eac9b73ce522b6", + "metadata": {}, + "source": [ + "In fact the nodes are included in the Offshore Hub data for 2040 and have a max capacity > 0.\n", + "\n", + "- `BGOR001`\n", + "- `GROR002`\n", + "- `MTOR001`\n", + "- `HROH001`\n", + "\n", + "⚠️ Therefore, some necessary PECD data is **missing** for `Wind Offshore` in 2040!" + ] + }, + { + "cell_type": "markdown", + "id": "9e3ddd01", + "metadata": {}, + "source": [ + "### 2050" + ] + }, + { + "cell_type": "markdown", + "id": "a3164d83", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "3a7f9fa5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ALOR001BGOR001CYOR001DEOH002DEOR001DKEOR01DKWOH01DKWOR01EEOH001ESOH001...SEOR001UAOR001GBNIOR1GBOH001GBOH002GBOH003GBOH004GBOH005GBOH006GBOR001
2013-03-01 00:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
..................................................................
2013-03-07 19:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
\n", + "

168 rows × 53 columns

\n", + "
" + ], + "text/plain": [ + " ALOR001 BGOR001 CYOR001 DEOH002 DEOR001 DKEOR01 \\\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " DKWOH01 DKWOR01 EEOH001 ESOH001 ... SEOR001 \\\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "... ... ... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 ... 0.0 \n", + "\n", + " UAOR001 GBNIOR1 GBOH001 GBOH002 GBOH003 GBOH004 \\\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " GBOH005 GBOH006 GBOR001 \n", + "2013-03-01 00:00:00 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 \n", + "... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 \n", + "\n", + "[168 rows x 53 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_offshore_2050.loc[:, (pecd_offshore_2050 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "5d2c2be9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 53 out of 56 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ALOR001',\n", + " 'BGOR001',\n", + " 'CYOR001',\n", + " 'DEOH002',\n", + " 'DEOR001',\n", + " 'DKEOR01',\n", + " 'DKWOH01',\n", + " 'DKWOR01',\n", + " 'EEOH001',\n", + " 'ESOH001',\n", + " 'ESOH002',\n", + " 'ESOH003',\n", + " 'FIOH001',\n", + " 'FROH001',\n", + " 'FROH002',\n", + " 'FROH003',\n", + " 'GBNIOR1',\n", + " 'GBOH001',\n", + " 'GBOH002',\n", + " 'GBOH003',\n", + " 'GBOH004',\n", + " 'GBOH005',\n", + " 'GBOH006',\n", + " 'GBOR001',\n", + " 'GROR001',\n", + " 'GROR002',\n", + " 'HROH001',\n", + " 'IEOH001',\n", + " 'ITCNOR1',\n", + " 'ITCSOR1',\n", + " 'ITN1OR1',\n", + " 'ITS1OR1',\n", + " 'ITSAOR1',\n", + " 'ITSIOR1',\n", + " 'LTOR001',\n", + " 'LVOH001',\n", + " 'MEOR001',\n", + " 'MTOR001',\n", + " 'NLOH001',\n", + " 'NLOR001',\n", + " 'NOMOH01',\n", + " 'NONOH01',\n", + " 'NOSOH01',\n", + " 'NOSOH02',\n", + " 'NOSOR01',\n", + " 'PLOH001',\n", + " 'PTOH001',\n", + " 'ROOR001',\n", + " 'SEOH001',\n", + " 'SEOH002',\n", + " 'SEOH003',\n", + " 'SEOR001',\n", + " 'UAOR001'}" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_offshore_2050.loc[:, (pecd_offshore_2050 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_offshore_2050.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "9c66cd19", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "84447b8a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ALOR001', 'CYOR001', 'MEOR001', 'UAOR001'}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " offshore_hubs.query(\"MAX_MW == 0 and YEAR == 2050\").OFFSHORE_NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "36df36af", + "metadata": {}, + "source": [ + "Look at the difference" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "00c5ca71", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 49 out of 52 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'BGOR001',\n", + " 'DEOH002',\n", + " 'DEOR001',\n", + " 'DKEOR01',\n", + " 'DKWOH01',\n", + " 'DKWOR01',\n", + " 'EEOH001',\n", + " 'ESOH001',\n", + " 'ESOH002',\n", + " 'ESOH003',\n", + " 'FIOH001',\n", + " 'FROH001',\n", + " 'FROH002',\n", + " 'FROH003',\n", + " 'GBNIOR1',\n", + " 'GBOH001',\n", + " 'GBOH002',\n", + " 'GBOH003',\n", + " 'GBOH004',\n", + " 'GBOH005',\n", + " 'GBOH006',\n", + " 'GBOR001',\n", + " 'GROR001',\n", + " 'GROR002',\n", + " 'HROH001',\n", + " 'IEOH001',\n", + " 'ITCNOR1',\n", + " 'ITCSOR1',\n", + " 'ITN1OR1',\n", + " 'ITS1OR1',\n", + " 'ITSAOR1',\n", + " 'ITSIOR1',\n", + " 'LTOR001',\n", + " 'LVOH001',\n", + " 'MTOR001',\n", + " 'NLOH001',\n", + " 'NLOR001',\n", + " 'NOMOH01',\n", + " 'NONOH01',\n", + " 'NOSOH01',\n", + " 'NOSOH02',\n", + " 'NOSOR01',\n", + " 'PLOH001',\n", + " 'PTOH001',\n", + " 'ROOR001',\n", + " 'SEOH001',\n", + " 'SEOH002',\n", + " 'SEOH003',\n", + " 'SEOR001'}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(offshore_hubs.OFFSHORE_NODE)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "2ab23203", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "c0436d2b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "set()" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference.difference(\n", + " set(\n", + " offshore_hubs.query(\n", + " \"OFFSHORE_NODE in @difference and YEAR == 2050 and MAX_MW > 0\"\n", + " ).OFFSHORE_NODE.unique()\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "97c74b38", + "metadata": {}, + "source": [ + "In fact all the nodes are included in the Offshore Hub data for 2050 and have a max capacity > 0.\n", + "\n", + "- `BGOR001`\n", + "- `DEOH002`\n", + "- `DEOR001`\n", + "- `DKEOR01`\n", + "- `DKWOH01`\n", + "- `DKWOR01`\n", + "- `EEOH001`\n", + "- `ESOH001`\n", + "- `ESOH002`\n", + "- `ESOH003`\n", + "- `FIOH001`\n", + "- `FROH001`\n", + "- `FROH002`\n", + "- `FROH003`\n", + "- `GBNIOR1`\n", + "- `GBOH001`\n", + "- `GBOH002`\n", + "- `GBOH003`\n", + "- `GBOH004`\n", + "- `GBOH005`\n", + "- `GBOH006`\n", + "- `GBOR001`\n", + "- `GROR001`\n", + "- `GROR002`\n", + "- `HROH001`\n", + "- `IEOH001`\n", + "- `ITCNOR1`\n", + "- `ITCSOR1`\n", + "- `ITN1OR1`\n", + "- `ITS1OR1`\n", + "- `ITSAOR1`\n", + "- `ITSIOR1`\n", + "- `LTOR001`\n", + "- `LVOH001`\n", + "- `MTOR001`\n", + "- `NLOH001`\n", + "- `NLOR001`\n", + "- `NOMOH01`\n", + "- `NONOH01`\n", + "- `NOSOH01`\n", + "- `NOSOH02`\n", + "- `NOSOR01`\n", + "- `PLOH001`\n", + "- `PTOH001`\n", + "- `ROOR001`\n", + "- `SEOH001`\n", + "- `SEOH002`\n", + "- `SEOH003`\n", + "- `SEOR001`\n", + "\n", + "⚠️ Therefore, some necessary PECD data is **missing** for `Wind Offshore` in 2050!" + ] + }, + { + "cell_type": "markdown", + "id": "93b9906ddb5f87c2", + "metadata": {}, + "source": [ + "\n", + "## Wind Onshore" + ] + }, + { + "cell_type": "markdown", + "id": "5e60de54", + "metadata": {}, + "source": [ + "Load and investigate processed pecd data for Wind Onshore for 2030 and 2040.\n", + "\n", + "**Note!** No comparison can be made for 2050 as no Wind Onshore data at all has been provided in the PECD dataset.\n", + "\n", + "Therefore all necessary data for Wind Onshore 2050 is missing!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "3149b7e6", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:07.457951Z", + "start_time": "2025-07-29T13:34:07.449839Z" + } + }, + "outputs": [], + "source": [ + "pecd_onshore_2030 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_Wind_Onshore_2030.csv\", index_col=0\n", + ")\n", + "pecd_onshore_2040 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_Wind_Onshore_2040.csv\", index_col=0\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d0dcd92a", + "metadata": {}, + "source": [ + "### 2030" + ] + }, + { + "cell_type": "markdown", + "id": "1b9b2624", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "4b4cc646", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:08.378997Z", + "start_time": "2025-07-29T13:34:08.370176Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LUB1LUF1LUV1MT00ITCOITVI
2013-03-01 00:00:000.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.0
.....................
2013-03-07 19:00:000.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.0
\n", + "

168 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " LUB1 LUF1 LUV1 MT00 ITCO ITVI\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "... ... ... ... ... ... ...\n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "\n", + "[168 rows x 6 columns]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_onshore_2030.loc[:, (pecd_onshore_2030 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "3a9112f8", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:08.906482Z", + "start_time": "2025-07-29T13:34:08.903088Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 6 out of 54 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI', 'LUB1', 'LUF1', 'LUV1', 'MT00'}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_onshore_2030.loc[:, (pecd_onshore_2030 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_onshore_2030.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "e0a204c2", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "89db92e7", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:13.093194Z", + "start_time": "2025-07-29T13:34:13.083244Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'DEKF', 'DKKF', 'LUB1', 'LUF1', 'LUV1', 'MT00'}" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " investment_data_trajectories.query(\n", + " \"TECHNOLOGY.str.contains('Wind Onshore') and `MAX CAPACITY [MW]` == 0 and YEAR == 2030\"\n", + " ).NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "1e54a1a5", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:14.063112Z", + "start_time": "2025-07-29T13:34:14.056489Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 2 out of 48 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(pecd_onshore_2030.columns)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "902fb244", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included with as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "8e0f3c0a", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:15.441166Z", + "start_time": "2025-07-29T13:34:15.431761Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " difference.difference(\n", + " set(\n", + " investment_data_trajectories.query(\n", + " \"NODE in @difference \"\n", + " \"and TECHNOLOGY.str.contains('Wind Onshore') \"\n", + " \"and YEAR == 2050 \"\n", + " \"and `MAX CAPACITY [MW]` > 0\"\n", + " ).NODE.unique()\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "af5ad185ab905530", + "metadata": {}, + "source": [ + "The missing nodes `ITCO` and `ITVI` are in fact not included in the investment data set. This is because they are virtual nodes used for modelling purposes in Italy.\n", + "\n", + "✅ Therefore, all necessary PECD data is **available** for `Wind Onshore` in 2030!" + ] + }, + { + "cell_type": "markdown", + "id": "29b1ef75", + "metadata": {}, + "source": [ + "### 2040" + ] + }, + { + "cell_type": "markdown", + "id": "61f2e114", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "e5ad0ac9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LUB1LUF1LUV1MT00ITCOITVI
2013-03-01 00:00:000.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.0
.....................
2013-03-07 19:00:000.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.0
\n", + "

168 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " LUB1 LUF1 LUV1 MT00 ITCO ITVI\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "... ... ... ... ... ... ...\n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0\n", + "\n", + "[168 rows x 6 columns]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_onshore_2040.loc[:, (pecd_onshore_2040 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "122d55a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 6 out of 54 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI', 'LUB1', 'LUF1', 'LUV1', 'MT00'}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_onshore_2040.loc[:, (pecd_onshore_2040 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_onshore_2040.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "dbe4c5ad", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "4f0aba57", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'DEKF', 'DKKF', 'LUB1', 'LUF1', 'LUV1', 'MT00'}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " investment_data_trajectories.query(\n", + " \"TECHNOLOGY.str.contains('Wind Onshore') and `MAX CAPACITY [MW]` == 0 and YEAR == 2040\"\n", + " ).NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "0f3f70e1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 2 out of 48 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(pecd_onshore_2040.columns)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "c995740b", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included with as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "a2c23309", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " difference.difference(\n", + " set(\n", + " investment_data_trajectories.query(\n", + " \"NODE in @difference \"\n", + " \"and TECHNOLOGY.str.contains('Wind Onshore') \"\n", + " \"and YEAR == 2040 \"\n", + " \"and `MAX CAPACITY [MW]` > 0\"\n", + " ).NODE.unique()\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d1c7d2d7", + "metadata": {}, + "source": [ + "The missing nodes `ITCO` and `ITVI` are in fact not included in the investment data set. This is because they are virtual nodes used for modelling purposes in Italy.\n", + "\n", + "✅ Therefore, all necessary PECD data is **available** for `Wind Onshore` in 2040!" + ] + }, + { + "cell_type": "markdown", + "id": "b54fc792", + "metadata": {}, + "source": [ + "### 2050" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "5a5869ff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "48 techs are available with MAX_MW > zero in that year. The data is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'AL00',\n", + " 'AT00',\n", + " 'BA00',\n", + " 'BE00',\n", + " 'BG00',\n", + " 'CH00',\n", + " 'CY00',\n", + " 'CZ00',\n", + " 'DE00',\n", + " 'DKE1',\n", + " 'DKW1',\n", + " 'EE00',\n", + " 'ES00',\n", + " 'FI00',\n", + " 'FR00',\n", + " 'GR00',\n", + " 'GR03',\n", + " 'HR00',\n", + " 'HU00',\n", + " 'IE00',\n", + " 'ITCA',\n", + " 'ITCN',\n", + " 'ITCS',\n", + " 'ITN1',\n", + " 'ITS1',\n", + " 'ITSA',\n", + " 'ITSI',\n", + " 'LT00',\n", + " 'LUG1',\n", + " 'LV00',\n", + " 'ME00',\n", + " 'MK00',\n", + " 'NL00',\n", + " 'NOM1',\n", + " 'NON1',\n", + " 'NOS0',\n", + " 'PL00',\n", + " 'PT00',\n", + " 'RO00',\n", + " 'RS00',\n", + " 'SE01',\n", + " 'SE02',\n", + " 'SE03',\n", + " 'SE04',\n", + " 'SI00',\n", + " 'SK00',\n", + " 'UK00',\n", + " 'UKNI'}" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_available = set(\n", + " investment_data_trajectories.query(\n", + " \"TECHNOLOGY.str.contains('Wind Onshore') and `MAX CAPACITY [MW]` > 0 and YEAR == 2050\"\n", + " ).NODE.unique()\n", + ")\n", + "print(\n", + " f\"{len(tech_available)} techs are available with MAX_MW > zero in that year. The data is missing.\"\n", + ")\n", + "tech_available" + ] + }, + { + "cell_type": "markdown", + "id": "2aaf08c9", + "metadata": {}, + "source": [ + "⚠️ Therefore, all necessary PECD data is **missing** for `Wind Onshore` in 2050!\n", + "\n", + "- `AL00`\n", + "- `AT00`\n", + "- `BA00`\n", + "- `BE00`\n", + "- `BG00`\n", + "- `CH00`\n", + "- `CY00`\n", + "- `CZ00`\n", + "- `DE00`\n", + "- `DKE1`\n", + "- `DKW1`\n", + "- `EE00`\n", + "- `ES00`\n", + "- `FI00`\n", + "- `FR00`\n", + "- `GR00`\n", + "- `GR03`\n", + "- `HR00`\n", + "- `HU00`\n", + "- `IE00`\n", + "- `ITCA`\n", + "- `ITCN`\n", + "- `ITCS`\n", + "- `ITN1`\n", + "- `ITS1`\n", + "- `ITSA`\n", + "- `ITSI`\n", + "- `LT00`\n", + "- `LUG1`\n", + "- `LV00`\n", + "- `ME00`\n", + "- `MK00`\n", + "- `NL00`\n", + "- `NOM1`\n", + "- `NON1`\n", + "- `NOS0`\n", + "- `PL00`\n", + "- `PT00`\n", + "- `RO00`\n", + "- `RS00`\n", + "- `SE01`\n", + "- `SE02`\n", + "- `SE03`\n", + "- `SE04`\n", + "- `SI00`\n", + "- `SK00`\n", + "- `UK00`\n", + "- `UKNI`" + ] + }, + { + "cell_type": "markdown", + "id": "30b33c59c28b4c4c", + "metadata": {}, + "source": [ + "\n", + "## LF Solar PV Rooftop" + ] + }, + { + "cell_type": "markdown", + "id": "c6dc29ef", + "metadata": {}, + "source": [ + "Load and investigate processed pecd data for Solar PV Rooftop for 2030, 2040 and 2050" + ] + }, + { + "cell_type": "markdown", + "id": "73c40fa5", + "metadata": {}, + "source": [ + "Look at the difference" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "884abc41", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:18.232325Z", + "start_time": "2025-07-29T13:34:18.224010Z" + } + }, + "outputs": [], + "source": [ + "pecd_solar_rooftop_2030 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_LFSolarPVRooftop_2030.csv\", index_col=0\n", + ")\n", + "pecd_solar_rooftop_2040 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_LFSolarPVRooftop_2040.csv\", index_col=0\n", + ")\n", + "pecd_solar_rooftop_2050 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_LFSolarPVRooftop_2050.csv\", index_col=0\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "17dfb663", + "metadata": {}, + "source": [ + "### 2030" + ] + }, + { + "cell_type": "markdown", + "id": "a0b85494", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "d2498958", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:19.631096Z", + "start_time": "2025-07-29T13:34:19.620706Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LUB1LUF1LUV1NON1SE01ITCOITVI
2013-03-01 00:00:000.00.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.00.0
........................
2013-03-07 19:00:000.00.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.00.0
\n", + "

168 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " LUB1 LUF1 LUV1 NON1 SE01 ITCO ITVI\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "... ... ... ... ... ... ... ...\n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "\n", + "[168 rows x 7 columns]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_solar_rooftop_2030.loc[:, (pecd_solar_rooftop_2030 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "424774cd", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:19.911535Z", + "start_time": "2025-07-29T13:34:19.908344Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 7 out of 54 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI', 'LUB1', 'LUF1', 'LUV1', 'NON1', 'SE01'}" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_solar_rooftop_2030.loc[:, (pecd_solar_rooftop_2030 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_solar_rooftop_2030.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "57de3260", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "92e8070c", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:21.628422Z", + "start_time": "2025-07-29T13:34:21.620801Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "17 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'AL00',\n", + " 'BA00',\n", + " 'DEKF',\n", + " 'DKKF',\n", + " 'EE00',\n", + " 'FR00',\n", + " 'GR00',\n", + " 'GR03',\n", + " 'LT00',\n", + " 'LUB1',\n", + " 'LUF1',\n", + " 'LUV1',\n", + " 'ME00',\n", + " 'NON1',\n", + " 'PL00',\n", + " 'SE01',\n", + " 'SK00'}" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " investment_data_trajectories.query(\n", + " \"TECHNOLOGY.str.contains('Solar PV Rooftop') \"\n", + " \"and `MAX CAPACITY [MW]` == 0 \"\n", + " \"and YEAR == 2030\"\n", + " ).NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "fb226b2b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:22.323235Z", + "start_time": "2025-07-29T13:34:22.317314Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 2 out of 37 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(pecd_solar_rooftop_2030.columns)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "eed61667", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included with as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "00c3d1d9", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:25.303004Z", + "start_time": "2025-07-29T13:34:25.294828Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " difference.difference(\n", + " set(\n", + " investment_data_trajectories.query(\n", + " \"NODE in @difference \"\n", + " \"and TECHNOLOGY.str.contains('Solar PV Rooftop') \"\n", + " \"and YEAR == 2030 \"\n", + " \"and `MAX CAPACITY [MW]` > 0\"\n", + " ).NODE.unique()\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cedb0959", + "metadata": {}, + "source": [ + "The missing nodes `ITCO` and `ITVI` are in fact not included in the investment data set. This is because they are virtual nodes used for modelling purposes in Italy.\n", + "\n", + "✅ Therefore, all necessary PECD data is **available** for `Solar PV Rooftop` in 2030!" + ] + }, + { + "cell_type": "markdown", + "id": "b0813745", + "metadata": {}, + "source": [ + "### 2040" + ] + }, + { + "cell_type": "markdown", + "id": "8038c638", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "8264b610", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LUB1LUF1LUV1NON1SE01ITCOITVI
2013-03-01 00:00:000.00.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.00.0
........................
2013-03-07 19:00:000.00.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.00.0
\n", + "

168 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " LUB1 LUF1 LUV1 NON1 SE01 ITCO ITVI\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "... ... ... ... ... ... ... ...\n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "\n", + "[168 rows x 7 columns]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_solar_rooftop_2040.loc[:, (pecd_solar_rooftop_2040 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "02168ef7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 7 out of 54 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI', 'LUB1', 'LUF1', 'LUV1', 'NON1', 'SE01'}" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_solar_rooftop_2040.loc[:, (pecd_solar_rooftop_2040 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_solar_rooftop_2040.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "2d6c43b9", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "c50918bb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'AL00',\n", + " 'BA00',\n", + " 'DEKF',\n", + " 'DKKF',\n", + " 'GR03',\n", + " 'LUB1',\n", + " 'LUF1',\n", + " 'LUV1',\n", + " 'ME00',\n", + " 'NON1',\n", + " 'SE01'}" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " investment_data_trajectories.query(\n", + " \"TECHNOLOGY.str.contains('Solar PV Rooftop') \"\n", + " \"and `MAX CAPACITY [MW]` == 0 \"\n", + " \"and YEAR == 2040\"\n", + " ).NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "8a34a7eb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 2 out of 43 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(pecd_solar_rooftop_2040.columns)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "3ac9fcf2", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included with as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "c4972f69", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " difference.difference(\n", + " set(\n", + " investment_data_trajectories.query(\n", + " \"NODE in @difference \"\n", + " \"and TECHNOLOGY.str.contains('Solar PV Rooftop') \"\n", + " \"and YEAR == 2040 \"\n", + " \"and `MAX CAPACITY [MW]` > 0\"\n", + " ).NODE.unique()\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ea9f5e06", + "metadata": {}, + "source": [ + "The missing nodes `ITCO` and `ITVI` are in fact not included in the investment data set. This is because they are virtual nodes used for modelling purposes in Italy.\n", + "\n", + "✅ Therefore, all necessary PECD data is **available** for `Solar PV Rooftop` in 2040!" + ] + }, + { + "cell_type": "markdown", + "id": "3421290c", + "metadata": {}, + "source": [ + "### 2050" + ] + }, + { + "cell_type": "markdown", + "id": "dc9ed8d6", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "3f6b251e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AL00AT00BA00BE00BG00CH00CY00CZ00DE00DKE1DKW1ES00FI00LUB1LUF1LUV1NON1SE01ITCOITVI
2013-03-01 00:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
...............................................................
2013-03-07 19:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
\n", + "

168 rows × 20 columns

\n", + "
" + ], + "text/plain": [ + " AL00 AT00 BA00 BE00 BG00 CH00 CY00 CZ00 DE00 \\\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " DKE1 DKW1 ES00 FI00 LUB1 LUF1 LUV1 NON1 SE01 \\\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " ITCO ITVI \n", + "2013-03-01 00:00:00 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 \n", + "... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 \n", + "\n", + "[168 rows x 20 columns]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_solar_rooftop_2050.loc[:, (pecd_solar_rooftop_2050 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "9499c0d8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 20 out of 54 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'AL00',\n", + " 'AT00',\n", + " 'BA00',\n", + " 'BE00',\n", + " 'BG00',\n", + " 'CH00',\n", + " 'CY00',\n", + " 'CZ00',\n", + " 'DE00',\n", + " 'DKE1',\n", + " 'DKW1',\n", + " 'ES00',\n", + " 'FI00',\n", + " 'ITCO',\n", + " 'ITVI',\n", + " 'LUB1',\n", + " 'LUF1',\n", + " 'LUV1',\n", + " 'NON1',\n", + " 'SE01'}" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_solar_rooftop_2050.loc[:, (pecd_solar_rooftop_2050 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_solar_rooftop_2050.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "7599b656", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "22aed601", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'AL00',\n", + " 'BA00',\n", + " 'DEKF',\n", + " 'DKKF',\n", + " 'GR03',\n", + " 'LUB1',\n", + " 'LUF1',\n", + " 'LUV1',\n", + " 'ME00',\n", + " 'NON1',\n", + " 'SE01'}" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " investment_data_trajectories.query(\n", + " \"TECHNOLOGY.str.contains('Solar PV Rooftop') \"\n", + " \"and `MAX CAPACITY [MW]` == 0 \"\n", + " \"and YEAR == 2050\"\n", + " ).NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "531fd113", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 13 out of 43 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'AT00',\n", + " 'BE00',\n", + " 'BG00',\n", + " 'CH00',\n", + " 'CY00',\n", + " 'CZ00',\n", + " 'DE00',\n", + " 'DKE1',\n", + " 'DKW1',\n", + " 'ES00',\n", + " 'FI00',\n", + " 'ITCO',\n", + " 'ITVI'}" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(pecd_solar_rooftop_2050.columns)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "ab43cfb5", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included with as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "97071ce8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " difference.difference(\n", + " set(\n", + " investment_data_trajectories.query(\n", + " \"NODE in @difference \"\n", + " \"and TECHNOLOGY.str.contains('Solar PV Rooftop') \"\n", + " \"and YEAR == 2050 \"\n", + " \"and `MAX CAPACITY [MW]` > 0\"\n", + " ).NODE.unique()\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a5ff04b0", + "metadata": {}, + "source": [ + "Only the missing nodes `ITCO` and `ITVI` are in fact not included in the investment data set. This is because they are virtual nodes used for modelling purposes in Italy.\n", + "\n", + "⚠️ The other 11 nodes are **missing** PECD data for `Solar PV Rooftop` in 2050!\n", + "\n", + "- `AT00`\n", + "- `BE00`\n", + "- `BG00`\n", + "- `CH00`\n", + "- `CY00`\n", + "- `CZ00`\n", + "- `DE00`\n", + "- `DKE1`\n", + "- `DKW1`\n", + "- `ES00`\n", + "- `FI00`" + ] + }, + { + "cell_type": "markdown", + "id": "8e01f764f0aa06a3", + "metadata": {}, + "source": [ + "\n", + "## LF Solar PV Utility" + ] + }, + { + "cell_type": "markdown", + "id": "1af6aad9", + "metadata": {}, + "source": [ + "Load and investigate processed pecd data for Solar PV Utility for 2030, 2040 and 2050" + ] + }, + { + "cell_type": "markdown", + "id": "733f8363", + "metadata": {}, + "source": [ + "Look at the difference" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "fd209c2b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:32.361337Z", + "start_time": "2025-07-29T13:34:32.354698Z" + } + }, + "outputs": [], + "source": [ + "pecd_solar_utility_2030 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_LFSolarPVUtility_2030.csv\", index_col=0\n", + ")\n", + "pecd_solar_utility_2040 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_LFSolarPVUtility_2040.csv\", index_col=0\n", + ")\n", + "pecd_solar_utility_2050 = pd.read_csv(\n", + " \"../resources/test-sector-tyndp/pecd_data_LFSolarPVUtility_2050.csv\", index_col=0\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "0bdaf5b9", + "metadata": {}, + "source": [ + "### 2030" + ] + }, + { + "cell_type": "markdown", + "id": "1608532d", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "aafed306", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:32.779685Z", + "start_time": "2025-07-29T13:34:32.771945Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LUB1LUF1LUV1NON1SE01ITCOITVI
2013-03-01 00:00:000.00.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.00.0
........................
2013-03-07 19:00:000.00.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.00.0
\n", + "

168 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " LUB1 LUF1 LUV1 NON1 SE01 ITCO ITVI\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "... ... ... ... ... ... ... ...\n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "\n", + "[168 rows x 7 columns]" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_solar_utility_2030.loc[:, (pecd_solar_utility_2030 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "3514ecc0", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:33.366059Z", + "start_time": "2025-07-29T13:34:33.361201Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 7 out of 54 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI', 'LUB1', 'LUF1', 'LUV1', 'NON1', 'SE01'}" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_solar_utility_2030.loc[:, (pecd_solar_utility_2030 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_solar_utility_2030.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "f12ba18c", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "d7ea162c", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:34.211733Z", + "start_time": "2025-07-29T13:34:34.204247Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "21 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'BE00',\n", + " 'CH00',\n", + " 'DEKF',\n", + " 'DKKF',\n", + " 'EE00',\n", + " 'FR00',\n", + " 'GR00',\n", + " 'GR03',\n", + " 'LT00',\n", + " 'LUB1',\n", + " 'LUF1',\n", + " 'LUV1',\n", + " 'NOM1',\n", + " 'NON1',\n", + " 'NOS0',\n", + " 'PL00',\n", + " 'SE02',\n", + " 'SE03',\n", + " 'SE04',\n", + " 'SI00',\n", + " 'SK00'}" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " investment_data_trajectories.query(\n", + " \"TECHNOLOGY.str.contains('Solar PV Utility') \"\n", + " \"and `MAX CAPACITY [MW]` == 0 \"\n", + " \"and YEAR == 2030\"\n", + " ).NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "491b16b5", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:34.631686Z", + "start_time": "2025-07-29T13:34:34.627881Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 3 out of 33 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI', 'SE01'}" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(pecd_solar_utility_2030.columns)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "1d136ab4", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included with as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "51b9ad4b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:35.475733Z", + "start_time": "2025-07-29T13:34:35.468348Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " difference.difference(\n", + " set(\n", + " investment_data_trajectories.query(\n", + " \"NODE in @difference \"\n", + " \"and TECHNOLOGY.str.contains('Solar PV Utility') \"\n", + " \"and YEAR == 2030 \"\n", + " \"and `MAX CAPACITY [MW]` > 0\"\n", + " ).NODE.unique()\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9890be4c", + "metadata": {}, + "source": [ + "In fact, only the missing nodes `ITVI` and `ITCO` are not included. This. The missing node `SE01` is included in the investment data set and have a max capacity > 0.\n", + "\n", + "- `SE01`\n", + "\n", + "⚠️ Therefore, some necessary PECD data is **missing** for `Solar PV Utility` for 2030!" + ] + }, + { + "cell_type": "markdown", + "id": "187839ee", + "metadata": {}, + "source": [ + "### 2040" + ] + }, + { + "cell_type": "markdown", + "id": "5f68012d", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "45f5809e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LUB1LUF1LUV1NON1SE01ITCOITVI
2013-03-01 00:00:000.00.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.00.0
........................
2013-03-07 19:00:000.00.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.00.0
\n", + "

168 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " LUB1 LUF1 LUV1 NON1 SE01 ITCO ITVI\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "... ... ... ... ... ... ... ...\n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "\n", + "[168 rows x 7 columns]" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_solar_utility_2040.loc[:, (pecd_solar_utility_2040 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "ca51db95", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 7 out of 54 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI', 'LUB1', 'LUF1', 'LUV1', 'NON1', 'SE01'}" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_solar_utility_2040.loc[:, (pecd_solar_utility_2040 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_solar_utility_2040.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "5a9aa8ef", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "9d0be5d3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'BE00',\n", + " 'CH00',\n", + " 'DEKF',\n", + " 'DKKF',\n", + " 'LUB1',\n", + " 'LUF1',\n", + " 'LUV1',\n", + " 'NOM1',\n", + " 'NON1',\n", + " 'NOS0',\n", + " 'SE02',\n", + " 'SE03',\n", + " 'SE04',\n", + " 'SI00'}" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " investment_data_trajectories.query(\n", + " \"TECHNOLOGY.str.contains('Solar PV Utility') \"\n", + " \"and `MAX CAPACITY [MW]` == 0 \"\n", + " \"and YEAR == 2040\"\n", + " ).NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "e0d7283a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 3 out of 40 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI', 'SE01'}" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(pecd_solar_utility_2040.columns)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "2d688852", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included with as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "dc6bd53c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " difference.difference(\n", + " set(\n", + " investment_data_trajectories.query(\n", + " \"NODE in @difference \"\n", + " \"and TECHNOLOGY.str.contains('Solar PV Utility') \"\n", + " \"and YEAR == 2040 \"\n", + " \"and `MAX CAPACITY [MW]` > 0\"\n", + " ).NODE.unique()\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a8780c43", + "metadata": {}, + "source": [ + "In fact, only the missing nodes `ITVI` and `ITCO` are not included. This. The missing node `SE01` is included in the investment data set and have a max capacity > 0.\n", + "\n", + "- `SE01`\n", + "\n", + "⚠️ Therefore, some necessary PECD data is **missing** for `Solar PV Utility` for 2040!" + ] + }, + { + "cell_type": "markdown", + "id": "99c536c1", + "metadata": {}, + "source": [ + "### 2050" + ] + }, + { + "cell_type": "markdown", + "id": "e29f886e", + "metadata": {}, + "source": [ + "Filter for columns with no data" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "02042dc5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AL00AT00BA00BE00BG00CH00CY00CZ00DE00DKE1DKW1ES00FI00LUB1LUF1LUV1NON1SE01ITCOITVI
2013-03-01 00:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-01 01:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-01 02:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-01 03:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-01 04:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
...............................................................
2013-03-07 19:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-07 20:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-07 21:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-07 22:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
2013-03-07 23:00:000.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
\n", + "

168 rows × 20 columns

\n", + "
" + ], + "text/plain": [ + " AL00 AT00 BA00 BE00 BG00 CH00 CY00 CZ00 DE00 \\\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " DKE1 DKW1 ES00 FI00 LUB1 LUF1 LUV1 NON1 SE01 \\\n", + "2013-03-01 00:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... ... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " ITCO ITVI \n", + "2013-03-01 00:00:00 0.0 0.0 \n", + "2013-03-01 01:00:00 0.0 0.0 \n", + "2013-03-01 02:00:00 0.0 0.0 \n", + "2013-03-01 03:00:00 0.0 0.0 \n", + "2013-03-01 04:00:00 0.0 0.0 \n", + "... ... ... \n", + "2013-03-07 19:00:00 0.0 0.0 \n", + "2013-03-07 20:00:00 0.0 0.0 \n", + "2013-03-07 21:00:00 0.0 0.0 \n", + "2013-03-07 22:00:00 0.0 0.0 \n", + "2013-03-07 23:00:00 0.0 0.0 \n", + "\n", + "[168 rows x 20 columns]" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_solar_utility_2050.loc[:, (pecd_solar_utility_2050 == 0).all()]" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "6db2d912", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 20 out of 54 nodes is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'AL00',\n", + " 'AT00',\n", + " 'BA00',\n", + " 'BE00',\n", + " 'BG00',\n", + " 'CH00',\n", + " 'CY00',\n", + " 'CZ00',\n", + " 'DE00',\n", + " 'DKE1',\n", + " 'DKW1',\n", + " 'ES00',\n", + " 'FI00',\n", + " 'ITCO',\n", + " 'ITVI',\n", + " 'LUB1',\n", + " 'LUF1',\n", + " 'LUV1',\n", + " 'NON1',\n", + " 'SE01'}" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pecd_not_available = set(\n", + " pecd_solar_utility_2050.loc[:, (pecd_solar_utility_2050 == 0).all()].columns\n", + ")\n", + "print(\n", + " f\"Data for {len(pecd_not_available)} out of {len(set(pecd_solar_utility_2050.columns))} nodes is missing.\"\n", + ")\n", + "pecd_not_available" + ] + }, + { + "cell_type": "markdown", + "id": "c6471f5a", + "metadata": {}, + "source": [ + "Compare with Offshore nodes that have no capacity potential" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "8b04a805", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "15 techs have MAX_MW of zero in that year.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'BE00',\n", + " 'CH00',\n", + " 'DEKF',\n", + " 'DKKF',\n", + " 'LUB1',\n", + " 'LUF1',\n", + " 'LUV1',\n", + " 'MT00',\n", + " 'NOM1',\n", + " 'NON1',\n", + " 'NOS0',\n", + " 'SE02',\n", + " 'SE03',\n", + " 'SE04',\n", + " 'SI00'}" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tech_not_available = set(\n", + " investment_data_trajectories.query(\n", + " \"TECHNOLOGY.str.contains('Solar PV Utility') \"\n", + " \"and `MAX CAPACITY [MW]` == 0 \"\n", + " \"and YEAR == 2050\"\n", + " ).NODE.unique()\n", + ")\n", + "print(f\"{len(tech_not_available)} techs have MAX_MW of zero in that year.\")\n", + "tech_not_available" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "03606dba", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data for 14 out of 39 nodes with available capacity is missing.\n" + ] + }, + { + "data": { + "text/plain": [ + "{'AL00',\n", + " 'AT00',\n", + " 'BA00',\n", + " 'BG00',\n", + " 'CY00',\n", + " 'CZ00',\n", + " 'DE00',\n", + " 'DKE1',\n", + " 'DKW1',\n", + " 'ES00',\n", + " 'FI00',\n", + " 'ITCO',\n", + " 'ITVI',\n", + " 'SE01'}" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "difference = set(list(pecd_not_available.difference(tech_not_available)))\n", + "print(\n", + " f\"Data for {len(difference)} out of {len(set(pecd_solar_utility_2050.columns)) - len(tech_not_available)} nodes with available capacity is missing.\"\n", + ")\n", + "difference" + ] + }, + { + "cell_type": "markdown", + "id": "5ab605df", + "metadata": {}, + "source": [ + "Verify that the nodes with missing data are indeed included with as a node and with a max potential > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "abf7d659", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ITCO', 'ITVI'}" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(\n", + " difference.difference(\n", + " set(\n", + " investment_data_trajectories.query(\n", + " \"NODE in @difference \"\n", + " \"and TECHNOLOGY.str.contains('Solar PV Utility') \"\n", + " \"and YEAR == 2050 \"\n", + " \"and `MAX CAPACITY [MW]` > 0\"\n", + " ).NODE.unique()\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "4ca1c254", + "metadata": {}, + "source": [ + "In fact, only the missing nodes `ITVI` and `ITCO` are not included. This. The other 12 missing nodes are included in the investment data set and have a max capacity > 0.\n", + "\n", + "- `AL00`\n", + "- `AT00`\n", + "- `BA00`\n", + "- `BG00`\n", + "- `CY00`\n", + "- `CZ00`\n", + "- `DE00`\n", + "- `DKE1`\n", + "- `DKW1`\n", + "- `ES00`\n", + "- `FI00`\n", + "- `SE01`\n", + "\n", + "⚠️ Therefore, some necessary PECD data is **missing** for `Solar PV Utility` for 2050!" + ] + }, + { + "cell_type": "markdown", + "id": "f87a8edf7e1277d3", + "metadata": {}, + "source": [ + "## Solar CSP" + ] + }, + { + "cell_type": "markdown", + "id": "20e253fb8875bb41", + "metadata": {}, + "source": [ + "Check if solar CSP is indeed modelled in TYNDP as there is limited to no mention of Solar CSP in the methodology report and the Scenario results." + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "52e14eb1", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:37.538120Z", + "start_time": "2025-07-29T13:34:37.529124Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NODESCENARIOTECHNOLOGYYEARMIN CAPACITY [MW]MAX CAPACITY [MW]
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [NODE, SCENARIO, TECHNOLOGY, YEAR, MIN CAPACITY [MW], MAX CAPACITY [MW]]\n", + "Index: []" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "investment_data_trajectories.query(\"TECHNOLOGY.str.contains('CSP')\")" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "fcf7a28b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-29T13:34:37.707703Z", + "start_time": "2025-07-29T13:34:37.697222Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NODEYEARSCENARIOTECHNOLOGYCAPEX [€/MW]OPEX[€/MW/a]EFFICIENCY
4All2030Distributed EnergySolar CSP0.00.0NaN
27All2030Global AmbitionSolar CSP0.00.0NaN
50All2030National TrendsSolar CSP0.00.0NaN
73All2035Distributed EnergySolar CSP0.00.0NaN
96All2035Global AmbitionSolar CSP0.00.0NaN
119All2035National TrendsSolar CSP0.00.0NaN
142All2040Distributed EnergySolar CSP0.00.0NaN
165All2040Global AmbitionSolar CSP0.00.0NaN
188All2040National TrendsSolar CSP0.00.0NaN
211All2045Distributed EnergySolar CSP0.00.0NaN
234All2045Global AmbitionSolar CSP0.00.0NaN
257All2045National TrendsSolar CSP0.00.0NaN
280All2050Distributed EnergySolar CSP0.00.0NaN
303All2050Global AmbitionSolar CSP0.00.0NaN
326All2050National TrendsSolar CSP0.00.0NaN
\n", + "
" + ], + "text/plain": [ + " NODE YEAR SCENARIO TECHNOLOGY CAPEX [€/MW] OPEX[€/MW/a] \\\n", + "4 All 2030 Distributed Energy Solar CSP 0.0 0.0 \n", + "27 All 2030 Global Ambition Solar CSP 0.0 0.0 \n", + "50 All 2030 National Trends Solar CSP 0.0 0.0 \n", + "73 All 2035 Distributed Energy Solar CSP 0.0 0.0 \n", + "96 All 2035 Global Ambition Solar CSP 0.0 0.0 \n", + "119 All 2035 National Trends Solar CSP 0.0 0.0 \n", + "142 All 2040 Distributed Energy Solar CSP 0.0 0.0 \n", + "165 All 2040 Global Ambition Solar CSP 0.0 0.0 \n", + "188 All 2040 National Trends Solar CSP 0.0 0.0 \n", + "211 All 2045 Distributed Energy Solar CSP 0.0 0.0 \n", + "234 All 2045 Global Ambition Solar CSP 0.0 0.0 \n", + "257 All 2045 National Trends Solar CSP 0.0 0.0 \n", + "280 All 2050 Distributed Energy Solar CSP 0.0 0.0 \n", + "303 All 2050 Global Ambition Solar CSP 0.0 0.0 \n", + "326 All 2050 National Trends Solar CSP 0.0 0.0 \n", + "\n", + " EFFICIENCY \n", + "4 NaN \n", + "27 NaN \n", + "50 NaN \n", + "73 NaN \n", + "96 NaN \n", + "119 NaN \n", + "142 NaN \n", + "165 NaN \n", + "188 NaN \n", + "211 NaN \n", + "234 NaN \n", + "257 NaN \n", + "280 NaN \n", + "303 NaN \n", + "326 NaN " + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "investment_data_generators.query(\"TECHNOLOGY.str.contains('CSP')\")" + ] + }, + { + "cell_type": "markdown", + "id": "0911b58c", + "metadata": {}, + "source": [ + "Solar CSP has no specified trajectory or potential. It appears for all scenarios in the investment generator datasets, however with no CAPEX, OPEX or efficiency." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cff9909f473dfc34", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "open-tyndp", + "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", + "version": "3.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}