首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:大型数据平台上滚动排名的表现

熊猫:大型数据平台上滚动排名的表现
EN

Stack Overflow用户
提问于 2015-02-10 11:34:05
回答 1查看 2.3K关注 0票数 2

我想把一个统计分析项目迁移到熊猫身上。我想在滚动的N天窗口上排行3列。我在这个问题中找到了解决这个问题的方法,排名数据滚动窗口,但是性能不足以满足我的数据集(45K行)。我发现的最快的方法是使用瓶颈库或numpy argsort,如下所示。这大大提高了性能,但与应该具有类似性能的rolling_mean函数相比,还有一段路要走。

编辑:我已经更新了下面的代码,以提供一个具有时间的可重复的示例。系列排名功能是最灵活的,允许我选择如何排序领带,但是非常缓慢。我能找到的最好的两种方法是瓶颈方法或争论。两者在性能上是相当的,但在处理关系方面都有限制。然而,与滚动平均值相比,两者的速度都要慢得多?

代码语言:javascript
复制
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 

我以前实现了移动窗口统计,通过维护每个窗口(在线)之间的差异来轻松计算排名的变化,就像我现在看起来必须完全重新排列每个窗口一样,这是不必要的。我已经看到一个类似的问题已经被问到之前潘达在滚动统计数据方面的表现。

  1. 你知道熊猫是否有更有效的计算方法吗?
  2. 有没有一种简单的方法可以在熊猫的移动窗口上实现一个函数,在那里我可以找到每个步骤中添加和删除的元素,并相应地返回一个值,可能会保持我自己的运行级别计算。

谢谢

代码语言:javascript
复制
[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
EN

回答 1

Stack Overflow用户

发布于 2015-02-10 17:12:48

文档这里完成了您所描述的我相信的事情。

代码语言:javascript
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000',
    periods=1000))
plot1 = pd.rolling_max(ts, 240)
plot2 = pd.rolling_min(ts, 240)
plot3 = pd.rolling_mean(ts, 240)

plt.plot(plot1.values.tolist())
plt.plot(plot2.values.tolist())
plt.plot(plot3.values.tolist())
plt.show()

这就是如何优化Pandas以执行任务。如果这还不够快,我不确定一个解决方案是否会比内置的函数更快。如果这是多余的,可以随意否决:)

编辑:这是你说的更多吗?

代码语言:javascript
复制
ts = pd.Series(np.random.randn(1000000), index=pd.date_range('1/1/2000', periods=1000000))

listofmax = []
for number in range(0, len(ts), 240):
    listofmax.append(ts[number:number+240].max())

根据时间,它花费了100万行.4秒。当然,这只是一个日期时间戳和一个值。你在寻找比这更快的东西吗?我能更好地理解你尝试过什么吗?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28430644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档