pandas 如何在 rolling().apply() 中使用 numba 加速
技术百科
冷漠man
发布时间:2026-01-27
浏览: 次 rolling().apply()中直接传numba函数会报错,因pandas要求函数处理一维ndarray且返回标量,而numba不兼容Series;正确做法是设raw=True、用.values提取纯数组,并确保numba函数仅处理numpy.ndarray、自行处理NaN。
rolling().apply() 里直接传 numba 函数会报错
因为 pandas 的 rolling().apply() 要求传入的函数必须接受一维 ndarray(或 Series),且返回标量或同长度数组;而 numba.jit 编译后的函数默认不支持对 pandas 对象(如 Series)的直接调用,更不兼容其内部索引逻辑。常见错误是:TypingError: Failed in nopython mode... 或 AttributeError: 'numpy.ndarray' object has no attribute 'values'。
关键点:必须确保 numba 函数只处理纯 numpy.ndarray,且输入形状可控(通常是 1D)、无缺失值干扰。
正确做法:先用 numba 编译纯数组函数,再在 apply 中手动提取 .values
绕过 pandas 对象、只喂给 numba 纯 numpy.ndarray 是最稳妥的路径。注意三点:
-
numba.jit函数需加nopython=True和fastmath=True(若计算允许)以获得实际加速 -
rolling().apply()的raw=True参数必须设为True,否则传入的是Series,不是ndarray - 原始数据中若有
NaN,raw=True下仍会传入nan值,numba 函数需自行处理(比如用np.isnan()过滤或提前 dropna)
示例:
import numpy as np import pandas as pd from numba import jit@jit(nopython=True, fastmath=True) def my_rolling_sum(arr):
arr 是 1D numpy.ndarray,可能含 nan
total = 0.0 for x in arr: if not np.isnan(x): total += x return totals = pd.Series([1.0, 2.0, np.nan, 4.0, 5.0]) result = s.rolling(3).apply(my_rolling_sum, raw=True)
替代方案:用 numba 实现完整 rolling 逻辑(跳过 pandas apply)
当窗口计算逻辑复杂、或对性能极致敏感时,
rolling().apply()的 Python 层开销(如每次构造子数组、类型检查)反而成为瓶颈。此时更高效的方式是:
- 用
np.lib.stride_tricks.sliding_window_view(NumPy 1.20+)生成窗口视图 - 把整个窗口数组传给 numba 函数批量处理(避免逐窗口调用)
- 注意边界:sliding_window_view 不自动处理首尾不足窗口长度的情况,需手动 pad 或截断
示例(等效于 rolling(3).sum()):
from numpy.lib.stride_tricks import sliding_window_view@jit(nopython=True) def batch_sum(windows): # windows.shape == (n_windows, window_size) out = np.empty(windows.shape[0], dtype=windows.dtype) for i in range(windows.shape[0]): acc = 0.0 for j in range(windows.shape[1]): if not np.isnan(windows[i, j]): acc += windows[i, j] out[i] = acc return out
arr = s.to_numpy() windows = sliding_window_view(arr, window_shape=3) result_arr = batch_sum(windows) # 返回 (len-2,) 数组
容易被忽略的坑:dtype 不一致和 missing value 处理
numba 对 dtype 敏感,如果输入数组是 float64,但某次 rolling 窗口因全为 NaN 导致 pandas 内部回退为 object 类型,raw=True 仍可能传入非数值数组,触发 numba 编译失败或运行时报错。
务必在调用前统一 dtype 并显式处理缺失值:
- 用
s.astype(np.float64)强制数值类型 - 避免在滚动前混用
None和np.nan(后者才是 numba 可识别的) - 若业务允许,优先用
s.fillna(0)或s.dropna()预处理,比在 numba 函数里反复判断np.isnan更快

真正卡住人的往往不是 numba 怎么写,而是 pandas 滚动窗口怎么把数据“干净地”塞进去 —— 这一步没控好,后面全白搭。
# ai
# 的是
# 才是
# 更快
# python
# windows
# 三点
# 若有
# app
# 设为
# 不支持
# win
# 对象
# 值类型
# 报错
# 或对
# Object
# Attribute
# pandas
# numpy
# 更不
# 数值数组
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- php8.4如何实现队列任务_php8.4redi
- 手机php文件怎么变成mp4_安卓苹果打开php转
- c++ namespace命名空间用法_c++避免
- C#怎么创建控制台应用 C# Console Ap
- Win11怎么设置任务栏大小_Windows11注
- 如何在Golang中捕获结构体方法错误_Golan
- php增删改查在php8里有什么变化_新特性对cu
- c++怎么使用std::unique实现去重_c+
- Windows10如何删除Windows.old_
- 如何使用Golang sync.Map实现并发安全
- Python深度学习实战教程_神经网络模型构建与训
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- Win10如何设置双wan路由器 Win10双wa
- 如何用::实现工具类方法调用_php静态工具类设计
- 小程序里php怎么变mp4_小程序调用php生成m
- Windows10如何更改桌面图标间距_Win10
- Windows10系统怎么查看系统版本_Win10
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- Mac系统更新下载慢或失败怎么办_解决macOS升
- php订单日志怎么记录评价_php记录订单评价日志
- Win11如何设置文件关联 Win11修改特定文件
- 如何在Golang中引入测试模块_Golang测试
- Win11怎么查看wifi信号强度_检测Windo
- 如何使用Golang进行HTTP服务性能测试_测量
- Windows蓝屏BAD_POOL_HEADER故
- php订单日志怎么在swoole写_php协程sw
- Linux怎么查找死循环进程_Linux系统负载分
- 如何在Golang中理解指针比较_Golang地址
- Windows10如何更改鼠标图标_Win10鼠标
- Windows蓝屏错误0x00000023怎么修复
- Mac的Time Machine怎么用_Mac系统
- 如何在 Go 中比较自定义的数组类型(如 [20]
- Win10怎样卸载iTunes_Win10卸载iT
- c++怎么用jemalloc c++替换默认内存分
- Win11怎么清理C盘系统日志_Win11清理系统
- Win11笔记本怎么看电池健康度_Win11电池报
- Mac如何与安卓手机传文件_Mac和Android
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Win11怎么清理C盘OneDrive缓存_Win
- 如何使用Golang优化模块引入路径_Golang
- 如何使用 Selenium 正确获取篮球参考网站球
- Win10如何更改用户账户控制_Windows10
- Mac如何设置动态壁纸?(让桌面动起来)
- 如何用正则表达式精确匹配最多含一个换行符的起止片段
- C++如何获取CPU核心数?(std::threa
- Win11怎么激活Windows10_Win11激
- 如何使用Golang包导出规则_控制函数和变量可见
- Windows蓝屏错误0x0000001E怎么修复
- PythonGIL机制理解_多线程限制解析【教程】

QQ客服