E.G,我有以下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。
答案 0 :(得分:1)
问题是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
关注this answer我意识到您可以通过使用上面的表达式来避免循环,但是在分组对象的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