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",
+ " ALOR001 | \n",
+ " BGOR001 | \n",
+ " CYOR001 | \n",
+ " GROR002 | \n",
+ " HROH001 | \n",
+ " MEOR001 | \n",
+ " MTOR001 | \n",
+ " UAOR001 | \n",
+ " GBOH001 | \n",
+ " GBOH002 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " ALOR001 | \n",
+ " BGOR001 | \n",
+ " CYOR001 | \n",
+ " GROR002 | \n",
+ " HROH001 | \n",
+ " MEOR001 | \n",
+ " MTOR001 | \n",
+ " UAOR001 | \n",
+ " GBOH001 | \n",
+ " GBOH002 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " ALOR001 | \n",
+ " BGOR001 | \n",
+ " CYOR001 | \n",
+ " DEOH002 | \n",
+ " DEOR001 | \n",
+ " DKEOR01 | \n",
+ " DKWOH01 | \n",
+ " DKWOR01 | \n",
+ " EEOH001 | \n",
+ " ESOH001 | \n",
+ " ... | \n",
+ " SEOR001 | \n",
+ " UAOR001 | \n",
+ " GBNIOR1 | \n",
+ " GBOH001 | \n",
+ " GBOH002 | \n",
+ " GBOH003 | \n",
+ " GBOH004 | \n",
+ " GBOH005 | \n",
+ " GBOH006 | \n",
+ " GBOR001 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " LUB1 | \n",
+ " LUF1 | \n",
+ " LUV1 | \n",
+ " MT00 | \n",
+ " ITCO | \n",
+ " ITVI | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " LUB1 | \n",
+ " LUF1 | \n",
+ " LUV1 | \n",
+ " MT00 | \n",
+ " ITCO | \n",
+ " ITVI | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " LUB1 | \n",
+ " LUF1 | \n",
+ " LUV1 | \n",
+ " NON1 | \n",
+ " SE01 | \n",
+ " ITCO | \n",
+ " ITVI | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " LUB1 | \n",
+ " LUF1 | \n",
+ " LUV1 | \n",
+ " NON1 | \n",
+ " SE01 | \n",
+ " ITCO | \n",
+ " ITVI | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " 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",
+ " LUB1 | \n",
+ " LUF1 | \n",
+ " LUV1 | \n",
+ " NON1 | \n",
+ " SE01 | \n",
+ " ITCO | \n",
+ " ITVI | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " LUB1 | \n",
+ " LUF1 | \n",
+ " LUV1 | \n",
+ " NON1 | \n",
+ " SE01 | \n",
+ " ITCO | \n",
+ " ITVI | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " LUB1 | \n",
+ " LUF1 | \n",
+ " LUV1 | \n",
+ " NON1 | \n",
+ " SE01 | \n",
+ " ITCO | \n",
+ " ITVI | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " 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",
+ " LUB1 | \n",
+ " LUF1 | \n",
+ " LUV1 | \n",
+ " NON1 | \n",
+ " SE01 | \n",
+ " ITCO | \n",
+ " ITVI | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2013-03-01 00:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 01:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 02:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 03:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-01 04:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 19:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 20:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 21:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 22:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2013-03-07 23:00:00 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " NODE | \n",
+ " SCENARIO | \n",
+ " TECHNOLOGY | \n",
+ " YEAR | \n",
+ " MIN CAPACITY [MW] | \n",
+ " MAX CAPACITY [MW] | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "
\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",
+ " NODE | \n",
+ " YEAR | \n",
+ " SCENARIO | \n",
+ " TECHNOLOGY | \n",
+ " CAPEX [€/MW] | \n",
+ " OPEX[€/MW/a] | \n",
+ " EFFICIENCY | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 4 | \n",
+ " All | \n",
+ " 2030 | \n",
+ " Distributed Energy | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " All | \n",
+ " 2030 | \n",
+ " Global Ambition | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 50 | \n",
+ " All | \n",
+ " 2030 | \n",
+ " National Trends | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 73 | \n",
+ " All | \n",
+ " 2035 | \n",
+ " Distributed Energy | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 96 | \n",
+ " All | \n",
+ " 2035 | \n",
+ " Global Ambition | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 119 | \n",
+ " All | \n",
+ " 2035 | \n",
+ " National Trends | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 142 | \n",
+ " All | \n",
+ " 2040 | \n",
+ " Distributed Energy | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 165 | \n",
+ " All | \n",
+ " 2040 | \n",
+ " Global Ambition | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 188 | \n",
+ " All | \n",
+ " 2040 | \n",
+ " National Trends | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 211 | \n",
+ " All | \n",
+ " 2045 | \n",
+ " Distributed Energy | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 234 | \n",
+ " All | \n",
+ " 2045 | \n",
+ " Global Ambition | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 257 | \n",
+ " All | \n",
+ " 2045 | \n",
+ " National Trends | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 280 | \n",
+ " All | \n",
+ " 2050 | \n",
+ " Distributed Energy | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 303 | \n",
+ " All | \n",
+ " 2050 | \n",
+ " Global Ambition | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 326 | \n",
+ " All | \n",
+ " 2050 | \n",
+ " National Trends | \n",
+ " Solar CSP | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ "
\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
+}