具有两个参数的python函数

具有两个参数的python函数,python,pandas,numpy,scipy,Python,Pandas,Numpy,Scipy,我的初学者对python的热爱正在经历一场艰难的考验 我需要在固定长度的滚动窗口中计算一个函数(假设:5)。该函数需要两个参数。我很清楚答案几乎是一样的,但我总是出错 我的代码很简单: 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)}) de

我的初学者对python的热爱正在经历一场艰难的考验

我需要在固定长度的滚动窗口中计算一个函数(假设:5)。该函数需要两个参数。我很清楚答案几乎是一样的,但我总是出错

我的代码很简单:

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
输入代码
文件“”,第7行,在
pd.滚动应用(np.arange(len(df),dtype=np.dtype('int16')),5,my_tau2)
文件“D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site packages\pandas\stats\moments.py”,第584行,滚动应用
kwargs=kwargs)
文件“D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site packages\pandas\stats\moments.py”,第240行,在确保兼容
结果=getattr(r,name)(*args,**kwds)
文件“D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site packages\pandas\core\window.py”,第863行,在apply中
返回超级(滚动,自)。应用(func,args=args,kwargs=kwargs)
文件“D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site packages\pandas\core\window.py”,第621行,在apply中
中心=假)
文件“D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site packages\pandas\core\window.py”,第560行,在应用中
结果=计算值(数值)
文件“D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site packages\pandas\core\window.py”,第555行,在calc中
返回函数(x,窗口,最小周期=self.min\u周期)
文件“D:\Users\502031217\AppData\Local\Continuum\Anaconda3\lib\site packages\pandas\core\window.py”,第618行,f
kwargs)
pandas.algos.roll_generic(pandas\algos.c:51581)中的文件“pandas\algos.pyx”,第1831行
TypeError:需要浮点
我一直在努力解决这个问题,我快发疯了。 我的模块版本是:

  • numpy:1.11.0
  • scipy:0.17.1
  • 熊猫:0.18.1
  • python:3.5.1

我们非常欢迎任何关于w.r.t.如何以另一种方式修复或计算的提示。

我不熟悉kendall tau coeficient,但根据上面的链接帖子,也许你应该重写tau函数,只返回一个值。因此,根据您提供的链接判断,我将设计类似tau的以下内容(在我看来,仍然不太灵活,因为它使用外部范围中的硬编码列名):

这将允许我执行rolling_apply(当然,还可以将其保存到数据帧中—您似乎没有这样做):

运行此操作将输出以下结果:

     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)的末尾,是神奇的成分。我更新了代码,使它现在可以工作了。事实上,不需要其他修改。我猜它不起作用,因为pandas/numpy无法识别返回对象的类型(scipy.stats.mstats_basic.KendalltauResult)。我猜我们同时是老师和学生!这就是Stackoverflow的美妙之处!很高兴我帮了忙。
df["tau"] = pd.rolling_apply(np.arange(len(df)), 5, my_tau2)
     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