2015-02-10 36 views
0

我期待將一個統計分析項目遷移到熊貓。我想在N天的滾動窗口中排列3列。我已經找到了解決這個問題的方法[rank-data-over-a-rolling-window] [1],但是對於我的數據集(45K行),性能不夠。我發現的最快方法是使用下面的瓶頸庫或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 

我以前實現爲通過保持每個窗口之間的差(在線)容易地計算,其中,因爲它出現我現在有完全重新排序每一個窗口,這是不必要的秩的變化移動窗口統計信息。我已經看到過類似的問題[熊貓在滾動數據上的表現] [2]。

  1. 您是否知道在熊貓中是否有辦法更有效地執行此計算?
  2. 有沒有一種簡單的方法來實現一個功能在熊貓移動窗口中,我可以找到每個步驟添加和刪除的元素(s)並相應地返回一個值,可能維護我自己的運行等級計算?

感謝

[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 

回答

-1

文檔here做你所描述的,我相信什麼。

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() 

這就是大熊貓如何優化執行任務。如果這不夠快,我不確定解決方法會比內置函數更快。如果這是多餘的感覺自由downvote :)

編輯: 這是更多你在說什麼?

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萬行它花了0.4秒根據時間。當然,這只是一個日期時間戳和一個值。你是否在尋找比這更快的東西,我能更好地理解你所嘗試過的東西嗎?

+0

嗨,謝謝,但我不認爲這回答我的問題,雖然。這些方法不會在窗口上創建等級。我已經通讀了導致「rolling_apply」的文檔。然而,這似乎只是將新鮮的函數應用於每個窗口並且將大數據集應用於需要很長時間來迭代應用該函數。使用熊貓卷功能的速度非常慢。 argsort速度更快,更接近上面的瓶頸方法,但我仍然認爲通過使用在線窗口或者我缺少的方法來實現更高效的方法應該不困難? – PH82 2015-02-11 06:45:22

+0

再次感謝您的回覆,但您的示例會返回最大值。我希望滾動窗口中的項目的等級(如果可能的話)是關係的最小值。我更新了我的問題以創建一個可重複的示例。 – PH82 2015-02-12 10:10:53