snakemake dependencies in base_network
This commit is contained in:
parent
505f093141
commit
9b7bb27da1
@ -112,8 +112,8 @@ def _find_closest_links(links, new_links, distance_upper_bound=1.5):
|
|||||||
.sort_index()['i']
|
.sort_index()['i']
|
||||||
|
|
||||||
|
|
||||||
def _load_buses_from_eg():
|
def _load_buses_from_eg(eg_buses, europe_shape, config_elec):
|
||||||
buses = (pd.read_csv(snakemake.input.eg_buses, quotechar="'",
|
buses = (pd.read_csv(eg_buses, quotechar="'",
|
||||||
true_values=['t'], false_values=['f'],
|
true_values=['t'], false_values=['f'],
|
||||||
dtype=dict(bus_id="str"))
|
dtype=dict(bus_id="str"))
|
||||||
.set_index("bus_id")
|
.set_index("bus_id")
|
||||||
@ -124,18 +124,18 @@ def _load_buses_from_eg():
|
|||||||
buses['under_construction'] = buses['under_construction'].fillna(False).astype(bool)
|
buses['under_construction'] = buses['under_construction'].fillna(False).astype(bool)
|
||||||
|
|
||||||
# remove all buses outside of all countries including exclusive economic zones (offshore)
|
# remove all buses outside of all countries including exclusive economic zones (offshore)
|
||||||
europe_shape = gpd.read_file(snakemake.input.europe_shape).loc[0, 'geometry']
|
europe_shape = gpd.read_file(europe_shape).loc[0, 'geometry']
|
||||||
europe_shape_prepped = shapely.prepared.prep(europe_shape)
|
europe_shape_prepped = shapely.prepared.prep(europe_shape)
|
||||||
buses_in_europe_b = buses[['x', 'y']].apply(lambda p: europe_shape_prepped.contains(Point(p)), axis=1)
|
buses_in_europe_b = buses[['x', 'y']].apply(lambda p: europe_shape_prepped.contains(Point(p)), axis=1)
|
||||||
|
|
||||||
buses_with_v_nom_to_keep_b = buses.v_nom.isin(snakemake.config['electricity']['voltages']) | buses.v_nom.isnull()
|
buses_with_v_nom_to_keep_b = buses.v_nom.isin(config_elec['voltages']) | buses.v_nom.isnull()
|
||||||
logger.info("Removing buses with voltages {}".format(pd.Index(buses.v_nom.unique()).dropna().difference(snakemake.config['electricity']['voltages'])))
|
logger.info("Removing buses with voltages {}".format(pd.Index(buses.v_nom.unique()).dropna().difference(config_elec['voltages'])))
|
||||||
|
|
||||||
return pd.DataFrame(buses.loc[buses_in_europe_b & buses_with_v_nom_to_keep_b])
|
return pd.DataFrame(buses.loc[buses_in_europe_b & buses_with_v_nom_to_keep_b])
|
||||||
|
|
||||||
|
|
||||||
def _load_transformers_from_eg(buses):
|
def _load_transformers_from_eg(buses, eg_transformers):
|
||||||
transformers = (pd.read_csv(snakemake.input.eg_transformers, quotechar="'",
|
transformers = (pd.read_csv(eg_transformers, quotechar="'",
|
||||||
true_values=['t'], false_values=['f'],
|
true_values=['t'], false_values=['f'],
|
||||||
dtype=dict(transformer_id='str', bus0='str', bus1='str'))
|
dtype=dict(transformer_id='str', bus0='str', bus1='str'))
|
||||||
.set_index('transformer_id'))
|
.set_index('transformer_id'))
|
||||||
@ -145,8 +145,8 @@ def _load_transformers_from_eg(buses):
|
|||||||
return transformers
|
return transformers
|
||||||
|
|
||||||
|
|
||||||
def _load_converters_from_eg(buses):
|
def _load_converters_from_eg(buses, eg_converters):
|
||||||
converters = (pd.read_csv(snakemake.input.eg_converters, quotechar="'",
|
converters = (pd.read_csv(eg_converters, quotechar="'",
|
||||||
true_values=['t'], false_values=['f'],
|
true_values=['t'], false_values=['f'],
|
||||||
dtype=dict(converter_id='str', bus0='str', bus1='str'))
|
dtype=dict(converter_id='str', bus0='str', bus1='str'))
|
||||||
.set_index('converter_id'))
|
.set_index('converter_id'))
|
||||||
@ -158,8 +158,8 @@ def _load_converters_from_eg(buses):
|
|||||||
return converters
|
return converters
|
||||||
|
|
||||||
|
|
||||||
def _load_links_from_eg(buses):
|
def _load_links_from_eg(buses, eg_links):
|
||||||
links = (pd.read_csv(snakemake.input.eg_links, quotechar="'", true_values=['t'], false_values=['f'],
|
links = (pd.read_csv(eg_links, quotechar="'", true_values=['t'], false_values=['f'],
|
||||||
dtype=dict(link_id='str', bus0='str', bus1='str', under_construction="bool"))
|
dtype=dict(link_id='str', bus0='str', bus1='str', under_construction="bool"))
|
||||||
.set_index('link_id'))
|
.set_index('link_id'))
|
||||||
|
|
||||||
@ -176,11 +176,11 @@ def _load_links_from_eg(buses):
|
|||||||
return links
|
return links
|
||||||
|
|
||||||
|
|
||||||
def _add_links_from_tyndp(buses, links):
|
def _add_links_from_tyndp(buses, links, links_tyndp, europe_shape):
|
||||||
links_tyndp = pd.read_csv(snakemake.input.links_tyndp)
|
links_tyndp = pd.read_csv(links_tyndp)
|
||||||
|
|
||||||
# remove all links from list which lie outside all of the desired countries
|
# remove all links from list which lie outside all of the desired countries
|
||||||
europe_shape = gpd.read_file(snakemake.input.europe_shape).loc[0, 'geometry']
|
europe_shape = gpd.read_file(europe_shape).loc[0, 'geometry']
|
||||||
europe_shape_prepped = shapely.prepared.prep(europe_shape)
|
europe_shape_prepped = shapely.prepared.prep(europe_shape)
|
||||||
x1y1_in_europe_b = links_tyndp[['x1', 'y1']].apply(lambda p: europe_shape_prepped.contains(Point(p)), axis=1)
|
x1y1_in_europe_b = links_tyndp[['x1', 'y1']].apply(lambda p: europe_shape_prepped.contains(Point(p)), axis=1)
|
||||||
x2y2_in_europe_b = links_tyndp[['x2', 'y2']].apply(lambda p: europe_shape_prepped.contains(Point(p)), axis=1)
|
x2y2_in_europe_b = links_tyndp[['x2', 'y2']].apply(lambda p: europe_shape_prepped.contains(Point(p)), axis=1)
|
||||||
@ -248,8 +248,8 @@ def _add_links_from_tyndp(buses, links):
|
|||||||
return buses, links.append(links_tyndp, sort=True)
|
return buses, links.append(links_tyndp, sort=True)
|
||||||
|
|
||||||
|
|
||||||
def _load_lines_from_eg(buses):
|
def _load_lines_from_eg(buses, eg_lines):
|
||||||
lines = (pd.read_csv(snakemake.input.eg_lines, quotechar="'", true_values=['t'], false_values=['f'],
|
lines = (pd.read_csv(eg_lines, quotechar="'", true_values=['t'], false_values=['f'],
|
||||||
dtype=dict(line_id='str', bus0='str', bus1='str',
|
dtype=dict(line_id='str', bus0='str', bus1='str',
|
||||||
underground="bool", under_construction="bool"))
|
underground="bool", under_construction="bool"))
|
||||||
.set_index('line_id')
|
.set_index('line_id')
|
||||||
@ -262,8 +262,8 @@ def _load_lines_from_eg(buses):
|
|||||||
return lines
|
return lines
|
||||||
|
|
||||||
|
|
||||||
def _apply_parameter_corrections(n):
|
def _apply_parameter_corrections(n, parameter_corrections):
|
||||||
with open(snakemake.input.parameter_corrections) as f:
|
with open(parameter_corrections) as f:
|
||||||
corrections = yaml.safe_load(f)
|
corrections = yaml.safe_load(f)
|
||||||
|
|
||||||
if corrections is None: return
|
if corrections is None: return
|
||||||
@ -285,14 +285,14 @@ def _apply_parameter_corrections(n):
|
|||||||
df.loc[inds, attr] = r[inds].astype(df[attr].dtype)
|
df.loc[inds, attr] = r[inds].astype(df[attr].dtype)
|
||||||
|
|
||||||
|
|
||||||
def _set_electrical_parameters_lines(lines):
|
def _set_electrical_parameters_lines(lines, config):
|
||||||
v_noms = snakemake.config['electricity']['voltages']
|
v_noms = config['electricity']['voltages']
|
||||||
linetypes = snakemake.config['lines']['types']
|
linetypes = config['lines']['types']
|
||||||
|
|
||||||
for v_nom in v_noms:
|
for v_nom in v_noms:
|
||||||
lines.loc[lines["v_nom"] == v_nom, 'type'] = linetypes[v_nom]
|
lines.loc[lines["v_nom"] == v_nom, 'type'] = linetypes[v_nom]
|
||||||
|
|
||||||
lines['s_max_pu'] = snakemake.config['lines']['s_max_pu']
|
lines['s_max_pu'] = config['lines']['s_max_pu']
|
||||||
|
|
||||||
return lines
|
return lines
|
||||||
|
|
||||||
@ -304,14 +304,14 @@ def _set_lines_s_nom_from_linetypes(n):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _set_electrical_parameters_links(links):
|
def _set_electrical_parameters_links(links, config, links_p_nom):
|
||||||
if links.empty: return links
|
if links.empty: return links
|
||||||
|
|
||||||
p_max_pu = snakemake.config['links'].get('p_max_pu', 1.)
|
p_max_pu = config['links'].get('p_max_pu', 1.)
|
||||||
links['p_max_pu'] = p_max_pu
|
links['p_max_pu'] = p_max_pu
|
||||||
links['p_min_pu'] = -p_max_pu
|
links['p_min_pu'] = -p_max_pu
|
||||||
|
|
||||||
links_p_nom = pd.read_csv(snakemake.input.links_p_nom)
|
links_p_nom = pd.read_csv(links_p_nom)
|
||||||
|
|
||||||
# filter links that are not in operation anymore
|
# filter links that are not in operation anymore
|
||||||
removed_b = links_p_nom.Remarks.str.contains('Shut down|Replaced', na=False)
|
removed_b = links_p_nom.Remarks.str.contains('Shut down|Replaced', na=False)
|
||||||
@ -331,8 +331,8 @@ def _set_electrical_parameters_links(links):
|
|||||||
return links
|
return links
|
||||||
|
|
||||||
|
|
||||||
def _set_electrical_parameters_converters(converters):
|
def _set_electrical_parameters_converters(converters, config):
|
||||||
p_max_pu = snakemake.config['links'].get('p_max_pu', 1.)
|
p_max_pu = config['links'].get('p_max_pu', 1.)
|
||||||
converters['p_max_pu'] = p_max_pu
|
converters['p_max_pu'] = p_max_pu
|
||||||
converters['p_min_pu'] = -p_max_pu
|
converters['p_min_pu'] = -p_max_pu
|
||||||
|
|
||||||
@ -345,8 +345,8 @@ def _set_electrical_parameters_converters(converters):
|
|||||||
return converters
|
return converters
|
||||||
|
|
||||||
|
|
||||||
def _set_electrical_parameters_transformers(transformers):
|
def _set_electrical_parameters_transformers(transformers, config):
|
||||||
config = snakemake.config['transformers']
|
config = config['transformers']
|
||||||
|
|
||||||
## Add transformer parameters
|
## Add transformer parameters
|
||||||
transformers["x"] = config.get('x', 0.1)
|
transformers["x"] = config.get('x', 0.1)
|
||||||
@ -373,7 +373,7 @@ def _remove_unconnected_components(network):
|
|||||||
return network[component == component_sizes.index[0]]
|
return network[component == component_sizes.index[0]]
|
||||||
|
|
||||||
|
|
||||||
def _set_countries_and_substations(n):
|
def _set_countries_and_substations(n, config, country_shapes, offshore_shapes):
|
||||||
|
|
||||||
buses = n.buses
|
buses = n.buses
|
||||||
|
|
||||||
@ -386,9 +386,9 @@ def _set_countries_and_substations(n):
|
|||||||
index=buses.index
|
index=buses.index
|
||||||
)
|
)
|
||||||
|
|
||||||
countries = snakemake.config['countries']
|
countries = config['countries']
|
||||||
country_shapes = gpd.read_file(snakemake.input.country_shapes).set_index('name')['geometry']
|
country_shapes = gpd.read_file(country_shapes).set_index('name')['geometry']
|
||||||
offshore_shapes = gpd.read_file(snakemake.input.offshore_shapes).set_index('name')['geometry']
|
offshore_shapes = gpd.read_file(offshore_shapes).set_index('name')['geometry']
|
||||||
substation_b = buses['symbol'].str.contains('substation|converter station', case=False)
|
substation_b = buses['symbol'].str.contains('substation|converter station', case=False)
|
||||||
|
|
||||||
def prefer_voltage(x, which):
|
def prefer_voltage(x, which):
|
||||||
@ -498,19 +498,19 @@ def _replace_b2b_converter_at_country_border_by_link(n):
|
|||||||
.format(i, b0, line, linkcntry.at[i], buscntry.at[b1]))
|
.format(i, b0, line, linkcntry.at[i], buscntry.at[b1]))
|
||||||
|
|
||||||
|
|
||||||
def _set_links_underwater_fraction(n):
|
def _set_links_underwater_fraction(n, offshore_shapes):
|
||||||
if n.links.empty: return
|
if n.links.empty: return
|
||||||
|
|
||||||
if not hasattr(n.links, 'geometry'):
|
if not hasattr(n.links, 'geometry'):
|
||||||
n.links['underwater_fraction'] = 0.
|
n.links['underwater_fraction'] = 0.
|
||||||
else:
|
else:
|
||||||
offshore_shape = gpd.read_file(snakemake.input.offshore_shapes).unary_union
|
offshore_shape = gpd.read_file(offshore_shapes).unary_union
|
||||||
links = gpd.GeoSeries(n.links.geometry.dropna().map(shapely.wkt.loads))
|
links = gpd.GeoSeries(n.links.geometry.dropna().map(shapely.wkt.loads))
|
||||||
n.links['underwater_fraction'] = links.intersection(offshore_shape).length / links.length
|
n.links['underwater_fraction'] = links.intersection(offshore_shape).length / links.length
|
||||||
|
|
||||||
|
|
||||||
def _adjust_capacities_of_under_construction_branches(n):
|
def _adjust_capacities_of_under_construction_branches(n, config):
|
||||||
lines_mode = snakemake.config['lines'].get('under_construction', 'undef')
|
lines_mode = config['lines'].get('under_construction', 'undef')
|
||||||
if lines_mode == 'zero':
|
if lines_mode == 'zero':
|
||||||
n.lines.loc[n.lines.under_construction, 'num_parallel'] = 0.
|
n.lines.loc[n.lines.under_construction, 'num_parallel'] = 0.
|
||||||
n.lines.loc[n.lines.under_construction, 's_nom'] = 0.
|
n.lines.loc[n.lines.under_construction, 's_nom'] = 0.
|
||||||
@ -519,7 +519,7 @@ def _adjust_capacities_of_under_construction_branches(n):
|
|||||||
elif lines_mode != 'keep':
|
elif lines_mode != 'keep':
|
||||||
logger.warning("Unrecognized configuration for `lines: under_construction` = `{}`. Keeping under construction lines.")
|
logger.warning("Unrecognized configuration for `lines: under_construction` = `{}`. Keeping under construction lines.")
|
||||||
|
|
||||||
links_mode = snakemake.config['links'].get('under_construction', 'undef')
|
links_mode = config['links'].get('under_construction', 'undef')
|
||||||
if links_mode == 'zero':
|
if links_mode == 'zero':
|
||||||
n.links.loc[n.links.under_construction, "p_nom"] = 0.
|
n.links.loc[n.links.under_construction, "p_nom"] = 0.
|
||||||
elif links_mode == 'remove':
|
elif links_mode == 'remove':
|
||||||
@ -534,27 +534,30 @@ def _adjust_capacities_of_under_construction_branches(n):
|
|||||||
return n
|
return n
|
||||||
|
|
||||||
|
|
||||||
def base_network():
|
def base_network(eg_buses, eg_converters, eg_transformers, eg_lines, eg_links,
|
||||||
buses = _load_buses_from_eg()
|
links_p_nom, links_tyndp, europe_shape, country_shapes, offshore_shapes,
|
||||||
|
parameter_corrections, config):
|
||||||
|
|
||||||
links = _load_links_from_eg(buses)
|
buses = _load_buses_from_eg(eg_buses, europe_shape, config['electricity'])
|
||||||
if snakemake.config['links'].get('include_tyndp'):
|
|
||||||
buses, links = _add_links_from_tyndp(buses, links)
|
|
||||||
|
|
||||||
converters = _load_converters_from_eg(buses)
|
links = _load_links_from_eg(buses, eg_links)
|
||||||
|
if config['links'].get('include_tyndp'):
|
||||||
|
buses, links = _add_links_from_tyndp(buses, links, links_tyndp, europe_shape)
|
||||||
|
|
||||||
lines = _load_lines_from_eg(buses)
|
converters = _load_converters_from_eg(buses, eg_converters)
|
||||||
transformers = _load_transformers_from_eg(buses)
|
|
||||||
|
|
||||||
lines = _set_electrical_parameters_lines(lines)
|
lines = _load_lines_from_eg(buses, eg_lines)
|
||||||
transformers = _set_electrical_parameters_transformers(transformers)
|
transformers = _load_transformers_from_eg(buses, eg_transformers)
|
||||||
links = _set_electrical_parameters_links(links)
|
|
||||||
converters = _set_electrical_parameters_converters(converters)
|
lines = _set_electrical_parameters_lines(lines, config)
|
||||||
|
transformers = _set_electrical_parameters_transformers(transformers, config)
|
||||||
|
links = _set_electrical_parameters_links(links, config, links_p_nom)
|
||||||
|
converters = _set_electrical_parameters_converters(converters, config)
|
||||||
|
|
||||||
n = pypsa.Network()
|
n = pypsa.Network()
|
||||||
n.name = 'PyPSA-Eur'
|
n.name = 'PyPSA-Eur'
|
||||||
|
|
||||||
n.set_snapshots(pd.date_range(freq='h', **snakemake.config['snapshots']))
|
n.set_snapshots(pd.date_range(freq='h', **config['snapshots']))
|
||||||
n.snapshot_weightings[:] *= 8760. / n.snapshot_weightings.sum()
|
n.snapshot_weightings[:] *= 8760. / n.snapshot_weightings.sum()
|
||||||
|
|
||||||
n.import_components_from_dataframe(buses, "Bus")
|
n.import_components_from_dataframe(buses, "Bus")
|
||||||
@ -565,17 +568,17 @@ def base_network():
|
|||||||
|
|
||||||
_set_lines_s_nom_from_linetypes(n)
|
_set_lines_s_nom_from_linetypes(n)
|
||||||
|
|
||||||
_apply_parameter_corrections(n)
|
_apply_parameter_corrections(n, parameter_corrections)
|
||||||
|
|
||||||
n = _remove_unconnected_components(n)
|
n = _remove_unconnected_components(n)
|
||||||
|
|
||||||
_set_countries_and_substations(n)
|
_set_countries_and_substations(n, config, country_shapes, offshore_shapes)
|
||||||
|
|
||||||
_set_links_underwater_fraction(n)
|
_set_links_underwater_fraction(n, offshore_shapes)
|
||||||
|
|
||||||
_replace_b2b_converter_at_country_border_by_link(n)
|
_replace_b2b_converter_at_country_border_by_link(n)
|
||||||
|
|
||||||
n = _adjust_capacities_of_under_construction_branches(n)
|
n = _adjust_capacities_of_under_construction_branches(n, config)
|
||||||
|
|
||||||
return n
|
return n
|
||||||
|
|
||||||
@ -585,6 +588,11 @@ if __name__ == "__main__":
|
|||||||
snakemake = mock_snakemake('base_network')
|
snakemake = mock_snakemake('base_network')
|
||||||
configure_logging(snakemake)
|
configure_logging(snakemake)
|
||||||
|
|
||||||
n = base_network()
|
paths = snakemake.input
|
||||||
|
config = snakemake.config
|
||||||
|
|
||||||
|
n = base_network(paths.eg_buses, paths.eg_converters, paths.eg_transformers, paths.eg_lines, paths.eg_links,
|
||||||
|
paths.links_p_nom, paths.links_tyndp, paths.europe_shape, paths.country_shapes, paths.offshore_shapes,
|
||||||
|
paths.parameter_corrections, config)
|
||||||
|
|
||||||
n.export_to_netcdf(snakemake.output[0])
|
n.export_to_netcdf(snakemake.output[0])
|
||||||
|
Loading…
Reference in New Issue
Block a user