2017-08-03 1 views
1

Je cherche de l'aide avec la méthode Pandas .corr().Corrélation Pandas entre la liste des colonnes X Dataframe entière

Comme, je peux utiliser la méthode .corr() pour calculer un heatmap de toutes les combinaisons possibles de colonnes:

corr = data.corr() 
sns.heatmap(corr) 

qui, sur mon dataframe de 23.000 colonnes, peut mettre fin à près de la mort thermique de l'univers.

Je peux aussi faire plus de corrélation raisonnable entre un sous-ensemble de valeurs

data2 = data[list_of_column_names] 
corr = data2.corr(method="pearson") 
sns.heatmap(corr) 

Cela me donne quelque chose que je peux utiliser - est ici un exemple de ce qui ressemble à: Example Heatmap

Qu'est-ce que Je voudrais faire est de comparer une liste de 20 colonnes avec l'ensemble des données. La fonction normale .corr() peut me donner une carte de chaleur de 20x20 ou 23000x23,000, mais je voudrais essentiellement une carte de chaleur de 20x23,000.

Comment puis-je ajouter plus de spécificité à mes corrélations?

Merci pour l'aide!

Répondre

0

Après avoir travaillé hier soir, je suis venu à la réponse suivante:

#datatable imported earlier as 'data' 
#Create a new dictionary 
plotDict = {} 
# Loop across each of the two lists that contain the items you want to compare 
for gene1 in list_1: 
    for gene2 in list_2: 
     # Do a pearsonR comparison between the two items you want to compare 
     tempDict = {(gene1, gene2): scipy.stats.pearsonr(data[gene1],data[gene2])} 
     # Update the dictionary each time you do a comparison 
     plotDict.update(tempDict) 
# Unstack the dictionary into a DataFrame 
dfOutput = pd.Series(plotDict).unstack() 
# Optional: Take just the pearsonR value out of the output tuple 
dfOutputPearson = dfOutput.apply(lambda x: x.apply(lambda x:x[0])) 
# Optional: generate a heatmap 
sns.heatmap(dfOutputPearson) 

Tout comme les autres réponses, cela génère un heatmap (voir ci-dessous) mais il peut être mis à l'échelle pour permettre une 20,000x30 matrice sans calculer la corrélation entre les 20 000 x 20 000 combinaisons (et donc se terminer beaucoup plus rapidement).

HeatMap Final

0

Faites une liste du sous-ensemble que vous voulez (dans cet exemple, c'est A, B et C), créez une image vide, puis remplissez-la avec les valeurs souhaitées en utilisant une boucle imbriquée.

df = pd.DataFrame(np.random.randn(50, 7), columns=list('ABCDEFG')) 

# initiate empty dataframe 
corr = pd.DataFrame() 
for a in list('ABC'): 
    for b in list(df.columns.values): 
     corr.loc[a, b] = df.corr().loc[a, b] 

corr 
Out[137]: 
      A   B   C   D   E   F   G 
A 1.000000 0.183584 -0.175979 -0.087252 -0.060680 -0.209692 -0.294573 
B 0.183584 1.000000 0.119418 0.254775 -0.131564 -0.226491 -0.202978 
C -0.175979 0.119418 1.000000 0.146807 -0.045952 -0.037082 -0.204993 

sns.heatmap(corr) 

enter image description here

+0

Merci pour le commentaire utile! Cela semble fonctionner en théorie. En pratique, il semble que 'corr = data.corr(). Iloc [3: 5,1: 2]', ce qui devrait être une corrélation relativement simple, prend beaucoup de temps à se terminer (il ne l'a pas fait après environ 5 minutes jusqu'à présent).Je suppose que c'est parce que .corr() calcule d'abord la corrélation entre toutes mes 23 000 lignes, puis trancher. – CalendarJ

+0

ok. Je vais modifier pour montrer comment faire cela. – Andrew

+0

Si les nouvelles modifications résolvent votre problème, veuillez accepter cette réponse. – Andrew

0

En général, le calcul des coefficients de corrélation par paire pour toutes les variables font plus de sens. pd.corr() est la fonction de commodité pour calculer le coefficient de corrélation par paires (et pour toutes les paires). Vous pouvez le faire avec scipy aussi seulement pour les paires spécifiées dans une boucle.

Exemple:

d=pd.DataFrame([[1,5,8],[2,5,4],[7,3,1]], columns=['A','B','C']) 

Une paire de pandas géants pourrait être:

d.corr().loc['A','B'] 

-0,98782916114726194

équivalent en scipy:

import scipy.stats 
scipy.stats.pearsonr(d['A'].values,d['B'].values)[0] 

-0,98782916114726194