2016-10-07 3 views
0

두 팬더 시리즈 간의 상관 관계를 계산하려고합니다. dtypes 확인하고이 보이는 경우 pandas df.corr() returns NaN despite data fed having populated data 내가 확인pandas.Series.corr이 num을 반환하는 반면 numpy 또는 scipy가 숫자를 계산하는 이유는 무엇입니까?

s = xfarines["400"] 
s.corr(yfarines["PROTREF"]) 


nan 

이 질문에 상대 :

scipy.stats.pearsonr(xfarines["400"].values, yfarines["PROTREF"].values) 


(0.71564870605278108, 2.9185934338775347e-23) 


pd.np.corrcoef(xfarines["400"].values, yfarines["PROTREF"].values) 


array([[ 1.  , 0.71564871], 
    [ 0.71564871, 1.  ]]) 

하지만이 팬더 무엇을 나에게 준다 : 나는 NumPy와 나 scipy에서 무엇을 얻을입니다 그것은 :

s.describe() 

count 140.000000 
mean  0.304078 
std  0.057225 
min  0.197300 
25%  0.250300 
50%  0.318500 
75%  0.346850 
max  0.408600 
Name: 400, dtype: float64 


yfarines["PROTREF"].describe() 

count 140.000000 
mean  12.619143 
std  2.547644 
min  7.600000 
25%  10.975000 
50%  12.100000 
75%  14.590000 
max  18.200000 
Name: PROTREF, dtype: float64 

따라서 어디에서 문제가 발생하는지 이해할 수 없습니까?

+0

데이터 프레임의 색인은 무엇입니까? 그들은 정렬되어 있습니까? – JMat

+0

색인을 자세히 살펴 봅니다. 그들은 문자열입니다. 실제로'yfarines'에는 끝에 공백이 여러 개있었습니다. 이 공백을 제거함으로써's.corr'는 numpy 나 scipy와 같은 값을 반환합니다! csv를 읽을 때이 공백을 제거하는 방법이 있습니까? – Ger

+0

[this answer] (http://stackoverflow.com/a/13386025/6904813) 정확히이 작업을 수행합니다. – JMat

답변

0

이상하게도 numpy (v 1.8.0)는 언급했지만 scipy 가져 오기는 다를 수 있습니다. 이 NumPy와는 아마도 최신 버전을 가진 사람들이 그것을 반환 것을 확인할 수 있습니다

>>> a 
array([[ 3.00000000, 0.17157288], 
     [ 3.00000000, 1.58578644], 
     [ 3.00000000, 3.00000000], 
     [ 3.00000000, 4.41421356], 
     [ 3.00000000, 5.82842712]]) 
>>> np.corrcoef(a[:,0], a[:,1],rowvar=0, bias=0, ddof=None) 
array([[ nan, nan], 
     [ nan, 1.00000000]] 

를하는 일이지만, 적어도 수직 라인의 포인트 주어진 것입니다. 가로줄을 얻으려면

>>> b = np.array([a[:,1],a[:,0]]).T 
>>> b 
array([[ 0.17157288, 3.00000000], 
     [ 1.58578644, 3.00000000], 
     [ 3.00000000, 3.00000000], 
     [ 4.41421356, 3.00000000], 
     [ 5.82842712, 3.00000000]]) 
>>> np.corrcoef(b[:,0], b[:,1],rowvar=0, bias=0, ddof=None) 
array([[ 1.00000000, nan], 
     [ nan, nan]])