相关文章推荐
纯真的领结  ·  mysql - SQL ...·  2 年前    · 
谦逊的硬币  ·  jestjs - Jest ...·  2 年前    · 
量化金融数据:Numba加速Pandas聚合

量化金融数据:Numba加速Pandas聚合

当处理高频金融数据达到TB级,Pandas的运算效率低下逐渐凸显。
Numba是一个成熟的性能优化方案,经过Numba编译的Python矩阵运算,运行速度接近C/C++语言。

Numba简介

Numba,一个高性能Python编译器。

Numba 使 Python 代码变得更快。

Numba 是一个开源 Just-in-time compilation(JIT ,即时编译)编译器,可将 Python 和 Numpy 代码的子集翻译为机器码。

安装Numba

conda install numba

使用Numba

导入数据

加载dataframe,内存占用超过1GB

import numba
import numpy as np
import pandas as pd
data = pd.read_feather("test.feather").set_index(['trade_date', "asset_code"])
data["trade_amount"] = data["trade_volume"] * data["trade_price"]

普通分组聚合运算

def p(group):
    threshold = group["trade_amount"].mean() + group["trade_amount"].std()
    fac = group[group["trade_amount"] > threshold]["trade_amount"].sum() / group["trade_amount"].sum()
    return fac
factor = data.groupby(["trade_date", "asset_code"]).apply(p)

针对MultiIndex进行分组,对分组的dataframe进行一些自定义的矩阵运算,耗费3.44秒。

Numba加速

@numba.jit(signature_or_function=numba.float32(numba.float32[:]),nopython=True,cache=True,nogil=True,boundscheck=True)
def p(trade_amount):