Mam następującą ramkę danych pandy Top15
:
Tworzę kolumnę, która szacuje liczbę cytowanych dokumentów na osobę:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Chcę poznać korelację między liczbą cytowanych dokumentów na mieszkańca a podażą energii na mieszkańca. Więc używam .corr()
metody (korelacja Pearsona):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Chcę zwrócić jedną liczbę, ale wynik jest taki:
python
pandas
correlation
tong zhu
źródło
źródło
.corr
bezpośrednio do swojej ramki danych, zwróci ona wszystkie korelacje parami; dlatego następnie obserwujesz jedynki na przekątnej swojej macierzy (każda kolumna jest ze sobą doskonale skorelowana). Zobacz moją edycję poniżej.Odpowiedzi:
Bez faktycznych danych trudno odpowiedzieć na pytanie, ale myślę, że szukasz czegoś takiego:
To oblicza korelację między twoimi dwiema kolumnami
'Citable docs per Capita'
i'Energy Supply per Capita'
.Dać przykład:
Następnie
daje
1
zgodnie z oczekiwaniami.Teraz, jeśli zmienisz wartość, np
Komenda
zwroty
która nadal jest bliska 1, zgodnie z oczekiwaniami.
Jeśli zastosujesz się
.corr
bezpośrednio do swojej ramki danych, zwróci ona wszystkie korelacje parami między kolumnami ; dlatego obserwujesz następnie1s
przekątną swojej macierzy (każda kolumna jest ze sobą doskonale skorelowana).dlatego powróci
Na przedstawionej grafice przedstawiony jest tylko lewy górny róg macierzy korelacji (zakładam).
Mogą wystąpić przypadki, w których otrzymasz
NaN
s w swoim rozwiązaniu - sprawdź przykład w tym poście .Jeśli chcesz filtrować wpisy powyżej / poniżej określonego progu, możesz sprawdzić to pytanie . Jeśli chcesz wykreślić mapę cieplną współczynników korelacji, możesz sprawdzić tę odpowiedź, a jeśli następnie napotkasz problem z nakładającymi się etykietami osi, sprawdź następujący post .
źródło
df.loc[1, :].corr(df.loc[2, :])
będzie działać dobrze. Przez cały dataframe, można po prostu transpozycji:df.T.corr()
.1
w twoim przypadku wraca zamiast0.99586
?Napotkałem ten sam problem. Wyglądało na
Citable Documents per Person
to, że jest to float, a Python jakoś domyślnie go pomija. Wszystkie inne kolumny mojej ramki danych były w formacie numpy, więc rozwiązałem to, konwertując kolumnę nanp.float64
Pamiętaj, że to dokładnie ta kolumna, którą sam obliczyłeś
źródło
Moje rozwiązanie byłoby po konwersji danych na typ liczbowy:
źródło
Jeśli chcesz uzyskać korelacje między wszystkimi parami kolumn, możesz zrobić coś takiego:
źródło
Kiedy nazywasz to:
Ponieważ funkcja DataFrame.corr () wykonuje korelacje parami, masz cztery pary z dwóch zmiennych. Tak więc, zasadniczo otrzymujesz wartości przekątne jako autokorelację (korelacja ze sobą, dwie wartości, ponieważ masz dwie zmienne), a pozostałe dwie wartości jako korelacje krzyżowe między sobą i odwrotnie.
Aby uzyskać jedną wartość, wykonaj korelację między dwiema seriami:
lub, jeśli chcesz pojedynczą wartość z tej samej funkcji (Corr DataFrame):
Mam nadzieję że to pomoże.
źródło
Działa to tak:
źródło
Rozwiązałem ten problem, zmieniając typ danych. Jeśli zobaczysz, że „Dostarczanie energii na mieszkańca” jest typem liczbowym, a „Dokumenty do cytowania na mieszkańca” to typ obiektu. Przekonwertowałem kolumnę na zmiennoprzecinkową przy użyciu astype. Miałem ten sam problem z niektórymi funkcjami np:
count_nonzero
isum
pracowałem podczas,mean
astd
nie.źródło
zmiana „Citable docs per capita” na numeryczne, zanim korelacja rozwiąże problem.
źródło