From 21519fd0dd2eeda6e6a0990afb45fed44993f30c Mon Sep 17 00:00:00 2001 From: Felipe Vianna Date: Fri, 12 Feb 2021 15:48:32 +0100 Subject: [PATCH] - fixing exponential moving average - adding MaxPooling and AveragePooling transformations --- pyFTS/common/transformations/smoothing.py | 57 +++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/pyFTS/common/transformations/smoothing.py b/pyFTS/common/transformations/smoothing.py index 1f6a052..821ea82 100644 --- a/pyFTS/common/transformations/smoothing.py +++ b/pyFTS/common/transformations/smoothing.py @@ -1,10 +1,11 @@ from pyFTS.common.transformations.transformation import Transformation import numpy as np +from math import ceil class MovingAverage(Transformation): def __init__(self, **kwargs): - super(MovingAverage, self).__init__() + super(MovingAverage, self).__init__(**kwargs) self.name = 'Moving Average Smoothing' self.steps = kwargs.get('steps',2) @@ -20,8 +21,8 @@ class MovingAverage(Transformation): class ExponentialSmoothing(Transformation): def __init__(self, **kwargs): - super(MovingAverage, self).__init__() - self.name = 'Moving Average Smoothing' + super(ExponentialSmoothing,self).__init__(**kwargs) + self.name = 'Exponential Moving Average Smoothing' self.steps = kwargs.get('steps',2) self.beta = kwargs.get('beta',.5) @@ -39,3 +40,53 @@ class ExponentialSmoothing(Transformation): def inverse(self, data, param=None, **kwargs): return data + + +class AveragePooling(Transformation): + def __init__(self, **kwargs): + super(AveragePooling,self).__init__(**kwargs) + self.name = 'Exponential Average Smoothing' + self.kernel = kwargs.get('kernel',5) + self.stride = kwargs.get('stride',1) + self.padding = kwargs.get('padding','same') + + def apply(self, data): + result = [] + if self.padding == 'same': + for i in range(int(self.kernel/2), len(data)+int(self.kernel/2), self.stride): + result.append(np.mean(data[np.max([0,i-self.kernel]):np.min([i, len(data)])])) + + elif self.padding == 'valid': + for i in range(self.kernel, len(data), self.stride): + result.append(np.mean(data[i-self.kernel:i])) + else: + raise ValueError('Invalid padding schema') + return result + + def inverse(self, data, param=None, **kwargs): + return data + + +class MaxPooling(Transformation): + def __init__(self, **kwargs): + super(MaxPooling,self).__init__(**kwargs) + self.name = 'Exponential Average Smoothing' + self.kernel = kwargs.get('kernel',5) + self.stride = kwargs.get('stride',1) + self.padding = kwargs.get('padding','same') + + def apply(self, data): + result = [] + if self.padding == 'same': + for i in range(int(self.kernel/2), len(data)+int(self.kernel/2), self.stride): + result.append(np.max(data[np.max([0,i-self.kernel]):np.min([i, len(data)])])) + + elif self.padding == 'valid': + for i in range(self.kernel - 1, len(data), self.stride): + result.append(np.max(data[i-self.kernel:i])) + else: + raise ValueError('Invalid padding schema') + return result + + def inverse(self, data, param=None, **kwargs): + return data \ No newline at end of file