【发布时间】:2015-04-10 10:11:32
【问题描述】:
我希望将统计分析项目迁移到 pandas。我想在 N 天的滚动窗口中对 3 列进行排名。我已经找到了在这个问题 [rank-data-over-a-rolling-window][1] 中回答的方法,但是性能对于我的数据集(45K 行)来说是不够的。我发现最快的方法是使用bottleneck library或numpy argsort,如下所示。这显着提高了性能,但与应该具有相似性能的 rolling_mean 函数相比仍有一段距离。
编辑:我已经更新了下面的代码,以提供一个可重现的计时示例。系列排名功能是最灵活的,允许我选择如何对关系进行排名,但速度很慢。我能找到的最好的两个是瓶颈方法或 argsort。两者在性能上具有可比性,但对关系的处理有限制。但是,与滚动平均值相比,两者仍然慢得多?
rollWindow = 240
df = pd.DataFrame(np.random.randn(100000,4), columns=list('ABCD'), index=pd.date_range('1/1/2000', periods=100000, freq='1H'))
df.iloc[-3:-1]['A'] = 7.5
df.iloc[-1]['A'] = 5.5
df["SER_RK"] = pd.rolling_apply(df["A"], rollWindow, rollingRankOnSeries)
# 28.9secs (allows competition/min ranking for ties)
df["SCIPY_RK"] = pd.rolling_apply(df["A"], rollWindow, rollingRankSciPy)
# 70.89secs (allows competition/min ranking for ties)
df["BNECK_RK"] = pd.rolling_apply(df["A"], rollWindow, rollingRankBottleneck)
# 3.64secs (only provides average ranking for ties)
df["ASRT_RK"] = pd.rolling_apply(df["A"], rollWindow, rollingRankArgSort)
# 3.56secs (only provides competition/min ranking for ties)
df["MEAN"] = pd.rolling_mean(df['A'], window=rollWindow)
# 0.008secs
def rollingRankOnSeries (array):
s = pd.Series(array)
return s.rank(method='min', ascending=False)[len(s)-1]
def rollingRankSciPy (array):
return array.size + 1 - sc.rankdata(array)[-1]
def rollingRankBottleneck (array):
return array.size + 1 - bd.rankdata(array)[-1]
def rollingRankArgSort (array):
return array.size - array.argsort().argsort()[-1]
A SER_RK SCIPY_RK BNECK_RK ASRT_RK MEAN
2011-05-29 11:00:00 1.37 23 23.0 23.0 23 0.013526
2011-05-29 12:00:00 0.45 85 85.0 85.0 85 0.016833
2011-05-29 13:00:00 7.50 1 1.0 1.0 1 0.049606
2011-05-29 14:00:00 7.50 1 1.5 1.5 1 0.083655
2011-05-29 15:00:00 5.50 3 3.0 3.0 3 0.112001
我以前通过保持每个窗口(在线)之间的差异来实现移动窗口统计,以便轻松计算排名变化,目前看来我必须完全重新排列每个窗口,这是不必要的。我看到之前有人问过类似的问题[Pandas performance on rolling stats][2]。
- 您知道 pandas 中是否有一种方法可以更有效地执行此计算?
- 是否有一种简单的方法可以在 pandas 的移动窗口上实现一个函数,我可以在其中找到为每个步骤添加和删除的元素并相应地返回一个值,从而可能维护我自己的运行排名计算?
谢谢
[1]: http://stackoverflow.com/questions/14440187/rank-data-over-a-rolling-window-in-pandas-dataframe
[2]: http://stackoverflow.com/questions/24613850/pandas-performance-on-multiple-rolling-statistics-on-different-time-intervals
【问题讨论】:
标签: python performance pandas