2013-01-21 12 views
5

Jestem nowy w bibliotece Python i Pandas, więc przepraszam, jeśli jest to banalne pytanie. Próbuję szeregować Timeseries nad ruchomym oknem N dni. Wiem, że istnieje funkcja rangowania, ale ta funkcja szereguje dane w całym serialu. Wydaje mi się, że nie mogę znaleźć funkcji stopniowej rotacji. Oto przykład tego, co próbuję zrobić:dane rankingowe na ruchomym oknie w pandach DataFrame

  A 

01-01-2013 100 
02-01-2013 85 
03-01-2013 110 
04-01-2013 60 
05-01-2013 20 
06-01-2013 40 

Gdybym chciał uporządkować dane ponad toczenia okna 3 dni, odpowiedź powinna być:

  Ranked_A 

01-01-2013 NaN 
02-01-2013 Nan 
03-01-2013 1 
04-01-2013 3 
05-01-2013 3 
06-01-2013 2 

Czy istnieje wbudowana funkcja w Pythonie, która może to zrobić? Jakieś sugestie? Wielkie dzięki.

Odpowiedz

3

Jeśli chcesz użyć Pandy built-in rank method (z pewnymi dodatkowymi semantyki, takich jak opcja rosnąca), można utworzyć prostą owijkę funkcji, która będzie mogła zostać użyta jako niestandardowa funkcja okna przewijania.

pd.rolling_apply(df['A'], 3, rank) 

który wyprowadza

Date 
01-01-2013 NaN 
02-01-2013 NaN 
03-01-2013  1 
04-01-2013  3 
05-01-2013  3 
06-01-2013  2 

(Jestem przy założeniu struktury df danych z odpowiedzią Rutger za)

+0

Dziękuję bardzo za pomoc. To jest bardzo pomocne. – FrankDR

+1

to jest naprawdę powolne. Wierzę, że było to wbudowane w to, aby zrobić to w pandach 1.18, ale pozbyli się tego w .20.xx Czy znasz rodzimy sposób robienia tego ? – Adam

2

Możesz napisać niestandardową funkcję dla rolling_window w Pandas. Korzystanie argsort NumPy użytkownika() w tej funkcji można uzyskać rangę w oknie:

import pandas as pd 
import StringIO 

testdata = StringIO.StringIO(""" 
Date,A 
01-01-2013,100 
02-01-2013,85 
03-01-2013,110 
04-01-2013,60 
05-01-2013,20 
06-01-2013,40""") 

df = pd.read_csv(testdata, header=True, index_col=['Date']) 

rollrank = lambda data: data.size - data.argsort().argsort()[-1] 

df['rank'] = pd.rolling_apply(df, 3, rollrank) 

print df 

skutkuje:

   A rank 
Date     
01-01-2013 100 NaN 
02-01-2013 85 NaN 
03-01-2013 110  1 
04-01-2013 60  3 
05-01-2013 20  3 
06-01-2013 40  2 
Powiązane problemy