move append_bus_shapes to build_bus_regions, apply it where possible

This commit is contained in:
Fabian 2024-04-11 13:27:52 +02:00
parent 219847012d
commit f1b33992f7
3 changed files with 48 additions and 55 deletions

View File

@ -109,6 +109,34 @@ def voronoi_partition_pts(points, outline):
return polygons return polygons
def append_bus_shapes(n, shapes, type):
"""
Append shapes to the network. If shapes with the same component and type
already exist, they will be removed.
Parameters:
n (pypsa.Network): The network to which the shapes will be appended.
shapes (geopandas.GeoDataFrame): The shapes to be appended.
**kwargs: Additional keyword arguments used in `n.madd`.
Returns:
None
"""
remove = n.shapes.query("component == 'Bus' and type == @type").index
n.mremove("Shape", remove)
offset = n.shapes.index.astype(int).max() + 1 if not n.shapes.empty else 0
shapes = shapes.rename(lambda x: int(x) + offset)
n.madd(
"Shape",
shapes.index,
geometry=shapes.geometry,
idx=shapes.name,
component="Bus",
type=type,
)
if __name__ == "__main__": if __name__ == "__main__":
if "snakemake" not in globals(): if "snakemake" not in globals():
from _helpers import mock_snakemake from _helpers import mock_snakemake
@ -119,7 +147,8 @@ if __name__ == "__main__":
countries = snakemake.params.countries countries = snakemake.params.countries
n = pypsa.Network(snakemake.input.base_network) base_network = snakemake.input.base_network
n = pypsa.Network(base_network)
country_shapes = gpd.read_file(snakemake.input.country_shapes).set_index("name")[ country_shapes = gpd.read_file(snakemake.input.country_shapes).set_index("name")[
"geometry" "geometry"
@ -175,32 +204,15 @@ if __name__ == "__main__":
shapes = pd.concat(onshore_regions, ignore_index=True) shapes = pd.concat(onshore_regions, ignore_index=True)
shapes.to_file(snakemake.output.regions_onshore) shapes.to_file(snakemake.output.regions_onshore)
append_bus_shapes(n, shapes, "onshore")
offset = n.shapes.index.astype(int).max() + 1 if not n.shapes.empty else 0
shapes.index = shapes.index.astype(int) + offset
n.madd(
"Shape",
shapes.index,
geometry=shapes.geometry,
idx=shapes.name,
component="Bus",
type="onshore",
)
if offshore_regions: if offshore_regions:
shapes = pd.concat(offshore_regions, ignore_index=True) shapes = pd.concat(offshore_regions, ignore_index=True)
shapes.to_file(snakemake.output.regions_offshore) shapes.to_file(snakemake.output.regions_offshore)
append_bus_shapes(n, shapes, "offshore")
offset = n.shapes.index.astype(int).max() + 1 if not n.shapes.empty else 0
shapes.index = shapes.index.astype(int) + offset
n.madd(
"Shape",
shapes.index,
geometry=shapes.geometry,
idx=shapes.name,
component="Bus",
type="offshore",
)
else: else:
offshore_shapes.to_frame().to_file(snakemake.output.regions_offshore) offshore_shapes.to_frame().to_file(snakemake.output.regions_offshore)
# save network with shapes
n.export_to_netcdf(base_network)

View File

@ -135,6 +135,7 @@ import pypsa
import seaborn as sns import seaborn as sns
from _helpers import configure_logging, set_scenario_config, update_p_nom_max from _helpers import configure_logging, set_scenario_config, update_p_nom_max
from add_electricity import load_costs from add_electricity import load_costs
from build_bus_regions import append_bus_shapes
from packaging.version import Version, parse from packaging.version import Version, parse
from pypsa.clustering.spatial import ( from pypsa.clustering.spatial import (
busmap_by_greedy_modularity, busmap_by_greedy_modularity,
@ -447,33 +448,6 @@ def cluster_regions(busmaps, regions):
return regions_c.reset_index() return regions_c.reset_index()
def append_bus_shapes(n, shapes, type):
"""
Append shapes to the network.
Parameters:
n (pypsa.Network): The network to which the shapes will be appended.
shapes (geopandas.GeoDataFrame): The shapes to be appended.
**kwargs: Additional keyword arguments used in `n.madd`.
Returns:
None
"""
remove = n.shapes.query("component == 'Bus' and type == @which").index
n.mremove("Shape", remove)
offset = n.shapes.index.astype(int).max() + 1 if not n.shapes.empty else 0
shapes.index = shapes.index.astype(int) + offset
n.madd(
"Shape",
shapes.index,
geometry=shapes.geometry,
idx=shapes.name,
component="Bus",
type=type,
)
def plot_busmap_for_n_clusters(n, n_clusters, solver_name="scip", fn=None): def plot_busmap_for_n_clusters(n, n_clusters, solver_name="scip", fn=None):
busmap = busmap_for_n_clusters(n, n_clusters, solver_name) busmap = busmap_for_n_clusters(n, n_clusters, solver_name)
cs = busmap.unique() cs = busmap.unique()
@ -589,8 +563,8 @@ if __name__ == "__main__":
for which in ["regions_onshore", "regions_offshore"]: for which in ["regions_onshore", "regions_offshore"]:
regions = gpd.read_file(snakemake.input[which]) regions = gpd.read_file(snakemake.input[which])
clustered_regions = cluster_regions((clustering.busmap,), regions) clustered_regions = cluster_regions((clustering.busmap,), regions)
append_bus_shapes(nc, clustered_regions, type=which.split("_")[1])
clustered_regions.to_file(snakemake.output[which]) clustered_regions.to_file(snakemake.output[which])
append_bus_shapes(nc, clustered_regions, type=which.split("_")[1])
nc.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards))) nc.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards)))
nc.export_to_netcdf(snakemake.output.network) nc.export_to_netcdf(snakemake.output.network)

View File

@ -88,12 +88,14 @@ The rule :mod:`simplify_network` does up to four things:
import logging import logging
from functools import reduce from functools import reduce
import geopandas as gpd
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import pypsa import pypsa
import scipy as sp import scipy as sp
from _helpers import configure_logging, set_scenario_config, update_p_nom_max from _helpers import configure_logging, set_scenario_config, update_p_nom_max
from add_electricity import load_costs from add_electricity import load_costs
from build_bus_regions import append_bus_shapes
from cluster_network import cluster_regions, clustering_for_n_clusters from cluster_network import cluster_regions, clustering_for_n_clusters
from pypsa.clustering.spatial import ( from pypsa.clustering.spatial import (
aggregateoneport, aggregateoneport,
@ -610,6 +612,7 @@ if __name__ == "__main__":
n.lines.drop(remove, axis=1, errors="ignore", inplace=True) n.lines.drop(remove, axis=1, errors="ignore", inplace=True)
if snakemake.wildcards.simpl: if snakemake.wildcards.simpl:
shapes = n.shapes
n, cluster_map = cluster( n, cluster_map = cluster(
n, n,
int(snakemake.wildcards.simpl), int(snakemake.wildcards.simpl),
@ -619,15 +622,19 @@ if __name__ == "__main__":
params.simplify_network["feature"], params.simplify_network["feature"],
params.aggregation_strategies, params.aggregation_strategies,
) )
n.shapes = shapes
busmaps.append(cluster_map) busmaps.append(cluster_map)
update_p_nom_max(n) update_p_nom_max(n)
n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards)))
n.export_to_netcdf(snakemake.output.network)
busmap_s = reduce(lambda x, y: x.map(y), busmaps[1:], busmaps[0]) busmap_s = reduce(lambda x, y: x.map(y), busmaps[1:], busmaps[0])
busmap_s.to_csv(snakemake.output.busmap) busmap_s.to_csv(snakemake.output.busmap)
for which in ["regions_onshore", "regions_offshore"]: for which in ["regions_onshore", "regions_offshore"]:
cluster_regions(n, busmaps, which, snakemake.input, snakemake.output) regions = gpd.read_file(snakemake.input[which])
clustered_regions = cluster_regions(busmaps, regions)
clustered_regions.to_file(snakemake.output[which])
append_bus_shapes(n, clustered_regions, type=which.split("_")[1])
n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards)))
n.export_to_netcdf(snakemake.output.network)