【问题标题】:Efficient way to process pandas DataFrame timeseries with Numba使用 Numba 处理 pandas DataFrame 时间序列的有效方法
【发布时间】:2014-07-01 01:30:34
【问题描述】:

我有一个包含 1,500,000 行的 DataFrame。这是我从 QuantQuote.com 购买的一分钟级股市数据。 (开盘价、最高价、最低价、收盘价、成交量)。我正在尝试对股市交易策略进行一些自制的回测。处理事务的直接 python 代码太慢了,我想尝试使用 numba 来加快速度。麻烦的是numba doesn't seem to work with pandas functions

Google 搜索发现有关在 pandas 中使用 numba 的信息令人惊讶地缺乏。这让我怀疑我是否在考虑它时犯了一个错误。

我的设置是 Numba 0.13.0-1,Pandas 0.13.1-1。 Windows 7,带有 PTVS 的 MS VS2013,Python 2.7,Enthought Canopy

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

  • 计算“指标”列,(使用 pd.ewma、pd.rolling_max、pd.rolling_min 等)
  • 为预定事件计算“事件”列,例如移动平均线交叉、新高等。

然后我使用 DataFrame.iterrows 来处理 DataFrame。

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

我想使用 numba 来处理行。是否有解决此问题的首选方法?

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

非常感谢任何帮助。

【问题讨论】:

  • 您应该将您的代码作为一个单独的问题发布,看看这里的人是否可以帮助您进行矢量化。恕我直言,没有太多理由实际使用 numba,因为 pandas 可以通过矢量化(无循环)做更多事情。 pandas 在后台使用 cython,因此大多数操作都经过优化。让你的代码正确,然后优化。要回答您的问题,您可以根据需要使用df.values 获取底层 numpy 数组和进程,但随后您将负责转换回 DataFrame(如果需要)。跨度>
  • 不可能以完全矢量化的方式处理数据。为了分析我的结果,我生成了非常大的 PNG 文件,看起来像这样dropbox.com/s/p66mvp54dymi7hv/TABLE_AAPL.TXT.png。我通过用查科折磨自己来快速策划这些。如您所见,生成了很多列来存储中间结果。单笔交易的处理现在是一个长达 80 行的函数。我典型的策略内循环现在是大约 350 行非重复的 python+pandas。在这种情况下很难避免错误。它因优化而臃肿。我会上传一个副本
  • 好的,所有看起来都是可向量化的(通常只有循环关系不能直接向量化,尽管有时它们是可能的,例如通过 shift/diff),但我理解你的难题。您不能真正将 numba 与 pandas 混合在一起;尝试使用 df.values。
  • 好的...那么 numba 对您来说可能是一个不错的选择。 (或者干脆用 cython 写),见这里:pandas.pydata.org/pandas-docs/stable/enhancingperf.html

标签: python python-2.7 pandas numba


【解决方案1】:

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 回测函数。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 2021-04-10
  • 2012-11-03
  • 1970-01-01
  • 2016-01-15
  • 2023-04-06
  • 2019-06-29
  • 2016-12-07
相关资源
最近更新 更多