Python 熊猫-在滚动窗口中计算大于x的值的最快方法是什么?

Python 熊猫-在滚动窗口中计算大于x的值的最快方法是什么?,python,pandas,Python,Pandas,给定一个系列a,对于每个值a[i]我需要计算a[i-window:i-1]中有多少值大于a[i] 下面的代码通过python for循环完成这项工作,该循环在严重的计算任务中速度较慢 熊猫是否提供类似的功能,可能包含一些优化的Numpy功能 import numpy as np import pandas window = 30 # any arbitrary window a = pandas.Series(np.random.ran

给定一个系列
a
,对于每个值
a[i]
我需要计算
a[i-window:i-1]
中有多少值大于
a[i]

下面的代码通过python for循环完成这项工作,该循环在严重的计算任务中速度较慢

熊猫是否提供类似的功能,可能包含一些优化的Numpy功能

import numpy as np
import pandas

window = 30                              # any arbitrary window
a = pandas.Series(np.random.rand(100))   # dummy variable, arbitrary length

counter = pandas.Series(data=np.NaN, index=a.index)

for i in a.index[window:]:
    counter[i] = (a[i-window:i-1] < a[i]).sum()

print counter
将numpy导入为np
进口大熊猫
窗口=30#任意窗口
a=pandas.Series(np.random.rand(100))#伪变量,任意长度
计数器=熊猫系列(数据=np.NaN,索引=a.index)
对于a.index[window:]中的i:
计数器[i]=(a[i-窗口:i-1]
您可以使用

将numpy导入为np
作为pd进口熊猫
窗口=30
df=pd.DataFrame(np.random.randn(100),columns=['Data'])
计数=pd。滚动应用(df,窗口+1,λs:s[s

确保在窗口大小中添加一个。

a.rolling(window).count()我想。我在打电话,无法验证。谢谢,所以在熊猫中,0.18+将是
df.rolling(window=window+1)。apply(lambda:s:(s
我想可能有比布尔值求和更快的计数方法吗?我不在我的计算机旁,但我建议尝试过滤/成形。也可能是一些使用秩的算法优化。我考虑过水平平铺数组
np.tile(a,(window,1)).T
,然后进行水平计算。欢迎任何建议,谢谢!不客气。我花了一些时间试图通过减少多余的比较来改进这一点。其思想是保持一个具有窗口大小长度的排序列表,并使用二等分添加/删除元素。然而,即使对于更大的窗口,我的实现仍然比这慢得多。也许上述方法可以在cython中很好地实现。顺便说一句,我修改了答案,以避免对布尔值求和。
import numpy as np
import pandas as pd

window = 30
df = pd.DataFrame(np.random.randn(100), columns=['Data'])

counts = pd.rolling_apply(df, window+1, lambda s: s[s < s[-1]].shape[0])