def one_side_moving_average(signal: np.array, window_size: int = 5) -> np.array: """ Сaclulate moving average of signal without zeros, replaces zero values with the moving average Args: signal: (np.array) 1D signal window size: (int) takes 2*window_size points for moving average; 5 by default (10 points) Output: (np.array) filtered signal """ n = window_size #calculate baseline without zeros signal_mean = signal[signal != 0].mean() #create masked array for zero values signal = np.ma.masked_array(signal, signal == 0) #calculted moving average with window size = n ave = np.cumsum(signal.filled(0)) ave[n:] = ave[n:] - ave[:-n] counts = np.cumsum(~signal.mask) counts[n:] = counts[n:] - counts[:-n] ave[~signal.mask] /= counts[~signal.mask] ave[signal. mask] = signal_mean # replces nan with baseline mean taken without nan return ave
def moving_average(signal: np.array, window_size: int = 5) -> np.array: """ Сaclulate moving average for signal with zeros, replaces zero values with the moving average Args: signal: (np.array) 1D signal window size: (int) takes 2*window_size points for moving average; 5 by default (10 points) Output: (np.array) corrected by moving mean signal """ n = window_size #calculate baseline without zeros signal_mean = signal[signal != 0].mean() #create masked array for nan values signal = np.ma.masked_array(signal, signal == 0) #calculted moving average with window size = n ave = np.cumsum(signal.filled(0)) ave[n:] = ave[n:] - ave[:-n] counts = np.cumsum(~signal.mask) counts[n:] = counts[n:] - counts[:-n] ave[~signal.mask] /= counts[~signal.mask] ave[signal. mask] = signal_mean # replces nan with baseline mean taken without nan signal = np.flip( ave, 0) #reverces signal to make a symmetrical moving averaging #calculate baseline without zeros signal_mean = signal[signal != 0].mean() signal = np.ma.masked_array(signal, signal == 0) #calculted moving average with window size = n ave = np.cumsum(signal.filled(0)) ave[n:] = ave[n:] - ave[:-n] counts = np.cumsum(~signal.mask) counts[n:] = counts[n:] - counts[:-n] ave[~signal.mask] /= counts[~signal.mask] ave[signal. mask] = signal_mean # replaces zeros with baseline mean taken without nan #reverse back ave = np.flip(ave, 0) #reverces signal back np.nan_to_num(ave) return ave