Skip to content
Snippets Groups Projects
Commit 8291b4e3 authored by pswain's avatar pswain
Browse files

change(butter_filter): interpolated NaNs

Better to interpolate NaNs than to drop them, which changes
spacing between time points.
parent cac829ed
No related branches found
No related tags found
No related merge requests found
import numpy as np
from scipy import signal
import pandas as pd
def butterworth_filter(timeseries, params=None):
def butterworth_filter(data, params=None):
"""Apply Butterworth filter to time series arranged in rows."""
# second-order-sections output
# by default, using a digital filter
......@@ -20,18 +21,18 @@ def butterworth_filter(timeseries, params=None):
fs=params["sampling_freq"],
output="sos",
)
# fill NaNs between data points
data = pd.DataFrame(data).interpolate(axis=1).to_numpy()
# subtract time series by mean
timeseries_norm = timeseries - np.nanmean(timeseries, axis=1).reshape(
timeseries.shape[0], 1
)
if np.any(np.isnan(timeseries_norm)):
data_norm = data - np.nanmean(data, axis=1).reshape(data.shape[0], 1)
if np.any(np.isnan(data_norm)):
# filter one at a time because of NaNs at different times
filtered_timeseries = np.nan * np.ones(timeseries_norm.shape)
for i in range(timeseries_norm.shape[0]):
data = timeseries_norm[i, :]
filtered = signal.sosfiltfilt(sos, data[~np.isnan(data)])
filtered_timeseries[i, ~np.isnan(data)] = filtered
filtered_timeseries = np.nan * np.ones(data_norm.shape)
for i in range(data_norm.shape[0]):
s_data = data_norm[i, :]
filtered = signal.sosfiltfilt(sos, s_data[~np.isnan(s_data)])
filtered_timeseries[i, ~np.isnan(s_data)] = filtered
else:
# filter all at once
filtered_timeseries = signal.sosfiltfilt(sos, timeseries_norm, axis=1)
filtered_timeseries = signal.sosfiltfilt(sos, data_norm, axis=1)
return filtered_timeseries
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