在 pandas DataFrame 中的滚动窗口上对数据进行排名
Posted
技术标签:
【中文标题】在 pandas DataFrame 中的滚动窗口上对数据进行排名【英文标题】:rank data over a rolling window in pandas DataFrame 【发布时间】:2013-01-04 14:22:42 【问题描述】:我是 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 中的内置函数可以做到这一点?有什么建议吗? 非常感谢。
【问题讨论】:
@Divakar 你知道吗?如何快速完成?没有一个答案很快。 【参考方案1】:如果你想使用 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
数据结构)
【讨论】:
非常感谢您的帮助。这很有帮助。 这真的很慢。我相信在 pandas 1.18 中有一种内置方法可以做到这一点,但他们在 .20.xx 中摆脱了它,你知道这样做的原生方式吗?【参考方案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
【讨论】:
以上是关于在 pandas DataFrame 中的滚动窗口上对数据进行排名的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动有效数值计数(rolling count)自定义指定滚动窗口的大小(window size)
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动均值(rolling mean)自定义指定滚动窗口的大小(window size)
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动最小值(rolling minimum)自定义指定滚动窗口的大小(window size)
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动加和值(rolling sum)自定义指定滚动窗口的大小(window size)
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动最大值(rolling maximum)自定义指定滚动窗口的大小(window size)