desidero filtrare un numpy
array
(o pandas
DataFrame
) in un modo che solo serie continua dello stesso valore con almeno window_size
lunghezza viene mantenuta e quant'altro set a 0.panda filtraggio o array NumPy per serie continua di lunghezza finestra minima
ad esempio:
[1,1,1,0,0,1,1,1,1,0,0,1,0,0,0,1,1,1,0,1,1,1,1]
dovrebbe diventare quando si utilizza una dimensione della finestra di 4
[0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1]
Ho provato a utilizzare rolling_apply
e scipy.ndimage.filtes.gerneric_filter
ma a causa della natura delle funzioni di rolling del kernel, non penso che sia l'approccio giusto qui (e sono bloccato con esso al momento).
inserisco il mio tentativo qui comunque:
import numpy as np
import pandas as pd
import scipy
#from scipy import ndimage
df= pd.DataFrame({'x':np.array([1,1,1,0,0,1,1,1,1,0,0,1,0,0,0,1,1,1,0,1,1,1,1])})
df_alt = df.copy()
def filter_df(df, colname, window_size):
rolling_func = lambda z: z.sum() >= window_size
df[colname] = pd.rolling_apply(df[colname],
window_size,
rolling_func,
min_periods=window_size/2,
center = True)
def filter_alt(df, colname, window_size):
rolling_func = lambda z: z.sum() >= window_size
return scipy.ndimage.filters.generic_filter(df[colname].values,
rolling_func,
size = window_size,
origin = 0)
window_size = 4
filter_df(df, 'x', window_size)
print df
filter_alt(df_alt, 'x', window_size)
Come volete per il trattamento di una sequenza di stessi valori più lunga della dimensione della finestra? I valori sono sempre identici o possono differire per lo stesso array? – Stefan
Mi piacerebbe tenerli come una serie di 1 anche. Come: [1,1,1,1,1] -> [1,1,1,1,1] – pho