我是Python和Pandas库的新手,如果这是一个微不足道的问题,请道歉。我试图在N天的滚动窗口中排列时间序列。我知道有一个等级函数,但是这个函数对整个时间序列中的数据进行排序。我似乎无法找到滚动排名功能。 这是我想要做的一个例子:
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
如果我想在3天的滚动窗口中对数据进行排名,答案应该是:
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
Python中是否有内置函数可以执行此操作?有什么建议吗? 非常感谢。
答案 0 :(得分:3)
如果你想使用Pandas built-in rank method(带有一些额外的语义,比如升序选项),你可以为它创建一个简单的函数包装器
def rank(array):
s = pd.Series(array)
return s.rank(ascending=False)[len(s)-1]
然后可以用作自定义滚动窗口函数。
pd.rolling_apply(df['A'], 3, rank)
输出
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
(我假设来自Rutger的答案的df
数据结构)
答案 1 :(得分:2)
您可以在Pandas中为rolling_window编写自定义函数。在该函数中使用numpy的argsort()可以在窗口中给出排名:
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
结果:
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