Za pridobitev korelacije med dvema stolpcema uporabite .corr

Imam naslednji pandas dataframe Top15: tukaj vpišite opis slike

Ustvarim stolpec, ki ocenjuje število citirljivih dokumentov na osebo:

Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']

Zanima me povezanost med številom citirljivih dokumentov na prebivalca in oskrbo z energijo na prebivalca. Zato uporabim metodo .corr() (Pearsonova korelacija):

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

Želel bi vrniti eno samo število, vendar je rezultat:

Rešitev

Brez dejanskih podatkov je težko odgovoriti na vprašanje, vendar domnevam, da iščete nekaj takega:

Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])

To izračuna korelacijo med vašima stolpcema 'Citable docs per Capita' in 'Energy Supply per Capita'.

Na primer:

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

Potem

df['A'].corr(df['B'])

daje 1, kot je bilo pričakovano.

Če spremenite vrednost, npr.

df.loc[2, 'B'] = 4.5

   A    B
0  0  0.0
1  1  2.0
2  2  4.5
3  3  6.0

se v ukazu

df['A'].corr(df['B'])

vrne

0.99586

kar je po pričakovanjih še vedno blizu 1.

Če uporabite .corr neposredno na svoj podatkovni okvir, bo vrnil vse parne korelacije med vašimi stolpci; zato na diagonali matrike opazite 1 (vsak stolpec je popolnoma koreliran sam s seboj).

df.corr()

bo zato vrnil

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

Na grafikonu, ki ga prikazujete, je predstavljen le zgornji levi vogal korelacijske matrike (predvidevam).

Lahko se zgodi, da se v vaši rešitvi pojavi NaNs - za primer si oglejte ta prispevek.

Če želite filtrirati vnose nad/pod določenim pragom, lahko preverite to vprašanje. Če želite izrisati toplotno karto korelacijskih koeficientov, lahko preverite ta odgovor, če pa nato naletite na težavo s prekrivanjem oznak osi, preverite naslednji prispevek.

Komentarji (13)

Naletel sem na isto težavo. Izkazalo se je, da je Citable Documents per Person spremenljivka, ki jo python privzeto preskoči. Vsi drugi stolpci mojega podatkovnega okvira so bili v numeričnih formatih, zato sem to rešil s pretvorbo stolpca v np.float64.

Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])

Zapomni si, da je to natanko tisti stolpec, ki si ga izračunal sam

Komentarji (0)

Če želite korelacije med vsemi pari stolpcev, lahko naredite nekaj takega:

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')])
Komentarji (0)