【问题标题】:Comparing values in different time frames (after resample and rolling in Pandas)比较不同时间范围内的值(在 Pandas 中重新采样和滚动之后)
【发布时间】:2016-07-29 06:55:53
【问题描述】:

我有快速的时间范围(tick 数据),并想检查该值是否等于 1 分钟时间范围内滚动最大值的最高价格。

刻度数据为:

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))]

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

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

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

    mask = ntick.Last == rol2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 2014-09-12
      • 2022-01-18
      相关资源
      最近更新 更多