From af9f38a4d6997683cabc08b6cd55e671f5036054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Al=C3=A1n=20Mu=C3=B1oz?= <alan.munoz@ed.ac.uk> Date: Tue, 27 Sep 2022 13:25:53 +0100 Subject: [PATCH] refactor(dsignal): speedup using bottleneck --- src/postprocessor/core/processes/dsignal.py | 24 +++++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/postprocessor/core/processes/dsignal.py b/src/postprocessor/core/processes/dsignal.py index 26575b59..12631958 100644 --- a/src/postprocessor/core/processes/dsignal.py +++ b/src/postprocessor/core/processes/dsignal.py @@ -1,6 +1,8 @@ +import bottleneck as bn +import numpy as np import pandas as pd -from agora.abc import ParametersABC +from agora.abc import ParametersABC from postprocessor.core.abc import PostProcessABC @@ -9,20 +11,28 @@ class dsignalParameters(ParametersABC): :window: Number of timepoints to consider for signal. """ - _defaults = {"window": 3} + _defaults = {"window": 10, "min_count": 5} class dsignal(PostProcessABC): """ - Calculate the change in a signal depending on a window + Calculate the change in a signal using the mean of a moving window. """ def __init__(self, parameters: dsignalParameters): super().__init__(parameters) def run(self, signal: pd.DataFrame): - return ( - signal.rolling(window=self.parameters.window, axis=1) - .mean() - .diff(axis=1) + matrix = np.diff( + bn.move_mean( + signal, + window=self.parameters.window, + min_count=self.parameters.min_count, + axis=1, + ), + axis=1, ) + + # Pad values to keep the same signal shape + matrix = np.pad(matrix, ((0, 0), (0, 1)), constant_values=np.nan) + return pd.DataFrame(matrix, index=signal.index, columns=signal.columns) -- GitLab