Pandas数据帧 - python中的速度:数据帧操作,numba,cython

Dou*_*oug 2 python performance cython pandas numba

我有一个约200万行的财务数据集.我想将其作为pandas数据框导入,并通过利用一些现有列值应用行方式函数来添加其他列.为此,我不想使用任何技术,如并行化,python的hadoop等,所以我面临以下问题:

我已经这样做了类似于下面的例子,性能很差,~24分钟才能通过~20K行.注意:这不是实际功能,它完全由弥补.对于其他列,我正在计算各种财务选项指标.我怀疑慢速主要是由于迭代所有行,而不是真正的函数本身,因为它们相当简单(例如计算期权的价格).我知道我可以加速函数本身的一些小事情,比如使用erf而不是正态分布,但为了这个目的,我想专注于整体问题本身.

def func(alpha, beta, time, vol):
    px = (alpha*beta)/time * vol
    return px

# Method 1 (could also use itertuples here) - this is the one that takes ~24 minutes now
for row in df.iterrows():
    df['px'][row] = func(alpha, beta, df['time'][row], df['vol'][row])
Run Code Online (Sandbox Code Playgroud)

我也试过矢量化这个但是继续得到关于'不能序列化浮点'或类似的错误.

我的想法是尝试以下方法之一,我不确定哪个理论上最快?是否存在与运行这些非线性相关的非线性,因此1000行的测试不一定表明哪一行在所有200万行中最快?可能是一个单独的问题,但我应该专注于更有效的方法来管理数据集而不是仅仅专注于应用这些功能?

# Alternative 1 (df.apply with existing function above)
df['px'] = df.apply(lambda row: func(alpha, beta, row['time'], row['vol']), axis=1)

# Alternative 2 (numba & jit)
@jit
def func(alpha, beta, time, vol):
    px = (alpha*beta)/time * vol
    return px

# Alternative 3 (cython)
def func_cython(double alpha, double beta, double time, double vol):
    cdef double px
    px = (alpha*beta)/time * vol
    return px
Run Code Online (Sandbox Code Playgroud)

在Cython和numba的情况下,我是否仍然使用df.apply迭代所有行?还是有更有效的方法?

我已经引用了以下内容并发现它们有助于理解各种选项,但不是"最佳"方法是什么(尽管我认为它最终取决于应用程序).

https://lectures.quantecon.org/py/need_for_speed.html

Numpy vs Cython速度

在python中加速numpy循环?

Cython优化

http://www.devx.com/opensource/improve-python-performance-with-cython.html

THN*_*THN 6

怎么样简单:

df.loc[:, 'px'] = (alpha * beta) / df.loc[:, 'time'] * df.loc[:, 'vol']
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你的for-loop/lambda解决方案很慢,因为每个pandas访问的开销很大.因此,单独访问每个单元格(通过循环遍历每一行)比访问整个列要慢得多.