蟒蛇大熊猫溜动功能有两个参数

问题描述:

我初学者的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.如何修正或以另一种方式计算这一点,我们衷心欢迎。

我不熟悉肯德尔头系数,但根据上面的链接帖子,也许你应该重写你的头函数只返回一个值。因此,您所提供的链接来判断,我会设计你的头像以下(仍然不是太灵活,在我看来,因为它使用硬编码的列名来自外部范围):

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的美丽!很高兴我帮了忙。 –