Source code for progressbar.algorithms

from __future__ import annotations

import abc
from datetime import timedelta


[docs] class SmoothingAlgorithm(abc.ABC): @abc.abstractmethod def __init__(self, **kwargs): raise NotImplementedError
[docs] @abc.abstractmethod def update(self, new_value: float, elapsed: timedelta) -> float: '''Updates the algorithm with a new value and returns the smoothed value. ''' raise NotImplementedError
[docs] class ExponentialMovingAverage(SmoothingAlgorithm): ''' The Exponential Moving Average (EMA) is an exponentially weighted moving average that reduces the lag that's typically associated with a simple moving average. It's more responsive to recent changes in data. ''' def __init__(self, alpha: float = 0.5) -> None: self.alpha = alpha self.value = 0
[docs] def update(self, new_value: float, elapsed: timedelta) -> float: self.value = self.alpha * new_value + (1 - self.alpha) * self.value return self.value
[docs] class DoubleExponentialMovingAverage(SmoothingAlgorithm): ''' The Double Exponential Moving Average (DEMA) is essentially an EMA of an EMA, which reduces the lag that's typically associated with a simple EMA. It's more responsive to recent changes in data. ''' def __init__(self, alpha: float = 0.5) -> None: self.alpha = alpha self.ema1 = 0 self.ema2 = 0
[docs] def update(self, new_value: float, elapsed: timedelta) -> float: self.ema1 = self.alpha * new_value + (1 - self.alpha) * self.ema1 self.ema2 = self.alpha * self.ema1 + (1 - self.alpha) * self.ema2 return 2 * self.ema1 - self.ema2