2016-01-21 70 views
2

首先,我將介紹我的目標和我的代碼來實現它我可以提高大量時間序列數據之間的相關性分析的計算速度嗎?

  1. VALUE是表示2-d區域的時間變化的3-d numpy的陣列。 (例如value[:1000,2,3] = list [電網(X = 3,Y = 2)的值從0到1000]。)

    以我實際工作中,VALUE是在(2812,75的形狀90)PS:「2812」是4個月

  2. 某些時候,我叫選擇代表一個有趣的問題,我會在該地區的每一個網格做相關性分析的總和小時。

    SELECT是熊貓數據幀包括每個感興趣點的X和Y

  3. COV是3 d陣列作爲計數矩陣記錄中的每個的相關電平選擇點與每個網格點

    設置截止皮爾遜係數RC = 0.75,
    SE LECT
    如果R(I,J)> RC ==> COV [T,I,J] = 1,否則COV [T,I,J] = 0

這是我的代碼,但它有點慢。我認爲這個過程的某些部分可以改進:

start = timeit.default_timer() 
### SELECT is a pandas dataframe including each interesting point's X and Y 
cov = np.zeros(len(SELECT)*VALUE.shape[1]*VALUE.shape[2]).reshape(len(SELECT), VALUE.shape[1],VALUE.shape[2]) 
for t in range(0,len(SELECT),1): 
    select_grid = pd.DataFrame(VALUE[:,SELECT.Y.iloc[t],SELECT.X.iloc[t]]) 
for i in range(0,VALUE.shape[1],1): 
    for j in range(0,VALUE.shape[2],1): 
     data_grid = pd.DataFrame(VALUE[:,i,j]) 
     ## Using corr to compute the correlation r 
     r_sg = select_grid[0].corr(data_grid[0]) 
     if r_sg > 0.75: 
      cov[t,i,j] = 1 

end = timeit.default_timer()     
print end - start                           
+2

您是否試圖運行分析器來查看時間花在哪裏?例如[本文](https://www.huyng.com/posts/python-performance-analysis)中描述的'line_profiler',只需向下滾動到「逐行....」部分即可。可能有助於闡明可以改進的方面。 –

+1

你可以給出'len(SELECT),VALUE.shape [1],VALUE.shape [2]'和'end-start'的大小來估計可能的改進嗎?什麼是'ds_grid'?數據鏈接也是一個很好的工具。 –

+0

謝謝!我不知道「定時上下文管理器」。如果可以,我會學習它。 –

回答

2

你的工作是耗時:在選擇每個樣品約一秒。

  • 向量化不會給你一個很大的改進,因爲耗時的corr函數在內部循環中。

  • 然而,你可以有一個更明亮的代碼,這裏熊貓不是必須的。作爲一個爲例:

    VALUE=random((2812,5,5)) 
    select=pd.DataFrame(randint(0,5,(10,2))) 
    .... 
    for (x,y) in select.values: 
    .... 
        r=np.corrcoef(VALUE[:,x,y],VALUE[:,i,j])[0,1] 
    .... 
    

[0,1]爲這裏選擇r,因爲corrcoef計算2×2陣列。

  • 你可以做的第一優化正在與numpy的陣列,而不是DataFrames爲2倍的增益爲科爾計算。

    DFexample = pd.DataFrame(VALUE[:,0,:]) 
    
    In [19]: %timeit np.corrcoef(VALUE[:,0,0],VALUE[:,0,1]) 
    1000 loops, best of 3: 556 µs per loop 
    
    In [20]: %timeit DFexample[0].corr(DFexample[1]) 
    1000 loops, best of 3: 1.09 ms per loop 
    
  • 的另一種方法是預先計算意味着ANS性病,因爲r(x,y) = (<xy>-<x><y>)/σx/σy了3倍的增益:

    In [24]: s=VALUE.std(axis=0) # 1 second 
    
    In [25]: m=VALUE.mean(axis=0) # 2 second 
    
    In [26]: %timeit ((VALUE[:,0,0]*VALUE[:,0,1]).mean() -m[0,1]*m[0,0])/s[0,0]/s[0,1] 
    10000 loops, best of 3: 172 µs per loop 
    
    In [31]: allclose(((VALUE[:,0,0]*VALUE[:,0,1]).mean() -m[0,1]*m[0,0])/s[0,0]/s[0,1],\ 
    DFexample[0].corr(DFexample[1])) 
    Out[31]: True 
    

所以你至少可以贏得一個6X因素

相關問題