2014-09-04 18 views
6

Tôi đang cố sử dụng rollapply với công thức yêu cầu 2 đối số. Theo hiểu biết của tôi là cách duy nhất (trừ khi bạn tạo ra các công thức từ đầu) để tính toán kendall tau tương quan, với sự điều chỉnh cà vạt chuẩn bao gồm là:Sử dụng rolling_apply với hàm yêu cầu 2 đối số trong Pandas

>>> 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 

Tôi cũng nhận thức được vấn đề với rollapply và lấy hai tham số, như tài liệu ở đây:

Tuy nhiên, tôi đang cố gắng tìm cách để thực hiện phép tính kendalltau trên một khung dữ liệu với nhiều cột trên cơ sở luân phiên.

dataframe của tôi là một cái gì đó như thế này

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

Đang cố gắng để tạo ra một chức năng mà thực hiện điều này

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 

Trong một cách tiếp cận rất sơ bộ tôi giải trí ý tưởng về việc xác định chức năng như thế này:

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)) 

Tắt khóa học Nó không hoạt động. Tôi nhận được:

ValueError: all keys need to be the same shape 

Tôi hiểu không phải là vấn đề tầm thường. Tôi đánh giá cao bất kỳ đầu vào nào.

Trả lời

5

As of Pandas 0.14, rolling_apply chỉ chuyển các mảng NumPy vào hàm. Cách giải quyết có thể là vượt qua np.arange(len(A)) làm đối số đầu tiên cho rolling_apply, để hàm tau nhận được chỉ mục của các hàng bạn muốn sử dụng. Sau đó, trong hàm tau,

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

trả về một DataFrame chứa tất cả các hàng bắt buộc.


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)  

mang

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

tuyệt vời. Cảm ơn rất nhiều!. Có giới hạn về số cột tôi nên ghi nhớ không? Các hàm itertools này tuyệt vời và cao hơn mức của tôi ... để hỏi bất kỳ câu hỏi thông minh bổ sung nào. – hernanavella

+0

Số lượng kết hợp tăng lên như 'n ** 2', do đó' tau' được gọi theo thứ tự 'n ** 2 * m' lần trong đó' m = len (A) '. Vì vậy, điều này có thể mất một lúc, đặc biệt nếu bạn có nhiều cột. [Sử dụng 'itertools'] (https://docs.python.org/2/library/itertools.html) thực sự khá thú vị; học tập nó không phải là khó khăn và cũng có giá trị thời gian. – unutbu

+0

60K Hàng x 4 cột ~ 7 phút – hernanavella

Các vấn đề liên quan