import datetime as dt from airflow.utils.log.logging_mixin import LoggingMixin import pandas as pd __all__ = ["Interpolator"] class Interpolator(LoggingMixin): @staticmethod def interpolate_series( start_date: dt.datetime, end_date: dt.datetime, dates: list[dt.datetime], values: list[int], historical_date: dt.datetime | None = None, historical_value: int | None = None, ) -> list[int]: series = pd.Series(data=values, index=pd.DatetimeIndex(dates)) if dates[0] > start_date and historical_date is not None and historical_value is not None: # if there is something to fill at tail, and we have historical value interpolation_start_date = historical_date historical_series = pd.Series(data=(historical_value,), index=pd.DatetimeIndex((historical_date,))) series = pd.concat((historical_series, series)) else: interpolation_start_date = dates[0] series = series.reindex(pd.date_range(interpolation_start_date, end_date, freq="D")) # fill head with last known value series = series.interpolate(method="ffill", limit_area="outside") # interpolate everything else series = series.interpolate(method="time", limit_area="inside") # take only integer part series = series.astype("ulonglong") # Take only dates in the range # https://github.com/python/mypy/issues/2410 series = series[start_date:] # type: ignore return series.tolist()