Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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