Ik heb het volgende pandas dataframe Top15
:
Ik maak een kolom die een schatting geeft van het aantal citeerbare documenten per persoon:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Ik wil de correlatie weten tussen het aantal citeerbare documenten per inwoner en de energievoorziening per inwoner. Daarom gebruik ik de .corr()
methode (Pearson's correlatie):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Ik wil een enkel getal teruggeven, maar het resultaat is:
Zonder concrete gegevens is het moeilijk de vraag te beantwoorden, maar ik vermoed dat u naar iets als het volgende op zoek bent:
Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])
Dat berekent de correlatie tussen uw twee kolommen 'Citable docs per Capita'
en 'Energy Supply per Capita'
.
Om een voorbeeld te geven:
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
Dan
df['A'].corr(df['B'])
geeft 1
zoals verwacht.
Nu, als je een waarde verandert, bijv.
df.loc[2, 'B'] = 4.5
A B
0 0 0.0
1 1 2.0
2 2 4.5
3 3 6.0
zal het commando
df['A'].corr(df['B'])
geeft
0.99586
wat nog steeds dicht bij 1 is, zoals verwacht.
Als je .corr
rechtstreeks op je dataframe toepast, zal het alle paarsgewijze correlaties tussen je kolommen teruggeven; dat'is waarom je dan 1s
op de diagonaal van je matrix ziet (elke kolom is perfect gecorreleerd met zichzelf).
df.corr()
zal daarom teruggeven
A B
A 1.000000 0.995862
B 0.995862 1.000000
In de grafiek die je laat zien, wordt alleen de linkerbovenhoek van de correlatiematrix weergegeven (neem ik aan).
Er kunnen gevallen zijn, waarin je NaN
krijgt in je oplossing - kijk naar deze post voor een voorbeeld.
Als je items boven/onder een bepaalde drempel wilt filteren, kun je deze vraag bekijken. Als u een heatmap van de correlatiecoëfficiënten wilt plotten, kunt u dit antwoord controleren en als u dan tegen het probleem van overlappende aslabels aanloopt, controleer dan het volgende bericht.
Ik kwam hetzelfde probleem tegen.
Het bleek dat Citable Documents per Person
een float was, en python sloeg dat standaard over. Alle andere kolommen van mijn dataframe waren in numpy-formaten, dus ik heb het opgelost door de kolom om te zetten naar np.float64
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Onthoud dat het'precies de kolom is die je zelf hebt berekend
Als u de correlaties tussen alle paren kolommen wilt, kunt u iets als dit doen:
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')])