Ich habe den folgenden Pandas-Datenrahmen "Top15":
Ich erstelle eine Spalte, die die Anzahl der zitierfähigen Dokumente pro Person schätzt:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Ich möchte die Korrelation zwischen der Anzahl der zitierfähigen Dokumente pro Kopf und der Energieversorgung pro Kopf ermitteln. Dazu verwende ich die Methode .corr()
(Pearson's correlation):
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 ist:
Ohne konkrete Daten ist es schwer, die Frage zu beantworten, aber ich vermute, dass Sie nach etwas Ähnlichem suchen:
Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])
Das berechnet die Korrelation zwischen Ihren beiden Spalten 'Zitierbare Dokumente pro Kopf'
und 'Energieversorgung pro Kopf'
.
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'])
wie erwartet 1
ergeben.
Wenn Sie nun einen Wert ändern, z.B.
df.loc[2, 'B'] = 4.5
A B
0 0 0.0
1 1 2.0
2 2 4.5
3 3 6.0
wird der Befehl
df['A'].corr(df['B'])
gibt zurück.
0.99586
zurück, was erwartungsgemäß immer noch nahe an 1 liegt.
Wenn Sie .corr
direkt auf Ihren Datenrahmen anwenden, [werden alle paarweisen Korrelationen zwischen Ihren Spalten zurückgegeben] (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html); deshalb beobachten Sie dann 1s
an der Diagonale Ihrer Matrix (jede Spalte ist perfekt mit sich selbst korreliert).
df.corr()
liefert daher
A B
A 1.000000 0.995862
B 0.995862 1.000000
In der von Ihnen gezeigten Grafik ist nur die linke obere Ecke der Korrelationsmatrix dargestellt (nehme ich an).
Es kann Fälle geben, in denen man NaN
in seiner Lösung erhält - siehe [diesen Beitrag] (https://stackoverflow.com/q/52466844/1534017) für ein Beispiel.
Wenn Sie Einträge oberhalb/unterhalb eines bestimmten Schwellenwerts filtern möchten, können Sie diese Frage prüfen. Wenn Sie eine Heatmap der Korrelationskoeffizienten erstellen möchten, können Sie diese Antwort prüfen. Wenn Sie dann auf das Problem der sich überlappenden Achsenbeschriftungen stoßen, prüfen Sie den folgenden Beitrag.
Ich bin auf das gleiche Problem gestoßen. Es stellte sich heraus, dass "Zitierbare Dokumente pro Person" eine Fließkommazahl war und Python diese irgendwie standardmäßig überspringt. Alle anderen Spalten meines Datenrahmens waren im Numpy-Format, also habe ich das Problem gelöst, indem ich die Spalte in "np.float64" konvertiert habe.
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Denken Sie daran, dass es genau die Spalte ist, die Sie selbst berechnet haben
Wenn Sie die Korrelationen zwischen allen Spaltenpaaren haben wollen, können Sie so vorgehen:
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')])