Ich habe den folgenden Pandas-Datenrahmen Top15
:
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:
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 NaN
s 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 .
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
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'])
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')])
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.
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.
Meine Lösung wäre nach dem Konvertieren von Daten in einen numerischen Typ:
Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()