【发布时间】: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。在这种情况下很难避免错误。它因优化而臃肿。我会上传一个副本
-
@Jeff pastebin.com/AaifFYnk
-
好的,所有看起来都是可向量化的(通常只有循环关系不能直接向量化,尽管有时它们是可能的,例如通过 shift/diff),但我理解你的难题。您不能真正将 numba 与 pandas 混合在一起;尝试使用 df.values。
-
好的...那么 numba 对您来说可能是一个不错的选择。 (或者干脆用 cython 写),见这里:pandas.pydata.org/pandas-docs/stable/enhancingperf.html
标签: python python-2.7 pandas numba