2016-04-29 23 views
5

Ho un grande dataframe panda dei dati delle serie temporali.Finestra scorrevole su panda Dataframe

Attualmente sto manipolando questo dataframe per creare un nuovo dataframe più piccolo che ruota mediamente ogni 10 righe. cioè una tecnica a finestra rotolante. Come questo:

def create_new_df(df): 
    features = [] 
    x = df['X'].astype(float) 
    i = x.index.values 
    time_sequence = [i] * 10 
    idx = np.array(time_sequence).T.flatten()[:len(x)] 
    x = x.groupby(idx).mean() 
    x.name = 'X' 
    features.append(x) 
    new_df = pd.concat(features, axis=1) 
    return new_df 

Codice di prova:

columns = ['X'] 
df_ = pd.DataFrame(columns=columns) 
df_ = df_.fillna(0) # with 0s rather than NaNs 
data = np.array([np.arange(20)]*1).T 
df = pd.DataFrame(data, columns=columns) 

test = create_new_df(df) 
print test 

uscita:

 X 
0 4.5 
1 14.5 

Tuttavia, voglio la funzione di rendere la nuova dataframe utilizzando una finestra scorrevole con un 50% sovrapposizione

Quindi l'output sarebbe simile a questo:

 X 
0 4.5 
1 9.5 
2 14.5 

Come posso fare questo?

Ecco che cosa ho provato:

from itertools import tee, izip 

def window(iterable, size): 
    iters = tee(iterable, size) 
    for i in xrange(1, size): 
     for each in iters[i:]: 
      next(each, None) 
    return izip(*iters) 

for each in window(df, 20): 
    print list(each) # doesn't have the desired sliding window effect 

alcuni potrebbero anche suggerire utilizzando i panda rolling_mean() metodi, ma se è così, non riesco a vedere come utilizzare questa funzione con la finestra di sovrapposizione.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

5

Penso che le tecniche di rotazione dei panda funzionino bene qui. Si noti che a partire dalla versione 0.18.0 di panda, si utilizzerà rolling().mean() anziché rolling_mean().

>>> df=pd.DataFrame({ 'x':range(30) }) 
>>> df = df.rolling(10).mean()   # version 0.18.0 syntax 
>>> df[4::5]        # take every 5th row 

     x 
4 NaN 
9 4.5 
14 9.5 
19 14.5 
24 19.5 
29 24.5 
+2

'df [4 :: 5]' - è fantastico! – MaxU

+0

@MaxU Non andrei così lontano, ma grazie! – JohnE

+1

Non sarebbe uno spreco di potere computazionale? Diciamo che ho una sovrapposizione del 50% su 64 finestre di esempio, quindi in pratica utilizzo solo 1/32 del lavoro. A meno che non sia valutato pigramente, ovviamente. –