如何有效地获取具有NaN值的数据帧的相关矩阵(具有p值)?

ju.*_*ju. 6 python correlation pandas p-value

我正在尝试计算相关矩阵,并根据p值过滤相关性,以找出高度相关的对。

为了解释我的意思,请说我有一个这样的数据框。

df

    A       B       C       D
0   2       NaN     2       -2
1   NaN     1       1       1.1
2   1       NaN     NaN     3.2
3   -4      NaN     2       2
4   NaN     1       2.1     NaN
5   NaN     3       1       1
6   3       NaN     0       NaN
Run Code Online (Sandbox Code Playgroud)

为相关系数。我使用了pd.corr()。此方法可以处理具有NaN值的数据帧,更重要的是,它可以容忍具有0重叠的列对(列A和列B):

rho = df.corr()

       A          B            C           D
A   1.000000     NaN       -0.609994    0.041204
B   NaN          1.0       -0.500000    -1.000000
C   -0.609994    -0.5       1.000000    0.988871
D   0.041204     -1.0       0.988871    1.000000
Run Code Online (Sandbox Code Playgroud)

挑战在于计算p值。我没有找到执行此操作的内置方法。但是,从具有统计意义的大熊猫列相关性中,@ BKay提供了一种计算p值的循环方法。如果重叠少于3个,此方法将报告错误。因此我通过添加错误异常进行了一些修改。

ValueError:零大小的数组,直到没有身份的最大缩减操作

pval = rho.copy()
for i in range(df.shape[1]): # rows are the number of rows in the matrix.
    for j in range(df.shape[1]):
        try:
            df_ols = pd.ols(y=df.iloc[:,i], x=df.iloc[:,j], intercept=True)
            pval.iloc[i,j]  = df_ols.f_stat['p-value']
        except ValueError:
            pval.iloc[i,j]  = None

pval
        A        B            C           D
A   0.000000    NaN         0.582343    0.973761
B   NaN         0.000000    0.666667    NaN
C   0.582343    0.666667    0.000000    0.011129
D   0.973761    NaN         0.011129    0.000000
Run Code Online (Sandbox Code Playgroud)

此方法输出一个p值矩阵,但是当原始数据帧的大小增加时(我的实际数据帧为〜5000行x 500列),它会变得非常慢。您将建议如何针对大型数据帧有效地获取此p值矩阵。

ju.*_*ju. 3

这个问题被证明是一个很好的解决方案。