Como obter com eficiência a matriz de correlação (com valores-p) de um quadro de dados com valores de NaN?

Estou tentando calcular uma matriz de correlação e filtrar as correlações com base nos valores de p para descobrir os pares altamente correlacionados.

Para explicar o que quero dizer, diga que tenho um quadro de dados como este.

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

Para o coeficiente de correlação. Eu usei pd.corr (). Esse método pode processar o quadro de dados com valores de NaN e, mais importante, tolera o par de colunas com 0 sobreposição (col A e col 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

O desafio é calcular o valor-p. Não encontrei um método interno para fazer isso. No entanto decorrelação das colunas pandas com significância estatística, @BKay forneceu uma maneira de loop para calcular o valor p. Este método irá reclamar de erro se houver menos de 3 sobreposições. Então, fiz algumas modificações adicionando uma exceção de erro.

ValueError: matriz de tamanho zero para operação máxima de redução que não possui identidade

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

Esse método gera uma matriz de valor p, mas fica extremamente lento quando o tamanho do quadro de dados original aumenta (meu quadro de dados real é de ~ 5000 linhas x 500 colunas). O que você sugeriria fazer para obter essa matriz de valor-p de maneira eficiente para um quadro de dados de tamanho grande.

questionAnswers(0)

yourAnswerToTheQuestion