diff --git a/doc/release_notes.md b/doc/release_notes.md index 4bc5f293..428871fb 100644 --- a/doc/release_notes.md +++ b/doc/release_notes.md @@ -26,6 +26,8 @@ * Correct the nuclear fuel price (`nuclear`, `uranium`) using Lazard's LCOE+ assumption () +* Fixed bug preventing add_energy_storage_database to run through (https://github.com/PyPSA/technology-data/pull/286). + ## [v0.15.0](https://github.com/PyPSA/technology-data/releases/tag/v0.15.0) (9th June 2026) **Breaking changes** diff --git a/scripts/compile_cost_assumptions.py b/scripts/compile_cost_assumptions.py index 6cf0d95c..a2faa7f9 100644 --- a/scripts/compile_cost_assumptions.py +++ b/scripts/compile_cost_assumptions.py @@ -3809,19 +3809,29 @@ def add_energy_storage_database( engine="calamine", ) df = df.drop(columns=["ref_size_MW", "EP_ratio_h"]) - df = df.fillna(df.dtypes.replace({"float64": 0.0, "O": "NULL"})) + # Fill by column kind, not dtype name: text columns are "object" in pandas 2 but "str" in pandas 3 + df = df.fillna({col: 0.0 for col in df.select_dtypes("number").columns}).fillna( + "NULL" + ) df.loc[:, "unit"] = df.unit.str.replace("NULL", "per unit") + df.loc[(df["parameter"] == "efficiency") & (df["unit"].isna()), "unit"] = "per unit" # b) Change data to PyPSA format (aggregation of components, units, currency, etc.) df = clean_up_units(df, "value") # base clean up # rewrite technology to be charger, store, discharger, bidirectional-charger df.loc[:, "carrier"] = df.carrier.str.replace("NULL", "") - df.loc[:, "carrier"] = df["carrier"].apply(lambda x: x.split("-")) - carrier_list_len = df["carrier"].apply(lambda x: len(x)) - carrier_str_len = df["carrier"].apply(lambda x: len(x[0])) - carrier_first_item = df["carrier"].apply(lambda x: x[0]) - carrier_last_item = df["carrier"].apply(lambda x: x[-1]) + df["carrier"] = ( + df["carrier"] + .fillna("") + .astype(str) + .str.strip() + .apply(lambda x: x.split("-") if x else []) + ) + carrier_list_len = df["carrier"].apply(len) + carrier_str_len = df["carrier"].apply(lambda x: len(x[0]) if len(x) > 0 else 0) + carrier_first_item = df["carrier"].apply(lambda x: x[0] if len(x) > 0 else "") + carrier_last_item = df["carrier"].apply(lambda x: x[-1] if len(x) > 0 else "") bicharger_filter = carrier_list_len == 3 charger_filter = (carrier_list_len == 2) & (carrier_first_item == "elec") discharger_filter = (carrier_list_len == 2) & (carrier_last_item == "elec") @@ -3942,7 +3952,8 @@ def add_energy_storage_database( or tech_name == "Pumped-Heat-store" ): x1 = pd.concat( - [x, pd.DataFrame(other_segments_points)], ignore_index=True + [x.reset_index(drop=True), pd.Series(other_segments_points)], + ignore_index=True, ) y1 = y factor = 5 @@ -3955,7 +3966,7 @@ def add_energy_storage_database( number_of_terms=i + 1, ) y1 = pd.concat( - [y1, pd.DataFrame([cost_at_year])], ignore_index=True + [y1, pd.Series([cost_at_year])], ignore_index=True ) f = interpolate.interp1d( x1.squeeze(), @@ -3965,7 +3976,8 @@ def add_energy_storage_database( ) elif tech_name == "Hydrogen-charger": x2 = pd.concat( - [x, pd.DataFrame(other_segments_points)], ignore_index=True + [x.reset_index(drop=True), pd.Series(other_segments_points)], + ignore_index=True, ) y2 = y factor = 6.5 @@ -3976,7 +3988,7 @@ def add_energy_storage_database( number_of_terms=i + 1, ) y2 = pd.concat( - [y2, pd.DataFrame([cost_at_year])], ignore_index=True + [y2, pd.Series([cost_at_year])], ignore_index=True ) f = interpolate.interp1d( x2.squeeze(), @@ -3986,7 +3998,8 @@ def add_energy_storage_database( ) else: x3 = pd.concat( - [x, pd.DataFrame(other_segments_points)], ignore_index=True + [x.reset_index(drop=True), pd.Series(other_segments_points)], + ignore_index=True, ) y3 = y factor = 2 @@ -3997,7 +4010,7 @@ def add_energy_storage_database( number_of_terms=i + 1, ) y3 = pd.concat( - [y3, pd.DataFrame([cost_at_year])], ignore_index=True + [y3, pd.Series([cost_at_year])], ignore_index=True ) f = interpolate.interp1d( x3.squeeze(), @@ -4043,7 +4056,10 @@ def add_energy_storage_database( df = pd.concat([df, df_new], ignore_index=True) # d) Combine metadata and add to cost database + df["source"] = df["source"].fillna("").astype(str) + df["reference"] = df["reference"].fillna("").astype(str) df.loc[:, "source"] = df["source"] + ", " + df["reference"] + df["note"] = df["note"].fillna("NULL").astype(str) for i in df.index: df.loc[i, "further description"] = str( {