[英]Pandas dataframe - speed in python: dataframe operations, numba, cython
我有一个约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])
我也曾尝试将其向量化,但始终收到有关“无法序列化浮动”或类似问题的错误。
我的想法是尝试以下方法之一,但我不确定理论上哪种方法最快? 是否存在与运行这些非线性相关的非线性关系,以至于有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
对于Cython和numba,我是否仍会使用df.apply遍历所有行? 还是有更有效的方法?
我参考了以下内容,发现它们有助于理解各种选项,但并不是实现此目的的“最佳”方法(尽管我认为这最终取决于应用程序)。
https://lectures.quantecon.org/py/need_for_speed.html
http://www.devx.com/opensource/improve-python-performance-with-cython.html
简单地说:
df.loc[:, 'px'] = (alpha * beta) / df.loc[:, 'time'] * df.loc[:, 'vol']
顺便说一下,您的for-loop / lambda解决方案很慢,因为每个熊猫访问的开销都很大。 因此,分别访问每个单元格(通过遍历每一行)比访问整个列要慢得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.