Skip to content
Snippets Groups Projects
Commit bde88734 authored by Arin Wongprommoon's avatar Arin Wongprommoon
Browse files

refactor(core): Simplify detrend process

WHY IS THIS CHANGE NEEDED:
- logical steps of computation unclear, therefore unclear if
  result of computation is what we want

HOW DOES THE CHANGE SOLVE THE PROBLEM:
- replace moving_average() and lines 74-76 with pandas.DataFrame
  methods -- simplifies code; standardised routines
- rename variables so they are more informative

EVIDENCE THAT COMMIT WORKS:
- generate random DataFrame, original & new implementation produce
  same outputs

REFERENCES:
- Issue #21
parent a15a8bbf
No related branches found
No related tags found
No related merge requests found
...@@ -5,25 +5,6 @@ from agora.abc import ParametersABC ...@@ -5,25 +5,6 @@ from agora.abc import ParametersABC
from postprocessor.core.abc import PostProcessABC from postprocessor.core.abc import PostProcessABC
def moving_average(input_timeseries, window):
"""Compute moving average of time series
Compute moving average of time series
Parameters
----------
input_timeseries : array_like
Input time series.
window : int
Size of sliding window to compute the moving average over.
"""
processed_timeseries = np.cumsum(input_timeseries, dtype=float)
processed_timeseries[window:] = (
processed_timeseries[window:] - processed_timeseries[:-window]
)
return processed_timeseries[window - 1 :] / window
class detrendParameters(ParametersABC): class detrendParameters(ParametersABC):
"""Parameters for the 'detrend' process. """Parameters for the 'detrend' process.
...@@ -67,12 +48,12 @@ class detrend(PostProcessABC): ...@@ -67,12 +48,12 @@ class detrend(PostProcessABC):
Detrended time series. Detrended time series.
""" """
signal = signal.div(signal.mean(axis=1), axis=0) # Normalise time series: divide by the mean time series
signal_movavg = signal.apply( signal_norm = signal.div(signal.mean(axis=1), axis=0)
lambda x: pd.Series(moving_average(x.values, self.window)), axis=1 # Compute moving average
) signal_movavg = signal_norm.rolling(
signal_norm = ( window=self.window, center=True, axis=1
signal.iloc(axis=1)[self.window // 2 : -self.window // 2] ).mean()
/ signal_movavg.iloc[:, 0 : signal_movavg.shape[1] - 1].values # Detrend: divide processed
) signal_detrend = signal_norm.div(signal_movavg)
return signal_norm return signal_detrend.dropna(axis=1) # Remove columns with NaNs
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment