2014-09-04 1 views
6

2 개의 인수가 필요한 수식과 함께 rollapply를 사용하려고합니다. , 켄달의 타우 상관 관계를 계산 표준 넥타이 보정 포함으로하는 (당신이 처음부터 수식을 만들 경우 제외) 내 지식 유일한 방법에 :Pandas에서 2 개의 인수가 필요한 함수로 rolling_apply 사용

>>> import scipy 
>>> x = [5.05, 6.75, 3.21, 2.66] 
>>> y = [1.65, 26.5, -5.93, 7.96] 
>>> z = [1.65, 2.64, 2.64, 6.95] 
>>> print scipy.stats.stats.kendalltau(x, y)[0] 
0.333333333333 

나는 또한 rollapply 두 개의 인수를 복용 문제를 알고 있어요 여기에 설명 된대로 :

여전히 여러 개의 열이있는 데이터 프레임에서 kendalltau 계산을 수행하는 방법을 찾기 위해 고심하고 있습니다.

:

내 dataframe이

A = pd.DataFrame([[1, 5, 1], [2, 4, 1], [3, 3, 1], [4, 2, 1], [5, 1, 1]], 
       columns=['A', 'B', 'C'], index = [1, 2, 3, 4, 5]) 

같은 내가 이런 식으로 함수를 정의의 아이디어를 즐겁게 매우 예비적인 접근 방법이

In [1]:function(A, 3) # A is df, 3 is the rolling window 
Out[2]: 
    A B C  AB  AC  BC 
1 1 5 2 NaN NaN NaN 
2 2 4 4 NaN NaN NaN 
3 3 3 1 -0.99 -0.33 0.33 
4 4 2 2 -0.99 -0.33 0.33 
5 5 1 4 -0.99 0.99 -0.99 

을 수행하는 함수를 작성하려고

def tau1(x): 
    y = np.array(A['A']) # keep one column fix and run it in the other two 
    tau, p_value = sp.stats.kendalltau(x, y) 
    return tau 

A['AB'] = pd.rolling_apply(A['B'], 3, lambda x: tau1(x)) 

물론 벗어났습니다. 작동하지 않았습니다. 내가 가지고있어 :

ValueError: all keys need to be the same shape 

나는 이해한다. 사소한 문제는 아니다. 나는 어떤 의견을 주셔서 감사합니다.

답변

5

As of Pandas 0.14, rolling_apply은 함수에 NumPy 배열 만 전달합니다. 가능한 해결 방법은 첫 번째 인수로 np.arange(len(A))rolling_apply에 전달하여 tau 함수가 의 인덱스을 사용하려는 것입니다. 그런 다음 tau 함수 내에서,

B = A[[col1, col2]].iloc[idx] 

필요한 모든 행을 포함하는 DataFrame을 반환합니다.
import numpy as np 
import pandas as pd 
import scipy.stats as stats 
import itertools as IT 

A = pd.DataFrame([[1, 5, 2], [2, 4, 4], [3, 3, 1], [4, 2, 2], [5, 1, 4]], 
       columns=['A', 'B', 'C'], index = [1, 2, 3, 4, 5]) 

for col1, col2 in IT.combinations(A.columns, 2): 
    def tau(idx): 
     B = A[[col1, col2]].iloc[idx] 
     return stats.kendalltau(B[col1], B[col2])[0] 
    A[col1+col2] = pd.rolling_apply(np.arange(len(A)), 3, tau) 

print(A)  

A B C AB  AC  BC 
1 1 5 2 NaN  NaN  NaN 
2 2 4 4 NaN  NaN  NaN 
3 3 3 1 -1 -0.333333 0.333333 
4 4 2 2 -1 -0.333333 0.333333 
5 5 1 4 -1 1.000000 -1.000000 
+0

놀라운 산출한다. 고마워요!. 염두에 두어야 할 열의 수에는 제한이 있습니까? 이 itertools 기능은 내 수준 위의 멋지고 방법입니다 ... 추가 지능적인 질문을 요청하십시오. – hernanavella

+0

조합 수는'n ** 2 '와 같이 증가하므로'm = len (A) '인'n ** 2 * m' 번 순서로'tau'가 호출됩니다. 이렇게하려면 시간이 오래 걸릴 수 있습니다. 특히 많은 열이있는 경우에 특히 그렇습니다. [itertools'를 사용하여] (https://docs.python.org/2/library/itertools.html) 정말 재미 있습니다. 그것을 배우는 것이 어렵지 않고 시간을 충분히 지킬 가치가 있습니다. – unutbu

+0

60K 행 x 4 열 ~ 7 분 – hernanavella

관련 문제