From 26b202f46399efe53a10b5a1342e9059ffe8c867 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 20 Feb 2024 12:34:19 +0100 Subject: [PATCH] prepare_sector: automatically interpolate in config get() function --- doc/release_notes.rst | 8 +++++--- scripts/prepare_sector_network.py | 27 ++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index bc1cd2c6..15814036 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -7,9 +7,11 @@ Release Notes ########################################## -.. Upcoming Release -.. ================ -.. +Upcoming Release +================ + +* Linearly interpolate missing investment periods in year-dependent + configuration options. PyPSA-Eur 0.10.0 (19th February 2024) ===================================== diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index f5e6604b..3438e3d8 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -215,7 +215,32 @@ def get(item, investment_year=None): """ Check whether item depends on investment year. """ - return item[investment_year] if isinstance(item, dict) else item + if not isinstance(item, dict): + return item + elif investment_year in item.keys(): + return item[investment_year] + else: + logger.warning( + f"Investment key {investment_year} not found in dictionary {item}." + ) + keys = sorted(item.keys()) + if investment_year < keys[0]: + logger.warning(f"Lower than minimum key. Taking minimum key {keys[0]}") + return item[keys[0]] + elif investment_year > keys[-1]: + logger.warning(f"Higher than maximum key. Taking maximum key {keys[0]}") + return item[keys[-1]] + else: + logger.warning( + "Interpolate linearly between the next lower and next higher year." + ) + lower_key = max(k for k in keys if k < investment_year) + higher_key = min(k for k in keys if k > investment_year) + lower = item[lower_key] + higher = item[higher_key] + return lower + (higher - lower) * (investment_year - lower_key) / ( + higher_key - lower_key + ) def co2_emissions_year(