gpt4 book ai didi

python - 使用 Numba 处理 pandas DataFrame 时间序列的有效方法

转载 作者:太空狗 更新时间:2023-10-30 00:07:10 25 4
gpt4 key购买 nike

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

Google 搜索发现关于将 numba 与 pandas 一起使用的信息令人惊讶地缺乏。这让我想知道我是否在考虑它时犯了错误。

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

我现有的Python+Pandas innerloop有如下大体结构

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

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

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

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

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

非常感谢任何帮助。

最佳答案

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

关于python - 使用 Numba 处理 pandas DataFrame 时间序列的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23630162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com