2014-03-19 70 views
2

我前一段時間發佈,但沒有人能解決這個問題。我怎樣才能使用適用於熊貓rolling_corr()

首先讓我們來創建一些相關DataFrames和呼叫rolling_corr(),與dropna()因爲我打算以後稀疏起來,並沒有min_period設置爲我想保持結果強勁,並與設定的窗口

hey=(DataFrame(np.random.random((15,3)))+.2).cumsum() 
hoo=(DataFrame(np.random.random((15,3)))+.2).cumsum() 
hey_corr= rolling_corr(hey.dropna(),hoo.dropna(), 4) 

一致給我

In [388]: hey_corr 

Out[388]: 

    0  1  2 
0 NaN  NaN  NaN 
1 NaN  NaN  NaN 
2 NaN  NaN  NaN 
3 0.991087 0.978383 0.992614 
4 0.974117 0.974871 0.989411 
5 0.966969 0.972894 0.997427 
6 0.942064 0.994681 0.996529 
7 0.932688 0.986505 0.991353 
8 0.935591 0.966705 0.980186 
9 0.969994 0.977517 0.931809 
10 0.979783 0.956659 0.923954 
11 0.987701 0.959434 0.961002 
12 0.907483 0.986226 0.978658 
13 0.940320 0.985458 0.967748 
14 0.952916 0.992365 0.973929 
現在

當我稀疏起來它給了我......

hey.ix[5:8,0] = np.nan 
hey.ix[6:10,1] = np.nan 
hoo.ix[5:8,0] = np.nan 
hoo.ix[6:10,1] = np.nan 
hey_corr_sparse = rolling_corr(hey.dropna(),hoo.dropna(), 4) 
hey_corr_sparse 

Out[398]: 

    0  1  2 
0 NaN  NaN  NaN 
1 NaN  NaN  NaN 
2 NaN  NaN  NaN 
3 0.991273 0.992557 0.985773 
4 0.953041 0.999411 0.958595 
11 0.996801 0.998218 0.992538 
12 0.994919 0.998656 0.995235 
13 0.994899 0.997465 0.997950 
14 0.971828 0.937512 0.994037 
數據個

卡盤丟失了,看起來我們只有數據在dropna()可以形成跨越數據幀完整的窗口

我能解決一個醜陋的ITER-軟糖如下問題......

hey_corr_sparse = DataFrame(np.nan, index=hey.index,columns=hey.columns) 
for i in hey_corr_sparse.columns: 
    hey_corr_sparse.ix[:,i] = rolling_corr(hey.ix[:,i].dropna(),hoo.ix[:,i].dropna(), 4) 
hey_corr_sparse 

Out[406]: 

    0  1  2 
0 NaN  NaN  NaN 
1 NaN  NaN  NaN 
2 NaN  NaN  NaN 
3 0.991273 0.992557 0.985773 
4 0.953041 0.999411 0.958595 
5 NaN  0.944246 0.961917 
6 NaN  NaN  0.941467 
7 NaN  NaN  0.963183 
8 NaN  NaN  0.980530 
9 0.993865 NaN  0.984484 
10 0.997691 NaN  0.998441 
11 0.978982 0.991095 0.997462 
12 0.914663 0.990844 0.998134 
13 0.933355 0.995848 0.976262 
14 0.971828 0.937512 0.994037 

有沒有人在社區知道是否有可能使這個數組函數來給出這個結果,我試圖使用。應用程序,但畫了一個空白,甚至有可能.apply功能,在兩個數據結構(在這個例子中是hey和hoo)?

千恩萬謝,LW

+0

如果有NaN的一列中,應該把相關窗口無視他們?因爲在這種情況下,索引11上的相關性不是基於不同列的相同行計算的? – joris

+0

它確實取決於數據任務以及爲什麼有NaN,在我的例子中,我特別排除了NaN(vs winsorising)數據,並利用Pandas處理NaN來計算數據。 – Lonewolf

+0

是的,我知道它可以依賴。但只是問,因爲如果你想傳播NaN,你可以在沒有dropna的情況下執行rolling_cor:'rolling_corr(hey,hoo,4)' – joris

回答

2

你可以試試這個:

>>> def sparse_rolling_corr(ts, other, window): 
...  return rolling_corr(ts.dropna(), other[ts.name].dropna(), window).reindex_like(ts) 
... 
>>> hey.apply(sparse_rolling_corr, args=(hoo, 4)) 
+0

@ behzad.nouri,完美的作品,非常感謝...再次 – Lonewolf