web-dev-qa-db-fra.com

Corrélation de Pearson et valeurs nan

J'ai deux fichiers CSV avec des centaines de colonnes et je souhaite calculer le coefficient de corrélation de Pearson et la valeur p pour chaque colonne identique de deux fichiers CSV. Le problème est que quand il manque une donnée "NaN" dans une colonne, cela me donne une erreur. Lorsque ".dropna" supprime la valeur nan des colonnes, il arrive parfois que les formes de X et Y ne soient pas égales (en fonction des valeurs nan supprimées) et je reçois cette erreur:

"ValueError: impossible de diffuser les opérandes avec des formes (1020,) (1016,)"

Question: Si la rangée 8 d'un csv dans "nan", existe-t-il un moyen de supprimer la même rangée de l'autre csv et d'effectuer l'analyse pour chaque colonne en fonction des rangées contenant les valeurs des deux fichiers csv?

import pandas as pd
import scipy
import csv
import numpy as np
from scipy import stats


df = pd.read_csv ("D:/Insitu-Daily.csv",header = None)
dg = pd.read_csv ("D:/Model-Daily.csv",header = None)

pearson_corr_set = []
pearson_p_set = []


for i in range(1,df.shape[1]):
    X= df[i].dropna(axis=0, how='any')
    Y= dg[i].dropna(axis=0, how='any')

    [pearson_corr, pearson_p] = scipy.stats.stats.pearsonr(X, Y)
    pearson_corr_set = np.append(pearson_corr_set,pearson_corr)
    pearson_p_set = np.append(pearson_p_set,pearson_p)

with open('D:/Results.csv','wb') as file:
    str1 = ",".join(str(i) for i in np.asarray(pearson_corr_set))
    file.write(str1)
    file.write('\n')    
    str1 = ",".join(str(i) for i in np.asarray(pearson_p_set))
    file.write(str1)
    file.write('\n') 
5
Amy

Voici une solution. Commencez par calculer les "mauvais" indices pour vos 2 tableaux numpy. Puis masquez pour ignorer ces mauvais index.

x = np.array([5, 1, 6, 9, 10, np.nan, 1, 1, np.nan])
y = np.array([4, 4, 5, np.nan, 6, 2, 1, 8, 1])

bad = ~np.logical_or(np.isnan(x), np.isnan(y))

np.compress(bad, x)  # array([  5.,   1.,   6.,  10.,   1.,   1.])
np.compress(bad, y)  # array([ 4.,  4.,  5.,  6.,  1.,  8.])
5
jpp

Au lieu de dropna, essayez d’utiliser l’indexation isnan et boolean:

for i in range(1, df.shape[1]):
    df_sub = df[i]
    dg_sub = dg[i]
    mask = ~np.isnan(df_sub) & ~np.isnan(dg_sub)  
    # mask array is now true where ith rows of df and dg are NOT nan.
    X = df_sub[mask]  # this returns a 1D array of length mask.sum()
    Y = df_sub[mask]
    ... your code continues.

J'espère que cela pourra aider!

1
c-wilson