2017-01-03 55 views
2

我初學者的Python的愛情正在經歷一個艱難審判...蟒蛇大熊貓溜動功能有兩個參數

我需要在一個固定長度的滾動窗口計算的函數(比方說:5)。該功能需要兩個參數。我很清楚答案here這幾乎是相同的,但我不斷收到錯誤。

我的代碼很簡單:

import numpy as np 
import pandas as pd 
import scipy as sp 
import scipy.stats 

df = pd.DataFrame({'A' : np.arange(20), 'B' : np.random.randint(0,20,20)}) 

def my_tau2(idx): 
    x = df.loc[idx, 'A'].astype('float') 
    y = df.loc[idx, 'B'].astype('float') 
    return scipy.stats.mstats.kendalltau(x, y)[0] ## breaks without this [0] 

pd.rolling_apply(np.arange(len(df), dtype = np.dtype('int16')), 5, my_tau2) 

,我不斷收到以下錯誤:

enter code 
File "<ipython-input-6-d6cbc608d2f0>", line 7, in <module> 
pd.rolling_apply(np.arange(len(df), dtype = np.dtype('int16')), 5, my_tau2) 
File "D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\stats\moments.py", line 584, in rolling_apply 
kwargs=kwargs) 
File "D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\stats\moments.py", line 240, in ensure_compat 
result = getattr(r, name)(*args, **kwds) 
File "D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\window.py", line 863, in apply 
return super(Rolling, self).apply(func, args=args, kwargs=kwargs) 
File "D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\window.py", line 621, in apply 
center=False) 
File "D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\window.py", line 560, in _apply 
result = calc(values) 
File "D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\window.py", line 555, in calc 
return func(x, window, min_periods=self.min_periods) 
File "D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\window.py", line 618, in f 
kwargs) 
File "pandas\algos.pyx", line 1831, in pandas.algos.roll_generic (pandas\algos.c:51581) 
TypeError: a float is required 

我一直在努力與和我要發狂了。 我的模塊版本是:

  • numpy的:1.11.0
  • SciPy的:0.17.1
  • 大熊貓:0.18.1
  • 蟒蛇:3.5.1

任何提示w.r.t.如何修正或以另一種方式計算這一點,我們衷心歡迎。

回答

2

我不熟悉肯德爾頭係數,但根據上面的鏈接帖子,也許你應該重寫你的頭函數只返回一個值。因此,您所提供的鏈接來判斷,我會設計你的頭像以下(仍然不是太靈活,在我看來,因爲它使用硬編碼的列名來自外部範圍):

def my_tau2(idx): 
    df_tau = df[["A","B"]].iloc[idx] 
    return scipy.stats.mstats.kendalltau(df_tau["A"], df_tau["B"])[0] 

,讓我來執行rolling_apply(當然它保存到數據幀 - 你似乎並沒有這樣做):

df["tau"] = pd.rolling_apply(np.arange(len(df)), 5, my_tau2) 

運行此outputed以下結果:

 A B  tau 
0 0 0  NaN 
1 1 11  NaN 
2 2 2  NaN 
3 3 11  NaN 
4 4 17 0.737865 
5 5 9 0.105409 
6 6 5 0.000000 
7 7 9 -0.527046 
8 8 15 -0.105409 
9 9 11 0.527046 
10 10 4 0.000000 
11 11 6 -0.400000 
12 12 14 -0.200000 
13 13 19 0.600000 
14 14 0 0.200000 
15 15 19 0.316228 
16 16 9 -0.105409 
17 17 1 -0.316228 
18 18 13 0.200000 
19 19 16 0.000000 
+0

謝謝,馬裏安! scipy.stats.mstats.kendalltau(x,y)處的這個[0]是神奇的成分。我更新了代碼,以便它現在可以工作。實際上,不需要其他修改。我猜這是行不通的,因爲熊貓/ numpy無法識別返回對象的類型(scipy.stats.mstats_basic.KendalltauResult)。 – rpl

+0

我想我們同時是老師和學生!這就是Stackoverflow的美麗!很高興我幫了忙。 –