7

我是 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中是否有可以做到这一点的内置函数?有什么建议吗?非常感谢。

4

2 回答 2

6

如果你想使用 Pandas内置的 rank 方法(带有一些额外的语义,例如升序选项),你可以为它创建一个简单的函数包装器

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

(我假设df来自 Rutger 的回答中的数据结构)

于 2013-01-21T15:52:58.517 回答
3

您可以在 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
于 2013-01-21T14:40:55.200 回答