2016-06-27 15 views
12

Utilizzando pmi 0.18.1, vorrei prendere la media mobile di un dataframe a una colonna. Dalla versione 0.18.0, questo viene fatto con gli oggetti rolling(). L'impostazione predefinita per questi oggetti rotanti deve essere giustificata a destra. C'è un argomento booleano che puoi passare, center = True, per allineare l'oggetto rotolante al valore centrale, ma non sembra esserci un modo per farlo allineare a sinistra. Ecco un esempio:Allineare a sinistra un oggetto rotante panda

df = pandas.DataFrame({'A': [2,3,6,8,20, 27]}) 
df 
    A 
0 2 
1 3 
2 6 
3 8 
4 20 
5 27 

Il metodo standard allinea automaticamente verso destra, quindi non c'è alcun valore alle prime due indecies con una finestra di dimensione tre:

df.rolling(window=3).mean() 
      A 
0  NaN 
1  NaN 
2 3.666667 
3 5.666667 
4 11.333333 
5 18.333333 

Possiamo centrare allineare l'operazione in questo modo:

df.rolling(window=3).mean(center=True) 
      A 
0  NaN 
1 3.666667 
2 5.666667 
3 11.333333 
4 18.333333 
5  NaN 

Ma quello che sto cercando è questo:

df.rolling(3).mean() 
      A 
0 3.666667 
1 5.666667 
2 11.333333 
3 18.333333 
4  NaN 
5  NaN 

È possibile farlo eseguendo l'allineamento di destra predefinito, quindi reindicizzandolo o invertendo l'ordine delle righe e quindi eseguendo "allineato a destra", ma queste sono soluzioni per ciò che dovrebbe essere un'operazione diretta.

risposta

13

Penso che si possa utilizzare shift:

a = df.rolling(window=3).mean().shift(-2) 
print (a) 
      A 
0 3.666667 
1 5.666667 
2 11.333333 
3 18.333333 
4  NaN 
5  NaN 
+0

Questa è una buona soluzione, anche se speravo ci fosse un modo più diretto per farlo. Immagino che la funzionalità non sia ancora presente negli oggetti rotanti. – Alex

+0

Sì, penso che tu abbia ragione. Non lo vedo mai. – jezrael

+4

Ho accettato questa risposta perché la funzionalità desiderata non è realmente negli oggetti rolling di panda e ciò fornisce la soluzione più elegante. Se si volesse gestire questo allineamento a sinistra un po 'più dinamicamente, la dimensione della finestra potrebbe essere impostata con una variabile w, e quindi l'argomento nel metodo .shift() potrebbe essere w-1. – Alex