Skip to content

Commit

Permalink
feat: extract substation from arbitrary pypsa networks (#674)
Browse files Browse the repository at this point in the history
  • Loading branch information
FabianHofmann authored and rouille committed Oct 27, 2022
1 parent e13701d commit 2f2a445
Showing 1 changed file with 32 additions and 22 deletions.
54 changes: 32 additions & 22 deletions powersimdata/input/converter/pypsa_to_grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,6 @@ def _read_network(self, n, add_pypsa_cols=True):
# Read in data from PyPSA
bus_pypsa = n.buses
sub_pypsa = pd.DataFrame()
bus2sub_pypsa = pd.DataFrame()
gencost_cols = ["start_up_cost", "shut_down_cost", "marginal_cost"]
gencost_pypsa = n.generators[gencost_cols]
plant_pypsa = n.generators.drop(gencost_cols, axis=1)
Expand Down Expand Up @@ -207,37 +206,48 @@ def _read_network(self, n, add_pypsa_cols=True):

# substations
# only relevant if the PyPSA network was originally created from PSD
sub_cols = ["name", "interconnect_sub_id", "lat", "lon", "interconnect"]
sub_pypsa_cols = [
"y",
"x",
]
if "is_substation" in bus:
sub_cols = ["name", "interconnect_sub_id", "lat", "lon", "interconnect"]
sub = bus[bus.is_substation][sub_cols]
sub.index = sub[sub.index.str.startswith("sub")].index.str[3:]
sub_pypsa_cols = [
"name",
"interconnect_sub_id",
"y",
"x",
"interconnect",
]
sub_pypsa = bus_pypsa[bus_pypsa.is_substation][sub_pypsa_cols]
sub_pypsa.index = sub_pypsa[
sub_pypsa.index.str.startswith("sub")
].index.str[3:]
sub_pypsa.index = sub.index

bus = bus[~bus.is_substation]
bus_pypsa = bus_pypsa[~bus_pypsa.is_substation]

bus2sub = bus[["substation", "interconnect"]].copy()
bus2sub["sub_id"] = pd.to_numeric(
bus2sub.pop("substation").str[3:], errors="ignore"
)
bus2sub_pypsa = bus_pypsa[["substation", "interconnect"]].copy()
bus2sub_pypsa["sub_id"] = pd.to_numeric(
bus2sub_pypsa.pop("substation").str[3:], errors="ignore"
bus2sub.pop("substation").str[3:], errors="coerce"
)
else:
warnings.warn("Substations could not be parsed.")
sub = pd.DataFrame()
bus2sub = pd.DataFrame()
# try to parse typical pypsa-eur(-sec) pattern for substations
sub_pattern = "[A-Z][A-Z]\d+\s\d+$"

sub = bus[bus.index.str.match(sub_pattern)].reindex(columns=sub_cols)
sub["interconnect"] = np.nan
sub["sub_id"] = sub.index
sub_pypsa = bus_pypsa[bus_pypsa.index.str.match(sub_pattern)][
sub_pypsa_cols
]

sub_pattern = "([A-Z][A-Z]\d+\s\d+).*"
bus2sub = pd.DataFrame(
{
"sub_id": bus.index.str.extract(sub_pattern)[0].values,
"interconnect": np.nan,
},
index=bus.index,
)

if sub.empty and bus2sub.empty:
warnings.warn("Substations could not be parsed.")
sub = pd.DataFrame()
bus2sub = pd.DataFrame()

# shunts
# append PyPSA's shunts information to PSD's buses data frame on columns
Expand Down Expand Up @@ -332,7 +342,7 @@ def _read_network(self, n, add_pypsa_cols=True):
values = [
(bus, bus_pypsa, grid_const.col_name_bus),
(sub, sub_pypsa, grid_const.col_name_sub),
(bus2sub, bus2sub_pypsa, grid_const.col_name_bus2sub),
(bus2sub, None, grid_const.col_name_bus2sub),
(plant, plant_pypsa, grid_const.col_name_plant),
(gencost, gencost_pypsa, grid_const.col_name_gencost),
(branch, branch_pypsa, grid_const.col_name_branch),
Expand Down Expand Up @@ -367,7 +377,7 @@ def _read_network(self, n, add_pypsa_cols=True):
df_psd = df_psd.reindex(const_location, axis="columns")

# Add renamed PyPSA columns
if add_pypsa_cols:
if add_pypsa_cols and df_pypsa is not None:
df_pypsa = df_pypsa.add_prefix("pypsa_")

df_psd = pd.concat([df_psd, df_pypsa], axis=1)
Expand Down

0 comments on commit 2f2a445

Please sign in to comment.