用Numb处理pandas数据帧时间序列的有效方法

2024-04-30 02:40:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个1500000行的数据框。这是我从QuantQuote.com上买来的一分钟的股市数据。(开、高、低、关、音量)。我在试着对股市交易策略进行一些自制的回溯测试。处理事务的直接python代码太慢,我想尝试使用numba来加快速度。问题是numba doesn't seem to work with pandas functions

谷歌搜索发现,在熊猫身上使用numba的信息令人惊讶地缺乏。这让我怀疑我是不是考虑错了。

我的设置是Numba 0.13.0-1,Pandas 0.13.1-1。Windows7,带PTV的MS VS2013,Python2.7,热情座舱

我现有的Python+Pandas内循环具有以下一般结构

  • 计算“指示器”列(pd.ewma、pd.rolling_max、pd.rolling_min等)
  • 计算预定事件的“事件”列,如移动平均交叉点、新高点等

然后我使用DataFrame.iterows来处理数据帧。

我已经尝试了各种优化,但仍然没有我想要的那么快。优化也会导致错误。

我想用numba来处理这些行。有没有更好的方法来解决这个问题?

因为我的DataFrame实际上只是一个浮点数矩形,所以我考虑使用类似DataFrame.values的东西来访问数据,然后编写一系列使用numba访问行的函数。但这会删除所有的时间戳,我认为这不是可逆操作。我不确定我从DataFrame.values获得的值矩阵是否保证不是数据的副本。

任何帮助都非常感谢。


Tags: 数据comdataframepandas事件交易策略股市
1条回答
网友
1楼 · 发布于 2024-04-30 02:40:04

Numba是一个能感知NumPy的实时编译器。可以将NumPy数组作为参数传递给Numba编译的函数,但不能传递给Pandas系列。

到2017年6月27日为止,您唯一的选择仍然是使用Pandas系列值,这实际上是NumPy数组。

此外,您还会询问这些值是否“保证不是数据的副本”。它们不是副本,您可以验证:

import pandas


df = pandas.DataFrame([0, 1, 2, 3])
df.values[2] = 8
print(df)  # Should show you the value `8`

在我看来,Numba是处理市场数据的一个很好的方法(如果不是最好的话),而且您只希望使用Python。如果您希望获得更好的性能,请确保使用@numba.jit(nopython=True)(注意,这将不允许您在JIT编译的函数中使用字典和其他Python类型,但会使代码运行得更快)。

请注意,您正在使用的一些指示器可能已经在Pandas中有了一个有效的实现,因此请考虑使用Pandas对它们进行预计算,然后将值(NumPy数组)传递给您的Numba backtesting函数。

相关问题 更多 >