簡體   English   中英

熊貓數據框-python中的速度:數據框操作,numba,cython

[英]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

Numpy vs Cython速度

加快python中的numpy循環?

Cython優化

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM