wake-up-neo.net

Verwenden Sie .corr, um die Korrelation zwischen zwei Spalten zu ermitteln

Ich habe den folgenden Pandas-Datenrahmen Top15: enter image description here

Ich erstelle eine Spalte, in der die Anzahl der zitierbaren Dokumente pro Person geschätzt wird:

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

Ich möchte den Zusammenhang zwischen der Anzahl zitierfähiger Dokumente pro Kopf und der Energieversorgung pro Kopf kennen. Also benutze ich die .corr() Methode (Pearson's Korrelation):

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

Ich möchte eine einzelne Zahl zurückgeben, aber das Ergebnis lautet: enter image description here

67
tong zhu

Ohne tatsächliche Daten ist es schwierig, die Frage zu beantworten, aber ich denke, Sie suchen nach etwas wie diesem:

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

Dadurch wird die Korrelation zwischen den beiden Spalten 'Citable docs per Capita' und 'Energy Supply per Capita' berechnet.

Um ein Beispiel zu geben:

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

Dann

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

gibt 1 wie erwartet.

Wenn Sie jetzt einen Wert ändern, z.

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

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

der Befehl 

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

kehrt zurück

0.99586

was immer noch nahe an 1 liegt, wie erwartet.

Wenn Sie .corr direkt auf Ihr Dataframe anwenden, werden alle paarweisen Korrelationen zwischen Ihren Spalten zurückgegeben. Daher beobachten Sie 1s an der Diagonale Ihrer Matrix (jede Spalte ist perfekt mit sich selbst korreliert).

df.corr()

wird deshalb zurückkehren

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

In der Grafik, die Sie anzeigen, wird nur die obere linke Ecke der Korrelationsmatrix dargestellt (ich nehme an).

Es kann Fälle geben, in denen Sie NaNs in Ihrer Lösung erhalten - check this post für ein Beispiel.

Wenn Sie Einträge oberhalb/unterhalb eines bestimmten Schwellenwerts filtern möchten, können Sie diese Frage ..__ überprüfen. Wenn Sie eine Heatmap der Korrelationskoeffizienten zeichnen möchten, können Sie diese Antwort und wenn Sie möchten dann in die Ausgabe mit überlappenden Achs-Labels einchecken den folgenden Beitrag .

122
Cleb

Ich bin auf dasselbe Problem gestoßen ... Citable Documents per Person war ein Float, und Python überspringt es irgendwie standardmäßig. Alle anderen Spalten meines Dataframes waren in Numpy-Formaten. Daher löste ich es, indem ich die Spalte in np.float64 konvertierte.

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

Denken Sie daran, es ist genau die Spalte, die Sie selbst berechnet haben

6
Gary

Es funktioniert so:

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'])
1
Orca

Wenn Sie die Korrelationen zwischen allen Spaltenpaaren wünschen, können Sie Folgendes tun:

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')])
1
mgoldwasser

Ich habe dieses Problem durch Ändern des Datentyps gelöst. Wenn Sie sehen, dass 'Energieversorgung pro Kopf' ein numerischer Typ ist, während 'Citable docs pro Kopf' ein Objekttyp ist. Ich habe die Spalte mithilfe von astype in float konvertiert. Ich hatte das gleiche Problem mit einigen np-Funktionen: count_nonzero und sum funktionierten, während mean und std nicht funktionierten.

0
BID

Wenn Sie das anrufen:

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

Da die DataFrame.corr () - Funktion paarweise Korrelationen durchführt, haben Sie vier Paare aus zwei Variablen. Im Grunde erhalten Sie diagonale Werte als Autokorrelation (Korrelation mit sich selbst, zwei Werte, da Sie zwei Variablen haben) und zwei andere Werte als Kreuzkorrelationen von einem zum anderen und umgekehrt. 

Führen Sie entweder eine Korrelation zwischen zwei Serien durch, um einen einzelnen Wert zu erhalten:

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)

oder , wenn Sie einen einzelnen Wert von derselben Funktion wünschen (DataFrame's corr):

single_value = correlation[0][1] 

Hoffe das hilft.

0
aumpen

Meine Lösung wäre nach dem Konvertieren von Daten in einen numerischen Typ:

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