diff --git a/src/supy/data_model/core.py b/src/supy/data_model/core.py index f1ede376..1ca5b84a 100644 --- a/src/supy/data_model/core.py +++ b/src/supy/data_model/core.py @@ -37,6 +37,20 @@ class SUEWSConfig(BaseModel): class Config: extra = "allow" + @classmethod + def from_yaml(cls, path: str) -> "SUEWSConfig": + """Initialize SUEWSConfig from YAML file. + + Args: + path (str): Path to YAML configuration file + + Returns: + SUEWSConfig: Instance of SUEWSConfig initialized from YAML + """ + with open(path, "r") as file: + config = yaml.load(file, Loader=yaml.FullLoader) + return cls(**config) + def create_multi_index_columns(self, columns_file: str) -> pd.MultiIndex: """Create MultiIndex from df_state_columns.txt""" with open(columns_file, "r") as f: diff --git a/src/supy/data_model/human_activity.py b/src/supy/data_model/human_activity.py index 26e7ab34..b34c2dc3 100644 --- a/src/supy/data_model/human_activity.py +++ b/src/supy/data_model/human_activity.py @@ -3,7 +3,7 @@ import pandas as pd from .type import ValueWithDOI, Reference from .profile import HourlyProfile, WeeklyProfile, DayProfile -from .state import init_df_state +from .type import init_df_state class IrrigationParams( @@ -481,7 +481,7 @@ def from_df_state(cls, df: pd.DataFrame, grid_id: int) -> "AnthropogenicEmission # Reconstruct CO2 parameters co2 = CO2Params.from_df_state(df, grid_id) - return cls(startdls=startdls, enddls=enddls, heat=heat, co2=co2) + return cls(startdls=startdls, enddls=enddls, heat=heat.model_dump(), co2=co2.model_dump()) class AnthropogenicHeat( BaseModel diff --git a/src/supy/data_model/hydro.py b/src/supy/data_model/hydro.py index a15df019..d52a8d54 100644 --- a/src/supy/data_model/hydro.py +++ b/src/supy/data_model/hydro.py @@ -1,8 +1,7 @@ from pydantic import BaseModel, Field, PrivateAttr from typing import Optional import pandas as pd -from .type import ValueWithDOI, Reference -from .site import SurfaceType +from .type import ValueWithDOI, Reference, SurfaceType import math diff --git a/src/supy/data_model/model.py b/src/supy/data_model/model.py index ac255291..43ddb4b9 100644 --- a/src/supy/data_model/model.py +++ b/src/supy/data_model/model.py @@ -7,7 +7,7 @@ from enum import Enum from .type import ValueWithDOI, Reference -from .state import init_df_state +from .type import init_df_state class EmissionsMethod(Enum): diff --git a/src/supy/data_model/state.py b/src/supy/data_model/state.py index 4f468d81..3bc72244 100644 --- a/src/supy/data_model/state.py +++ b/src/supy/data_model/state.py @@ -1,9 +1,8 @@ -from dataclasses import Field from typing import Optional, Union, List, Literal, Type import pandas as pd -from pydantic import BaseModel, field_validator, model_validator, PrivateAttr +from pydantic import BaseModel, Field, field_validator, model_validator, PrivateAttr -from .type import ValueWithDOI, Reference +from .type import ValueWithDOI, Reference, init_df_state from .site import SurfaceType diff --git a/src/supy/meson.build b/src/supy/meson.build index 33be0426..c3a45147 100644 --- a/src/supy/meson.build +++ b/src/supy/meson.build @@ -69,8 +69,10 @@ py.install_sources( [ 'data_model/__init__.py', 'data_model/core.py', + 'data_model/hydro.py', 'data_model/human_activity.py', 'data_model/model.py', + 'data_model/ohm.py', 'data_model/profile.py', 'data_model/site.py', 'data_model/state.py', diff --git a/src/supy/util/_config.py b/src/supy/util/_config.py index 1179df98..2d0cec3b 100644 --- a/src/supy/util/_config.py +++ b/src/supy/util/_config.py @@ -5138,3 +5138,9 @@ def to_yaml(self, path: str = "./config-suews.yml"): sort_keys=False, allow_unicode=True, ) + +def init_config_from_yaml(path: str = "./config-suews.yml") -> SUEWSConfig: + """Initialize SUEWSConfig from YAML file""" + with open(path, "r") as file: + config = yaml.load(file, Loader=yaml.FullLoader) + return SUEWSConfig(**config) \ No newline at end of file