Skip to content

Commit 767ba32

Browse files
authored
Convert timeslice levels to snake_case (#771)
* Convert timeslice levels to lowercase * Fix hook priority
1 parent 4df139d commit 767ba32

3 files changed

Lines changed: 34 additions & 24 deletions

File tree

src/muse/readers/csv.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
import pandas as pd
5555
import xarray as xr
5656

57+
from muse.utilities import camel_to_snake
58+
5759
# Global mapping of column names to their standardized versions
5860
# This is for backwards compatibility with old file formats
5961
COLUMN_RENAMES = {
@@ -74,6 +76,8 @@
7476
"objsort1": "obj_sort1",
7577
"objsort2": "obj_sort2",
7678
"objsort3": "obj_sort3",
79+
"time_slice": "timeslice",
80+
"price": "prices",
7781
}
7882

7983
# Columns who's values should be converted from camelCase to snake_case
@@ -226,19 +230,6 @@ def get_nan_coordinates(dataset: xr.Dataset) -> list[tuple]:
226230
return []
227231

228232

229-
def camel_to_snake(name: str) -> str:
230-
"""Transforms CamelCase to snake_case."""
231-
from re import sub
232-
233-
pattern = sub("(.)([A-Z][a-z]+)", r"\1_\2", name)
234-
result = sub("([a-z0-9])([A-Z])", r"\1_\2", pattern).lower()
235-
result = result.replace("co2", "CO2")
236-
result = result.replace("ch4", "CH4")
237-
result = result.replace("n2_o", "N2O")
238-
result = result.replace("f-gases", "F-gases")
239-
return result
240-
241-
242233
def convert_column_types(data: pd.DataFrame) -> pd.DataFrame:
243234
"""Converts DataFrame columns to their expected types.
244235

src/muse/readers/toml.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,23 @@ def decorated(f: SETTINGS_HOOKS_SIGNATURE) -> SETTINGS_HOOKS_SIGNATURE:
342342
return decorated(func)
343343

344344

345+
@register_settings_hook(priority=0)
346+
def standardise_case(settings: dict) -> None:
347+
"""Standardise certain fields to snake_case."""
348+
from muse.utilities import camel_to_snake
349+
350+
fields_to_standardise = ["excluded_commodities", "regions"]
351+
for field in fields_to_standardise:
352+
if field in settings:
353+
settings[field] = [camel_to_snake(x) for x in settings[field]]
354+
355+
# Handle timeslice level_names if present
356+
if "level_names" in settings["timeslices"]:
357+
settings["timeslices"]["level_names"] = [
358+
camel_to_snake(x) for x in settings["timeslices"]["level_names"]
359+
]
360+
361+
345362
@register_settings_hook(priority=1)
346363
def check_sectors(settings: dict) -> None:
347364
"""Check that there is at least 1 sector."""
@@ -371,17 +388,6 @@ def setup_time_framework(settings: dict) -> None:
371388
settings["time_framework"] = np.array(sorted(settings["time_framework"]), dtype=int)
372389

373390

374-
@register_settings_hook(priority=1)
375-
def standardise_case(settings: dict) -> None:
376-
"""Standardise certain fields to snake_case."""
377-
from muse.readers.csv import camel_to_snake
378-
379-
fields_to_standardise = ["excluded_commodities", "regions"]
380-
for field in fields_to_standardise:
381-
if field in settings:
382-
settings[field] = [camel_to_snake(x) for x in settings[field]]
383-
384-
385391
@register_settings_hook
386392
def check_log_level(settings: dict) -> None:
387393
"""Check the log level required in the simulation."""

src/muse/utilities.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,3 +675,16 @@ def interpolate_technodata(
675675
years = sorted(set(time_framework).union(data.year.values.tolist()))
676676
data = data.interp(year=years, method=interpolation_mode)
677677
return data
678+
679+
680+
def camel_to_snake(name: str) -> str:
681+
"""Transforms CamelCase to snake_case."""
682+
from re import sub
683+
684+
pattern = sub("(.)([A-Z][a-z]+)", r"\1_\2", name)
685+
result = sub("([a-z0-9])([A-Z])", r"\1_\2", pattern).lower()
686+
result = result.replace("co2", "CO2")
687+
result = result.replace("ch4", "CH4")
688+
result = result.replace("n2_o", "N2O")
689+
result = result.replace("f-gases", "F-gases")
690+
return result

0 commit comments

Comments
 (0)