Python 熊猫:在数据框中创建一个新列,它是滚动窗口的一个功能
我有一个数据框,可以计算一列新的滚动10周期平均值 使用Python 熊猫:在数据框中创建一个新列,它是滚动窗口的一个功能,python,pandas,dataframe,user-defined-functions,Python,Pandas,Dataframe,User Defined Functions,我有一个数据框,可以计算一列新的滚动10周期平均值 使用pandas.stats.moments.rolling_平均值(现有列,10, 最小周期=10)。如果少于10节课,我会得到一个NaN。我 可以对滚动中间带执行相同的操作。太好了 我现在想计算N个周期的其他滚动函数,但不能计算 《我的生活》了解如何使用熊猫的用户定义函数。在里面 特别是,我想计算一个滚动的10点Hodges-Lehman平均值,它是 定义如下: def hodgesLehmanMean(x): return 0.
pandas.stats.moments.rolling_平均值(现有列,10,
最小周期=10)
。如果少于10节课,我会得到一个NaN。我
可以对滚动中间带执行相同的操作。太好了
我现在想计算N个周期的其他滚动函数,但不能计算
《我的生活》了解如何使用熊猫的用户定义函数。在里面
特别是,我想计算一个滚动的10点Hodges-Lehman平均值,它是
定义如下:
def hodgesLehmanMean(x):
return 0.5 * statistics.median(x[i] + x[j] for i in range(len(x)) for j in range(i+1,len(x)))
如何将其转换为可应用于熊猫的滚动函数
如果传递给它的周期少于10个,则返回一个NaN?我是一名医生
熊猫是新手,所以我特别感谢你给我一个简单的解释
例如。您可以使用:
屈服
foo bar
0 0 NaN
1 1 NaN
2 2 NaN
3 3 NaN
4 4 NaN
5 5 NaN
6 6 NaN
7 7 NaN
8 8 NaN
9 9 4.5
10 10 5.5
11 11 6.5
12 12 7.5
13 13 8.5
14 14 9.5
15 15 10.5
16 16 11.5
17 17 12.5
18 18 13.5
19 19 14.5
霍奇斯莱曼平均值的更快版本是:
def hodgesLehmanMean_alt(x):
m = np.add.outer(x,x)
ind = np.tril_indices(len(x), -1)
return 0.5 * np.median(m[ind])
这是一个完整性检查,显示对于长度为100的1000个随机数组,
hodgesLehmanMean_alt
返回与hodgesLehmanMean
相同的值:
In [68]: m = np.random.random((1000, 100))
In [69]: all(hodgesLehmanMean(x) == hodgesLehmanMean_alt(x) for x in m)
Out[69]: True
下面是一个基准测试,显示霍奇斯莱曼平均值\u alt
大约快8倍:
In [80]: x = np.random.random(5000)
In [81]: %timeit hodgesLehmanMean(x)
1 loops, best of 3: 3.99 s per loop
In [82]: %timeit hodgesLehmanMean_alt(x)
1 loops, best of 3: 463 ms per loop
您可以使用:
屈服
foo bar
0 0 NaN
1 1 NaN
2 2 NaN
3 3 NaN
4 4 NaN
5 5 NaN
6 6 NaN
7 7 NaN
8 8 NaN
9 9 4.5
10 10 5.5
11 11 6.5
12 12 7.5
13 13 8.5
14 14 9.5
15 15 10.5
16 16 11.5
17 17 12.5
18 18 13.5
19 19 14.5
霍奇斯莱曼平均值的更快版本是:
def hodgesLehmanMean_alt(x):
m = np.add.outer(x,x)
ind = np.tril_indices(len(x), -1)
return 0.5 * np.median(m[ind])
这是一个完整性检查,显示对于长度为100的1000个随机数组,
hodgesLehmanMean_alt
返回与hodgesLehmanMean
相同的值:
In [68]: m = np.random.random((1000, 100))
In [69]: all(hodgesLehmanMean(x) == hodgesLehmanMean_alt(x) for x in m)
Out[69]: True
下面是一个基准测试,显示霍奇斯莱曼平均值\u alt
大约快8倍:
In [80]: x = np.random.random(5000)
In [81]: %timeit hodgesLehmanMean(x)
1 loops, best of 3: 3.99 s per loop
In [82]: %timeit hodgesLehmanMean_alt(x)
1 loops, best of 3: 463 ms per loop
如果查看,您可以看到
rolling\u apply
函数,它允许您以滚动方式应用任何函数。函数必须将“滚动窗口”中的数据作为参数。不清楚你的Hodgeslehmanmen怎么会有窗户。什么是x
?它是窗口还是整个数据集?如果您查看,您可以看到rolling\u apply
函数,它允许您以滚动方式应用任何函数。函数必须将“滚动窗口”中的数据作为参数。不清楚你的Hodgeslehmanmen怎么会有窗户。什么是x
?它是窗口还是整个数据集?x是一个iterable(通常是一个列表)。你的解释和例子非常清楚。非常感谢。很抱歉没有提前响应,但您的代码非常出色,它将例行程序的速度提高了一个数量级。谢谢你。值得指出的是,Hodges-Lehman均值是一个非常有用的估值器,因为它在标准(高斯)情况下具有非常高(95%)的效率,并且能够拒绝任意大的异常值,只要它们不超过29%的点。简言之,它为我们提供了平均值的大部分效率,具有很大的稳健性,并且没有中值的缺点(例如锁定到静态中心值)。再次感谢。这个答案与熊猫的最新版本已经过时了-有任何更新计划吗?x是可编辑的(通常是列表)。你的解释和例子非常清楚。非常感谢。很抱歉没有提前响应,但您的代码非常出色,它将例行程序的速度提高了一个数量级。谢谢你。值得指出的是,Hodges-Lehman均值是一个非常有用的估值器,因为它在标准(高斯)情况下具有非常高(95%)的效率,并且能够拒绝任意大的异常值,只要它们不超过29%的点。简言之,它为我们提供了平均值的大部分效率,具有很大的稳健性,并且没有中值的缺点(例如锁定到静态中心值)。再次感谢。这个答案与熊猫的最新版本已经过时了-有计划更新吗?