Source code for energy_analysis_toolbox.timeseries.profiles.mean_profile

"""Defines a base class to compute average load profiles from history."""

import pandas as pd


[docs] class MeanProfile: """A class which computes a simple mean profile.""" def __init__( self, period: str = "D", *, is_max: bool = True, window: int = 1, ) -> None: """Initialize a MeanProfile instance. Parameters ---------- period : str, optional A pandas period string which specifies the kind of period on which the profile is realized. is_max : bool, optional The type of threshold defined by this profile. If True, defines a threshold which defines a maximum value which should not be crossed, while False defines a minimum value. window : int, optional Width (# of slots) of the rolling max window used to transform the history used to deduce the mean profile (but not the std). Default is 1 slots (meaning no transformation). """ self.period = period self.is_max = is_max self.window = window
[docs] def group( self, history: pd.Series | pd.DataFrame, ) -> pd.core.groupby.GroupBy: """Group history data by chunks of ``self.period``. Parameters ---------- history : pd.Series or pd.DataFrame Returns ------- pd.core.groupby.GroupBy """ return history.groupby(history.index - history.index.floor(self.period))
[docs] def compute( self, history: pd.Series, time: pd.Timestamp, ) -> pd.Series: """Return an averaged profile. Parameters ---------- history : pd.Series Consumption history used to computed the reference profile. The history should be sampled homogeneously during the aggregated periods. time : pd.Timestamp The time at which the profile is of interest. Only the information about the date floored to ``self.period`` is used in the passed timestamp. Returns ------- profile : pd.Series Profile threshold with same resolution as the history data. Notes ----- The profile threshold is obtained as the mean profile obtained from history. """ if self.window == 1: pass elif self.is_max: history = history.rolling(self.window, center=True).max() else: history = history.rolling(self.window, center=True).min() mean_profile_compare = self.group(history).mean(numeric_only=True) mean_profile_compare.index += time return mean_profile_compare