蟒蛇大熊猫溜动功能有两个参数
问题描述:
我初学者的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
谢谢,马里安! scipy.stats.mstats.kendalltau(x,y)处的这个[0]是神奇的成分。我更新了代码,以便它现在可以工作。实际上,不需要其他修改。我猜这是行不通的,因为熊猫/ numpy无法识别返回对象的类型(scipy.stats.mstats_basic.KendalltauResult)。 – rpl
我想我们同时是老师和学生!这就是Stackoverflow的美丽!很高兴我帮了忙。 –