比较不同时间范围内的值(在Pandas中重新取样和滚动之后)

时间:2016-07-27 21:46:44

标签: python pandas

我有快速的时间范围(勾选数据),想要检查该值是否等于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))]

但仍然想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的要求,您可能需要使用Series.asof,它会返回上一个有效值,并且可以采用类似列表的参数。我假设ntick(以及rol)已将排序DatetimeIndex作为索引。

rol2 = rol.squeeze().asof(ntick.index)

最初,rol是一列数据框,因此需要squeeze才能将其转换为Seriesrol2ntick的索引现在相等,我们可以比较:

mask = ntick.Last == rol2