2014-09-04 3 views
6

में 2 तर्कों की आवश्यकता है। मैं रोलूली का उपयोग ऐसे फॉर्मूला के साथ करने की कोशिश कर रहा हूं जिसके लिए 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 और दो तर्क लेने के साथ समस्या से अवगत हूँ के रूप में यहाँ प्रलेखित:

फिर भी, मैं रोलिंग आधार पर एकाधिक कॉलम के साथ डेटाफ्रेम पर केंडलटौ गणना करने का कोई तरीका खोजने के लिए संघर्ष कर रहा हूं।

:

मेरे 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 arrays पास करता है। 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

संयोजनों की संख्या 'एन ** 2' की तरह बढ़ती है, इसलिए 'एम ** 2 * एम' बार के आदेश पर' ताउ 'कहा जाता है जहां' m = len (ए) '। तो इसमें कुछ समय लग सकता है, खासकर यदि आपके पास बहुत सारे कॉलम हैं। ['Itertools' का उपयोग]] (https://docs.python.org/2/library/itertools.html) वास्तव में काफी मजेदार है; सीखना मुश्किल नहीं है और समय के लायक है। – unutbu

+0

60 के पंक्तियां x 4 कॉलम ~ 7min – hernanavella

संबंधित मुद्दे