Source code for ebm.model.filter_scurve_params

import typing

import pandas as pd

from .building_category import BuildingCategory
from .building_condition import BuildingCondition
from .data_classes import ScurveParameters


[docs] class FilterScurveParams(): """ A utility class for filtering S-curve parameters based on building category and condition. This class provides a static method to filter a DataFrame containing S-curve parameters, extracting the relevant data for a specific building category and set of conditions. """ COL_BUILDING_CATEGORY = 'building_category' COL_BUILDING_CONDITION = 'condition' COL_EARLIEST_AGE = 'earliest_age_for_measure' COL_AVERAGE_AGE = 'average_age_for_measure' COL_LAST_AGE = 'last_age_for_measure' COL_RUSH_YEARS = 'rush_period_years' COL_RUSH_SHARE = 'rush_share' COL_NEVER_SHARE = 'never_share'
[docs] @staticmethod def filter(building_category: BuildingCategory, scurve_condition_list: typing.List[str], scurve_params: pd.DataFrame) -> typing.Dict[str, ScurveParameters]: """ Filters S-curve parameters by building category and condition. This method filters a DataFrame containing S-curve parameters to extract data specific to the provided building category and conditions listed in `scurve_condition_list`. The filtered data is then converted into a dictionary of `ScurveParameters` dataclass instances, each representing the S-curve parameters for a particular condition. Parameters: - building_category (BuildingCategory): The building category for which the S-curve parameters are being filtered. - scurve_condition_list (List[str]): A list of conditions (as strings) for which the S-curve parameters are needed. - scurve_params (pd.DataFrame): DataFrame containing the S-curve parameters, with columns for building category, condition, and various age-related metrics. Returns: - filtered_scurve_params (Dict[str, ScurveParameters]): A dictionary where the keys are conditions (str) and the values are `ScurveParameters` dataclass instances containing the corresponding S-curve parameters for each condition. Raises: - KeyError: If the provided building category is not found in the S-curve parameters DataFrame. """ filtered_scurve_params = {} for condition in scurve_condition_list: if not scurve_params.building_category.str.contains(building_category).any(): msg = 'Unknown building_category "{}" encountered when setting up scurve parameters'.format(building_category) raise KeyError(msg) # Filter dataframe on building category and condition scurve_params_filtered = scurve_params[(scurve_params[FilterScurveParams.COL_BUILDING_CATEGORY] == building_category) & (scurve_params[FilterScurveParams.COL_BUILDING_CONDITION] == condition)] # Assuming there is only one row in the filtered DataFrame scurve_params_row = scurve_params_filtered.iloc[0] # Convert the single row to a dictionary scurve_params_dict = scurve_params_row.to_dict() # Map the dictionary values to the dataclass attributes scurve_parameters = ScurveParameters( building_category=scurve_params_dict[FilterScurveParams.COL_BUILDING_CATEGORY], condition=scurve_params_dict[FilterScurveParams.COL_BUILDING_CONDITION], earliest_age=scurve_params_dict[FilterScurveParams.COL_EARLIEST_AGE], average_age=scurve_params_dict[FilterScurveParams.COL_AVERAGE_AGE], rush_years=scurve_params_dict[FilterScurveParams.COL_RUSH_YEARS], last_age=scurve_params_dict[FilterScurveParams.COL_LAST_AGE], rush_share=scurve_params_dict[FilterScurveParams.COL_RUSH_SHARE], never_share=scurve_params_dict[FilterScurveParams.COL_NEVER_SHARE], ) filtered_scurve_params[condition] = scurve_parameters return filtered_scurve_params