Estou tentando calcular uma mediana móvel para cerca de 10.000 sinais, cada um com uma lista de comprimento em torno de 750.
Um exemplo de dataframe se parece com isto:
num_indices = 2000 # Set number of indices
# Generate lists of values (each a list of numbers from 0 to 1)
column_data = [np.random.random(750).tolist() for _ in range(num_indices)]
# Create DataFrame
df = pd.DataFrame({'values': column_data}, index=range(num_indices))
Encontrei esta implementação que usa np.lib.stride_tricks, mas é um pouco lenta para o meu propósito. Alguém tem uma ideia para um método mais rápido?
def moving_median(signal,n=150):
# Compute rolling median for valid windows
swindow = np.lib.stride_tricks.sliding_window_view(signal, (n,))
b = np.nanmedian(swindow, axis=1)
b_full = np.concatenate([[np.nanmedian(signal)]*(n-1), b]) # Prepend first `n-1` values unchanged
return signal - b_full
E finalmente:
df.iloc[:,0].apply(lambda x: moving_median(x))