簡體   English   中英

groupby后如何計算ewm相關系數

[英]How to calculate the ewm correlation coefs after groupby

EG,我有以下 csv 數據(實際上有不止一組 g):

G,T,x,y
g,1,3,4
g,2,4,5
g,3,6,1
g,4,7,2
g,5,8,3
g,6,9,8

我想計算每組的 x 和 y 之間的指數加權相關系數。 所以我期待結果:

G T     namedWhatever
g 1         NaN
g 2    1.000000
g 3   -0.867510
g 4   -0.792758
g 5   -0.510885
g 6    0.413379

實際上可以通過以下方式計算:

dat.loc['g'].ewm(halflife=3).corr().loc[:, 'x', 'y']
Out[5]: 
T
1         NaN
2    1.000000
3   -0.867510
4   -0.792758
5   -0.510885
6    0.413379
Name: y, dtype: float64

我沒有運氣的嘗試:

In [3]: dat = pd.read_csv('test.csv').set_index(['G', 'T'])

In [4]: dat.groupby(level='G').transform(lambda x: x.ewm(halflife=3).corr())
Out[4]: 
       x    y
G T          
g 1  NaN  NaN
  2  1.0  1.0
  3  1.0  1.0
  4  1.0  1.0
  5  1.0  1.0
  6  1.0  1.0

正確的方法是什么? 我的熊貓版本是 0.19.2 和 python 3.6。

問題是corr返回相關矩陣。 因此,當您執行ewm.corr時,它將返回一個面板。 因此,您需要提取多余的對角線分量以獲得相關系數。

帶有循環的顯式解決方案是:

res = pd.concat([el.ewm(halflife = 3).corr().xs('x', axis = 1).loc['y', :] for key, el in dat.groupby(level = 'G')])

如果您檢查el.ewm(halflife = 3).corr()這會更清楚:

el.ewm(halflife = 3).corr()
Out[54]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 6 (items) x 2 (major_axis) x 2 (minor_axis)
Items axis: (g, 1) to (g, 6)
Major_axis axis: x to y
Minor_axis axis: x to y

這個答案 ,我意識到,你可以通過使用以上,但內表達避免循環apply ,而不是transform分組的對象上的方法。

dat.groupby(level='G').apply(lambda x: x.ewm(halflife=3).corr().xs('x', axis = 1).loc['y', :]).T

在這兩種情況下,我都獲得了預期的輸出:

res
Out[55]: 
G  T
g  1         NaN
   2    1.000000
   3   -0.867510
   4   -0.792758
   5   -0.510885
   6    0.413379
Name: y, dtype: float64

對於 (5000 x 5000) corr 矩陣,這個過程太耗時了,有沒有更好的方法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM