相关矩阵的意义 - Pandas 数据框架

7

我有一个 Pandas Python 数据帧 (342, 342),其中包含一个大型的相关矩阵。

如何计算上三角中所有数字的平均值、标准差等统计指标,但不包括对角线上的数字 1?

谢谢。


你目前尝试了什么?展示相关代码可以帮助我们理解你的问题。 ;) - vdbuilder
2个回答

9

另一个可能的一行回答:

In [1]: corr
Out[1]:
          a         b         c         d         e
a  1.000000  0.022246  0.018614  0.022592  0.008520
b  0.022246  1.000000  0.033029  0.049714 -0.008243
c  0.018614  0.033029  1.000000 -0.016244  0.049010
d  0.022592  0.049714 -0.016244  1.000000 -0.015428
e  0.008520 -0.008243  0.049010 -0.015428  1.000000

In [2]: corr.values[np.triu_indices_from(corr.values,1)].mean()
Out[2]: 0.016381

编辑:添加了性能指标

我的解决方案的性能:

In [3]: %timeit corr.values[np.triu_indices_from(corr.values,1)].mean()
10000 loops, best of 3: 48.1 us per loop

Theodros Zelleke的一行解决方案的性能:

In [4]: %timeit corr.unstack().ix[zip(*np.triu_indices_from(corr, 1))].mean()
1000 loops, best of 3: 823 us per loop

DSM解决方案的性能:
In [5]: def method1(df):
   ...:     df2 = df.copy()
   ...:     df2.values[np.tril_indices_from(df2)] = np.nan
   ...:     return df2.unstack().mean()
   ...:

In [5]: %timeit method1(corr)
1000 loops, best of 3: 242 us per loop

3

这有点有趣。我不能保证这是真正的pandas-fu;我自己还处于学习numpy和更好索引的阶段。话虽如此,像这样做应该能完成任务。

首先,我们制作一个玩具相关矩阵来玩:

>>> import pandas as pd
>>> import numpy as np
>>> frame = pd.DataFrame(np.random.randn(1000, 5), columns=['a', 'b', 'c', 'd', 'e'])
>>> corr = frame.corr()
>>> corr
          a         b         c         d         e
a  1.000000  0.022246  0.018614  0.022592  0.008520
b  0.022246  1.000000  0.033029  0.049714 -0.008243
c  0.018614  0.033029  1.000000 -0.016244  0.049010
d  0.022592  0.049714 -0.016244  1.000000 -0.015428
e  0.008520 -0.008243  0.049010 -0.015428  1.000000

我们首先做一份拷贝,然后使用tril_indices_from函数获取下三角矩阵的索引并用它来进行掩码操作:

>>> c2 = corr.copy()
>>> c2.values[np.tril_indices_from(c2)] = np.nan
>>> c2
    a        b         c         d         e
a NaN  0.06952 -0.021632 -0.028412 -0.029729
b NaN      NaN -0.022343 -0.063658  0.055247
c NaN      NaN       NaN -0.013272  0.029102
d NaN      NaN       NaN       NaN -0.046877
e NaN      NaN       NaN       NaN       NaN

现在我们可以对压平后的数组进行统计:
>>> c2.unstack().mean()
-0.0072054178481488901
>>> c2.unstack().std()
0.043839624201635466

你的相关矩阵副本c2中的非掩码值为什么与corr不同? - Zelazny7
@Zelazny7:哦,我可能是从两次不同的运行中复制的(因此有两个不同的随机frame)。 - DSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接