Mám nasledujúci pandas dataframe Top15
:
tu zadajte popis obrázka
Vytvorím stĺpec, ktorý odhaduje počet citovateľných dokumentov na osobu:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Chcem zistiť koreláciu medzi počtom citovateľných dokumentov na obyvateľa a zásobou energie na obyvateľa. Preto použijem metódu .corr()
(Pearsonova korelácia):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Chcem vrátiť jedno číslo, ale výsledok je:
Bez skutočných údajov je ťažké odpovedať na otázku, ale predpokladám, že hľadáte niečo podobné:
Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])
To vypočíta koreláciu medzi vašimi dvoma stĺpcami 'Citable docs per Capita'
a 'Energy Supply per Capita'
.
Uvedieme príklad:
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
Potom
df['A'].corr(df['B'])
dáva podľa očakávania hodnotu 1
.
Ak teraz zmeníte hodnotu, napr.
df.loc[2, 'B'] = 4.5
A B
0 0 0.0
1 1 2.0
2 2 4.5
3 3 6.0
príkaz
df['A'].corr(df['B'])
vráti
0.99586
čo je podľa očakávania stále blízko 1.
Ak použijete .corr
priamo na váš dátový rámec, vráti všetky párové korelácie medzi vašimi stĺpcami; preto potom pozorujete 1
na diagonále vašej matice (každý stĺpec je dokonale korelovaný sám so sebou).
df.corr()
preto vráti
A B
A 1.000000 0.995862
B 0.995862 1.000000
V grafe, ktorý ukazujete, je znázornený len ľavý horný roh korelačnej matice (predpokladám).
Môžu nastať prípady, keď v riešení dostanete NaN
- pozrite si príklad tento príspevok.
Ak chcete vyfiltrovať položky nad/pod určitou hranicou, môžete si pozrieť túto otázku. Ak chcete vykresliť tepelnú mapu korelačných koeficientov, môžete si pozrieť túto odpoveď a ak potom narazíte na problém s prekrývajúcimi sa značkami osí, pozrite si nasledujúci príspevok.
Narazil som na rovnaký problém.
Zdalo sa, že Citable Documents per Person
je float a python ho nejako štandardne vynecháva. Všetky ostatné stĺpce môjho dataframe boli v numpy-formátoch, takže som to vyriešil konverziou stĺpca na np.float64
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Nezabudnite, že je to presne ten stĺpec, ktorý ste si vypočítali sami
Ak chcete získať korelácie medzi všetkými dvojicami stĺpcov, môžete postupovať takto:
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')])