Source code for energy_analysis_toolbox.timeseries.profiles.localization
"""Define Mixins to manage localized timeseries."""
import pandas as pd
from .mean_profile import MeanProfile
from .rolling_profile import (
RollingProfile,
RollingQuantileProfile,
)
[docs]
class LocalizedProfileMixin:
"""A profile version where time-zoned data is managed, including DSTs.
The compute method of the profile class with which this mixin is combined
is overloaded in such a way that passing time-localized data is possible.
On and across DSTs, the data remains aligned "on the clock" (VS on the sun).
"""
[docs]
def compute(
self,
history: pd.DataFrame,
time: pd.Timestamp,
**kwargs,
) -> pd.DataFrame:
"""Compute the profile at ``time`` from the ``history``.
The computation is managed as follows :
- just fall back to the parent `compute` method in case the data is time-naive.
- Else, unlocalize the history and target date before passing them to the
parent class' `compute` such that the data remains aligned based on "local
time" for each day.
- Relocalize the resulting profile to the history timezone. This part takes
care of DST days :
* In case the target date is summer DST (23h long day) the extra profile
hours is just dumped.
* In case the target date is winter DST(25h long day), the data for the 2am
to 3am period is associated with the first occurrence of this time-of-day
and a gap is let on the second.
.. warning::
If winter DST is included in the history, the timestamps from 2am to
3am on this day appears "twice" in the time-naive history passed to the
aggregation. Therefore, the aggregation should be robust to this situation.
.. seealso::
:py:meth:`.MeanProfile.compute`
"""
source_tz = history.index.tz
if source_tz is None:
profile_ref = super().compute(history, time, **kwargs)
else:
profile_ref = (
super()
.compute(history.tz_localize(None), time.tz_localize(None), **kwargs)
.tz_localize(source_tz, ambiguous=True, nonexistent="NaT")
)
return profile_ref
[docs]
class LocalizedMeanProfile(
LocalizedProfileMixin,
MeanProfile,
):
"""Compute the mean profile with timezone data.
see :py:class:`.MeanProfile`
"""
[docs]
class LocalizedRollingProfile(
LocalizedProfileMixin,
RollingProfile,
):
"""Compute a rolling profile with timezone data.
see :py:class:`.RollingProfile`
"""
[docs]
class LocalizedRollingQuantileProfile(
LocalizedProfileMixin,
RollingQuantileProfile,
):
"""Compute a rolling quantile with timezone data.
see :py:class:`.RollingQuantProfile`
"""