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