2017-03-03 16 views
20

Mam następujący pandy dataframe Top15: enter image description hereZastosowanie .corr uzyskać korelację pomiędzy dwoma kolumnami

utworzyć kolumnę, która szacuje ilość cytowany dokumentów za osobę:

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

I chcą poznać korelację między liczbą dokumentów na mieszkańca na mieszkańca a dostawą energii na mieszkańca. Więc używam metody .corr() (korelacja Pearsona):

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

chcę wrócić jeden numer, ale wynik jest: enter image description here

Czy ktoś może mi pomóc?

+0

Myślę, że masz rację. Ale czy możesz mi powiedzieć, dlaczego "data.corr (method = 'pearson')" zwraca tylko związek między dostawą energii a energią suppy? –

+0

Nie ma. Powinien zwrócić ci macierz 2x2; pokazujesz jej lewy górny wpis. Jeśli zastosujesz '.corr' bezpośrednio do swojej ramki danych, zwróci ona wszystkie korelacje parami; dlatego obserwujesz 1s na przekątnej swojej matrycy (każda kolumna jest doskonale skorelowana z samą sobą). Zobacz moją edycję poniżej. – Cleb

+1

Proszę rozważyć [akceptowanie] (http://meta.stackexchange.com/a/5235) odpowiedzi, jeśli uważasz, że odpowiedziała na twoje pytanie – MaxU

Odpowiedz

36

Bez rzeczywistych danych trudno jest odpowiedzieć na pytanie, ale myślę, że szukasz czegoś takiego:

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

To daje korelację pomiędzy swoimi dwoma kolumnami.

przykład:

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 

Następnie

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

daje 1 prawidłowo.

Teraz, jeśli zmienisz wartość, np.

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

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

polecenie

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

powraca

0.99586 

która jest jednocześnie w pobliżu 1, zgodnie z oczekiwaniami.

Jeśli zastosujesz .corr bezpośrednio do swojej ramki danych, zwróci ona wszystkie parujące korelacje między kolumnami; dlatego też obserwujesz 1s na przekątnej swojej matrycy (każda kolumna jest doskonale skorelowana z samą sobą).

df.corr() 

będzie zatem powrót

  A   B 
A 1.000000 0.995862 
B 0.995862 1.000000 

W grafice Ci pokazać, tylko w lewym górnym rogu macierzy korelacji jest reprezentowana (zakładam).

Jeśli chcesz filtrować wpisy powyżej/poniżej pewnego progu, możesz sprawdzić this question. Jeśli chcesz wykreślić mapę cieplną współczynników korelacji, możesz sprawdzić this answer, a następnie, gdy napotkasz problem z nakładającymi się etykietami osi, sprawdź the following post.

5

Wpadłem na ten sam problem. Okazało się, że Citable Documents per Person był zmiennoprzecinkowy, a python pomija go jakoś domyślnie.Wszystkie pozostałe kolumny moim dataframe były NumPy formatach, więc rozwiązać go poprzez przekształcenie columnt do np.float64

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

Pamiętaj, że to właśnie kolumnę, którą oblicza sobie

1

Jeśli chcesz korelacje pomiędzy wszystkimi parami kolumn, możesz zrobić coś takiego:

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

Rozwiązałem ten problem, zmieniając typ danych. Jeśli zobaczysz, że "Podaż energii na mieszkańca" jest typem liczbowym, "Dokumenty na mieszkańca na mieszkańca" to typ obiektu. Przekształciłem kolumnę, aby unosiła się przy użyciu astmy. Miałem ten sam problem z niektórymi funkcjami np: count_nonzero i sum działało, podczas gdy mean i std nie.

Powiązane problemy