J'ai les pandas dataframe suivants 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 pouvant être cités par habitant et l’offre énergétique par habitant. J'utilise donc la méthode .corr()
(corrélation de Pearson):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Je veux renvoyer un numéro unique, mais le résultat est le suivant:
Sans données réelles, il est difficile de répondre à la question, mais je suppose que vous recherchez quelque chose comme ceci:
Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])
Cela calcule la corrélation entre vos deux colonnes 'Citable docs per Capita'
et 'Energy Supply per Capita'
.
Pour donner un exemple:
import pandas as pd
df = pd.DataFrame({'A': range(4), 'B': [2*i for i in range(4)]})
A B
0 0 0
1 1 2
2 2 4
3 3 6
Ensuite
df['A'].corr(df['B'])
donne 1
comme prévu.
Maintenant, si vous modifiez une valeur, par exemple.
df.loc[2, 'B'] = 4.5
A B
0 0 0.0
1 1 2.0
2 2 4.5
3 3 6.0
la commande
df['A'].corr(df['B'])
résultats
0.99586
qui est toujours proche de 1, comme prévu.
Si vous appliquez .corr
directement à votre image de données, toutes les corrélations par paire entre vos colonnes seront renvoyées. C'est pourquoi vous observez alors 1s
en diagonale de votre matrice (chaque colonne est parfaitement corrélée à elle-même).
df.corr()
reviendra donc
A B
A 1.000000 0.995862
B 0.995862 1.000000
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 NaN
s dans votre solution - consultez this post pour un exemple.
Si vous souhaitez filtrer les entrées supérieures ou inférieures à un certain seuil, vous pouvez vérifier cette question . Si vous souhaitez tracer un diagramme thermique des coefficients de corrélation, vous pouvez vérifier cette réponse et si vous le souhaitez. puis rencontrez le problème avec chevauchement des étiquettes d’axe, vérifiez le post suivant .
J'ai rencontré le même problème… .. Il est apparu que Citable Documents per Person
était un float, et python l'ignore par défaut. Toutes les autres colonnes de mon cadre de données étaient au format numpy, je l’ai donc résolu en convertissant le columnt en np.float64
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Rappelez-vous que c'est exactement la colonne que vous avez calculée vous-même
Cela fonctionne comme ceci:
Top15['Citable docs per Capita']=np.float64(Top15['Citable docs per Capita'])
Top15['Energy Supply per Capita']=np.float64(Top15['Energy Supply per Capita'])
Top15['Energy Supply per Capita'].corr(Top15['Citable docs per Capita'])
Si vous voulez les corrélations entre toutes les paires de colonnes, vous pouvez faire quelque chose comme ceci:
import pandas as pd
import numpy as np
def get_corrs(df):
col_correlations = df.corr()
col_correlations.loc[:, :] = np.tril(col_correlations, k=-1)
cor_pairs = col_correlations.stack()
return cor_pairs.to_dict()
my_corrs = get_corrs(df)
# and the following line to retrieve the single correlation
print(my_corrs[('Citable docs per Capita','Energy Supply per Capita')])
J'ai résolu ce problème en changeant le type de données. Si vous voyez «L'approvisionnement en énergie par habitant» est un type numérique tandis que le «Citable docs par habitant» est un type d'objet. J'ai converti la colonne en float en utilisant astype. J'ai eu le même problème avec certaines fonctions np: count_nonzero
et sum
fonctionnaient alors que mean
et std
ne fonctionnaient pas.
Quand vous appelez ça:
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Depuis, la fonction DataFrame.corr () effectue des corrélations par paires, vous avez quatre paires de deux variables. Donc, fondamentalement, vous obtenez des valeurs diagonales sous forme de corrélation automatique (corrélation avec lui-même, deux valeurs puisque vous avez deux variables), et deux autres valeurs sous forme de corrélations croisées de l'un par rapport à l'autre et inversement.
Effectuez une corrélation entre deux séries pour obtenir une seule valeur:
from scipy.stats.stats import pearsonr
docs_col = Top15['Citable docs per Capita'].values
energy_col = Top15['Energy Supply per Capita'].values
corr , _ = pearsonr(docs_col, energy_col)
ou, si vous voulez une seule valeur de la même fonction (corr de DataFrame):
single_value = correlation[0][1]
J'espère que cela t'aides.
Ma solution serait après la conversion des données en type numérique:
Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()