2013-01-21 41 views
5

Python ve Pandas kütüphanesinde yeniyim, bu çok önemsiz bir soru ise özür dilerim. N günlerinin haddeleme penceresinden bir Timeseries'i sıralamaya çalışıyorum. Bir rank fonksiyonu olduğunu biliyorum, ancak bu fonksiyon tüm zaman çizelgeleri boyunca verileri sıralıyor. Rolling rank fonksiyonu bulabiliyorum gibi görünmüyor. İşte Yapmak ne çalışıyorum bir örnektir:pandalarda yuvarlanan bir pencere üzerinde sıralı veri 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 

Ben 3 gün kayan zaman aralığında üzerinden veri sıralamak istedik, cevap olmalıdır:

  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 

orada mı Python'da yerleşik işlev, bunu yapabilir mi? Herhangi bir öneri? Çok teşekkürler.

cevap

3

bazı ek semantik gibi olan pandalar built-in rank method (kullanmak isterseniz artan opsiyon) oluşturduktan sonra özel bir haddeleme pencereli fonksiyonu olarak kullanılabilir o

def rank(array): 
    s = pd.Series(array) 
    return s.rank(ascending=False)[len(s)-1] 

için basit fonksiyon sarmalayıcı oluşturabilirsiniz.

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 

+0

Yardımlarınız için çok teşekkür ederim (ı Rutger cevabı dan df veri yapısını varsayarak) verir

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

. Bu çok yardımcı. – FrankDR

+1

Bu gerçekten yavaş. 1.18 pandalarda bunu yapabilmek için inşa edilmiş bir yapı olduğuna inanıyorum ama bunu .20.xx'den kurtararak bu 'u yapmanın doğal bir yolunu biliyor musunuz? – Adam

2

Sen Pandalar bir rolling_window için özel bir işlev yazabilirsiniz. Bu işlevde numpy en argsort() kullanma aralığı içinde gerçekleşen rütbe verebilir:

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 

Sonuçlar:

   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 
İlgili konular