Skip to content
2 changes: 2 additions & 0 deletions doc/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

* Correct the nuclear fuel price (`nuclear`, `uranium`) using Lazard's LCOE+ assumption (<https://github.com/PyPSA/technology-data/pull/291>)

* 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**
Expand Down
40 changes: 28 additions & 12 deletions scripts/compile_cost_assumptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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
Expand All @@ -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(),
Expand All @@ -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
Expand All @@ -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(),
Expand All @@ -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
Expand All @@ -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(),
Expand Down Expand Up @@ -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(
{
Expand Down
Loading