Python 使用Numba处理数据帧时间序列的有效方法
我有一个1500000行的数据帧。这是我从QuantQuote.com买的一分钟级的股市数据。(打开、高、低、关闭、音量)。我正在尝试对股票市场交易策略进行一些自制的回溯测试。处理事务的纯python代码太慢,我想尝试使用numba来加快速度。问题是 谷歌搜索发现,令人惊讶的是,在熊猫身上使用麻木的信息非常缺乏。这让我怀疑我考虑它是否犯了错误 我的设置是Numba 0.13.0-1,Pandas 0.13.1-1。Windows 7、MS VS2013和PTV、Python 2.7、Enthoud Corporation 我现有的Python+innerloop具有以下一般结构Python 使用Numba处理数据帧时间序列的有效方法,python,python-2.7,pandas,numba,Python,Python 2.7,Pandas,Numba,我有一个1500000行的数据帧。这是我从QuantQuote.com买的一分钟级的股市数据。(打开、高、低、关闭、音量)。我正在尝试对股票市场交易策略进行一些自制的回溯测试。处理事务的纯python代码太慢,我想尝试使用numba来加快速度。问题是 谷歌搜索发现,令人惊讶的是,在熊猫身上使用麻木的信息非常缺乏。这让我怀疑我考虑它是否犯了错误 我的设置是Numba 0.13.0-1,Pandas 0.13.1-1。Windows 7、MS VS2013和PTV、Python 2.7、Enthou
- 计算“指标”列(带有pd.ewma、pd.rolling_max、pd.rolling_min等)
- 计算预定事件的“事件”列,如移动平均线交叉、新高等
非常感谢您的帮助。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类型,但会使代码运行得更快)
注意,你正在使用的这些指示器中的一些可能已经在熊猫中有高效的实现,所以考虑预先对熊猫进行计算,然后将这些值(NUMPY数组)传递给您的NUBA反向测试函数。
您应该将您的代码作为单独的问题发布,并查看这里的用户是否可以帮助您矢量化。我没有太多理由实际使用numba,因为熊猫可以在矢量化(无循环)方面做得更多。熊猫在引擎盖下使用cython,因此大多数操作都得到了优化。让你的代码正确,然后优化。要回答您的问题,您可以使用df.values
获取基础numpy数组并进行处理(如果需要),但您将负责转换回数据帧(如果需要)。不可能以完全矢量化的方式处理数据。为了分析我的结果,我制作了非常大的PNG文件,看起来像这样。我用查科折磨自己,很快就策划了这些。如您所见,有许多列用于存储中间结果。单笔交易的处理现在是一个80行长的函数。我的策略的典型内部循环现在大约是350行不重复的python+pandas。在这种情况下很难避免错误。它因优化而膨胀。我会上传一个copy@Jeff好的,这一切看起来都是可矢量化的(通常只有循环关系不能直接矢量化,尽管有时它们是可能的,例如通过shift/diff),但我理解你的难题。你不能真的把麻木和熊猫混在一起;尝试使用df.values。好的……那么numba可能是一个不错的选择。(或者可以简单地用cython书写),请参见:关于大熊猫与numba配伍的最新信息,请参见: