J'ai le dataframe pandas suivant Top15
:
Je crée une colonne qui estime le nombre de documents pouvant être cités par personne:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Je veux connaître la corrélation entre le nombre de documents citables par habitant et l'approvisionnement énergétique par habitant. J'utilise donc la .corr()
méthode (corrélation de Pearson):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Je souhaite renvoyer un seul numéro, mais le résultat est:
python
pandas
correlation
tong zhu
la source
la source
.corr
directement à votre dataframe, il renverra toutes les corrélations par paires; c'est pourquoi vous observez alors des 1 à la diagonale de votre matrice (chaque colonne est parfaitement corrélée avec elle-même). Voir ma modification ci-dessous.Réponses:
Sans données réelles, il est difficile de répondre à la question, mais je suppose que vous cherchez quelque chose comme ceci:
Cela calcule la corrélation entre vos deux colonnes
'Citable docs per Capita'
et'Energy Supply per Capita'
.Pour donner un exemple:
ensuite
donne
1
comme prévu.Maintenant, si vous modifiez une valeur, par exemple
la commande
Retour
qui est toujours proche de 1, comme prévu.
Si vous appliquez
.corr
directement à votre dataframe, il renverra toutes les corrélations par paires entre vos colonnes ; c'est pourquoi vous observez ensuite1s
en diagonale de votre matrice (chaque colonne est parfaitement corrélée avec elle-même).reviendra donc
Dans le graphique que vous montrez, seul le coin supérieur gauche de la matrice de corrélation est représenté (je suppose).
Il peut y avoir des cas où vous obtenez des
NaN
s dans votre solution - consultez cet article pour un exemple.Si vous souhaitez filtrer les entrées au-dessus / en dessous d'un certain seuil, vous pouvez cocher cette question . Si vous souhaitez tracer une carte thermique des coefficients de corrélation, vous pouvez vérifier cette réponse et si vous rencontrez ensuite le problème avec des étiquettes d'axes qui se chevauchent, consultez l'article suivant .
la source
df.loc[1, :].corr(df.loc[2, :])
fonctionnera bien aussi. Pour l'ensemble dataframe, vous pouvez simplement transposer:df.T.corr()
.1
dans votre cas au lieu de0.99586
?J'ai rencontré le même problème. Il est apparu qu'il
Citable Documents per Person
s'agissait d'un flottant, et python l'ignore d'une manière ou d'une autre par défaut. Toutes les autres colonnes de mon dataframe étaient au format numpy, donc je l'ai résolu en convertissant le columnt ennp.float64
N'oubliez pas que c'est exactement la colonne que vous avez calculée vous-même
la source
Ma solution serait après la conversion des données en type numérique:
la source
Si vous voulez les corrélations entre toutes les paires de colonnes, vous pouvez faire quelque chose comme ceci:
la source
Lorsque vous appelez ceci:
Puisque la fonction DataFrame.corr () effectue des corrélations par paire, vous avez quatre paires de deux variables. Donc, fondamentalement, vous obtenez des valeurs diagonales comme corrélation automatique (corrélation avec elle-même, deux valeurs puisque vous avez deux variables), et deux autres valeurs comme corrélations croisées entre l'une et l'autre et vice versa.
Soit effectuer une corrélation entre deux séries pour obtenir une valeur unique:
ou, si vous voulez une seule valeur de la même fonction (corr de DataFrame):
J'espère que cela t'aides.
la source
Cela fonctionne comme ceci:
la source
J'ai résolu ce problème en modifiant le type de données. Si vous voyez que «L'approvisionnement en énergie par habitant» est un type numérique, tandis que «Documents à citer par habitant» est un type d'objet. J'ai converti la colonne en float en utilisant un type. J'ai eu le même problème avec certaines fonctions np:
count_nonzero
et j'aisum
travaillé pendantmean
et je ne l'std
ai pas fait.la source
changer les «documents pouvant être cités par habitant» en numérique avant que la corrélation ne résout le problème.
la source