From 2c9c29f0bd34b12c3df9051eed9e4e45cc88f18d Mon Sep 17 00:00:00 2001 From: Henry Choi Date: Thu, 9 Jan 2025 10:22:00 +0900 Subject: [PATCH 1/4] Fix overlapping bus regions when alternative clustering is selected --- scripts/build_bus_regions.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/scripts/build_bus_regions.py b/scripts/build_bus_regions.py index 1a0dc2338..c7f48b7ef 100644 --- a/scripts/build_bus_regions.py +++ b/scripts/build_bus_regions.py @@ -256,6 +256,22 @@ def get_gadm_shape( crs=country_shapes.crs, ).dropna(axis="index", subset=["geometry"]) + if snakemake.params.alternative_clustering: + # determine isolated buses + n.determine_network_topology() + non_isolated_buses = n.buses.duplicated(subset=["sub_network"], keep=False) + isolated_buses = n.buses[~non_isolated_buses].index + # drop isolated buses + onshore_regions = onshore_regions[~onshore_regions.name.isin(isolated_buses)] + # drop duplicates based on shape_id + onshore_regions = onshore_regions.drop_duplicates('shape_id') + + if len(onshore_regions) < len(gadm_country): + logger.error( + f"The number of remaining of buses are less than the number of administrative clusters suggested!" + ) + raise ValueError("Insufficient buses to match administrative clusters!") + onshore_regions = pd.concat([onshore_regions], ignore_index=True).to_file( snakemake.output.regions_onshore ) From 1eb3b34cadc034ba1d39b2fc57ad28d4bea7fb08 Mon Sep 17 00:00:00 2001 From: Henry Choi Date: Fri, 10 Jan 2025 10:49:28 +0900 Subject: [PATCH 2/4] Add code to keep isolated buses when necessary --- scripts/build_bus_regions.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/scripts/build_bus_regions.py b/scripts/build_bus_regions.py index c7f48b7ef..6dc057d28 100644 --- a/scripts/build_bus_regions.py +++ b/scripts/build_bus_regions.py @@ -261,16 +261,19 @@ def get_gadm_shape( n.determine_network_topology() non_isolated_buses = n.buses.duplicated(subset=["sub_network"], keep=False) isolated_buses = n.buses[~non_isolated_buses].index - # drop isolated buses - onshore_regions = onshore_regions[~onshore_regions.name.isin(isolated_buses)] - # drop duplicates based on shape_id - onshore_regions = onshore_regions.drop_duplicates('shape_id') - + non_isolated_regions = onshore_regions[~onshore_regions.name.isin(isolated_buses)] + isolated_regions = onshore_regions[onshore_regions.name.isin(isolated_buses)] + + # Combine regions while prioritizing non-isolated ones + onshore_regions = ( + pd.concat([non_isolated_regions, isolated_regions]) + .drop_duplicates("shape_id", keep="first") + ) + if len(onshore_regions) < len(gadm_country): - logger.error( + logger.warning( f"The number of remaining of buses are less than the number of administrative clusters suggested!" ) - raise ValueError("Insufficient buses to match administrative clusters!") onshore_regions = pd.concat([onshore_regions], ignore_index=True).to_file( snakemake.output.regions_onshore From 2b388a8fde0cf35add2e418312cda1821c8d4558 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 10 Jan 2025 01:54:42 +0000 Subject: [PATCH 3/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_bus_regions.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/scripts/build_bus_regions.py b/scripts/build_bus_regions.py index 6dc057d28..e5b3cf3ca 100644 --- a/scripts/build_bus_regions.py +++ b/scripts/build_bus_regions.py @@ -261,15 +261,16 @@ def get_gadm_shape( n.determine_network_topology() non_isolated_buses = n.buses.duplicated(subset=["sub_network"], keep=False) isolated_buses = n.buses[~non_isolated_buses].index - non_isolated_regions = onshore_regions[~onshore_regions.name.isin(isolated_buses)] + non_isolated_regions = onshore_regions[ + ~onshore_regions.name.isin(isolated_buses) + ] isolated_regions = onshore_regions[onshore_regions.name.isin(isolated_buses)] - + # Combine regions while prioritizing non-isolated ones - onshore_regions = ( - pd.concat([non_isolated_regions, isolated_regions]) - .drop_duplicates("shape_id", keep="first") - ) - + onshore_regions = pd.concat( + [non_isolated_regions, isolated_regions] + ).drop_duplicates("shape_id", keep="first") + if len(onshore_regions) < len(gadm_country): logger.warning( f"The number of remaining of buses are less than the number of administrative clusters suggested!" From 8c7ec249ac9fee435ecbb514ed9575a6fbd8d15c Mon Sep 17 00:00:00 2001 From: Davide Fioriti Date: Fri, 10 Jan 2025 13:58:28 +0100 Subject: [PATCH 4/4] Add release note --- doc/release_notes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 80f8f7410..89c4031b2 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -18,6 +18,7 @@ This part of documentation collects descriptive release notes to capture the mai * Prevent computation of powerplantmatching if replace option is selected for custom_powerplants `PR #1281 `__ +* Fix overlapping bus regions when alternative clustering is selected `PR #1287 `__ PyPSA-Earth 0.6.0 =================