from typing import ClassVar
import numpy as np
import pandas as pd
from tpcp import Algorithm
__all__ = ["HeartRateAggregation"]
from typing_extensions import Self
from biopsykit.utils._types_internal import str_t
[docs]class HeartRateAggregation(Algorithm):
_action_methods = ("apply",)
AGG_TYPES: ClassVar[dict[str, object]] = {
"mean": np.nanmean,
"std": np.nanstd,
"se": lambda x: np.std(x) / np.sqrt(len(x)),
}
group_level: str_t
agg_type: str_t
output_: pd.DataFrame
def __init__(self, group_level: str_t, agg_type: str_t = "mean"):
self.group_level = group_level
self.agg_type = agg_type
[docs] def apply(self, data: pd.DataFrame) -> Self:
agg_type = [self.agg_type] if isinstance(self.agg_type, str) else self.agg_type
agg_dict = {at: self.AGG_TYPES[at] for at in agg_type}
out = data.groupby(self.group_level, sort=False).agg(tuple(agg_dict.items()))
for level in self.group_level:
out = out.reindex(data.index.get_level_values(level).unique(), level=level)
self.output_ = out
return self