我有快速的时间范围(勾选数据),想要检查该值是否等于1分钟时间范围内滚动最大值的最大价格。
Tick数据是:
2016-06-27 08:30:00 4243.00
2016-06-27 08:30:00 4243.00
2016-06-27 08:30:00 4243.00
2016-06-27 08:30:00 4243.00
2016-06-27 08:30:00 4243.00
2016-06-27 08:30:00 4243.00
2016-06-27 08:30:00 4243.00
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.75
2016-06-27 08:30:00 4242.50
2016-06-27 08:30:00 4242.50
2016-06-27 08:30:00 4242.50
我使用以下方法计算1分钟时间范围内的滚动最大值:
rol=ntick.Last.resample('1min').max().rolling(center=False,window=4).max()
但是,检查刻度数据中的值是否等于rol中的最大滚动量的最快方法是什么?
我仍然是Python的新手,所以我只能用非常慢的方式来使用循环:
mask=[]
for x in range(0,len(ntick)):
mask.append(ntick.Last[x]==rol[ntick.index[x].replace(second=0)])
然后将掩码应用为ntick [' mask'] = mask
这可行,但效率不高。任何提示如何更好地做到这一点?
编辑:
列表理解而不是循环使流程快3倍:
mask=[ntick.Last[x]==rol[ntick.index[x].replace(second=0)] for x in range(0,len(ntick))]
但仍然想知道是否有更好的方法。
答案 0 :(得分:1)
如果我正确理解了您的要求,您可能需要使用Series.asof
,它会返回上一个有效值,并且可以采用类似列表的参数。我假设ntick
(以及rol
)已将排序DatetimeIndex
作为索引。
rol2 = rol.squeeze().asof(ntick.index)
最初,rol
是一列数据框,因此需要squeeze
才能将其转换为Series
。 rol2
和ntick
的索引现在相等,我们可以比较:
mask = ntick.Last == rol2