0

0

如何高效向量化数据框中的递归折叠计算

花韻仙語

花韻仙語

发布时间:2026-02-13 18:30:01

|

833人浏览过

|

来源于php中文网

原创

如何高效向量化数据框中的递归折叠计算

本文介绍一种借助 numba 加速实现数据框中“递归折叠”(如 d[i] = d[i-1] × a[i] + b[i])的高效方法,避免传统 python 循环性能瓶颈,在保持逻辑清晰的同时显著提升大规模数据处理速度。

在 Pandas 中处理依赖前序结果的列计算(例如时间序列状态更新、滚动加权累加、隐式递推关系)时,常规的 apply() 或显式 for 循环虽直观,但在大数据集上效率低下,难以利用 CPU 向量化能力。题目中的列 D 正是一个典型一阶线性递推序列
$$ D_0 = C_0,\quad Di = D{i-1} \times A_i + B_i \quad (i \geq 1) $$
该过程无法通过纯 NumPy 的广播或 Pandas 的 shift()/cumsum() 等原生向量化操作直接表达——因为每步计算都强依赖上一步的已计算值(而非原始输入),属于典型的 data-dependent recurrence,天然难以完全向量化。

此时,推荐采用 Numba JIT 编译方案:它能在不改变算法逻辑的前提下,将 Python 风格的循环编译为接近 C 语言性能的机器码,同时完美兼容 NumPy 数组,是处理此类“伪向量化”问题的工业级首选。

以下为完整实现:

import pandas as pd
import numpy as np
from numba import njit

# 构造示例数据
df = pd.DataFrame({
    'A': [np.nan, 0.5, 0.5, 0.5, 0.5], 
    'B': [np.nan, 3, 4, 1, 2], 
    'C': [10, np.nan, np.nan, np.nan, np.nan]
})

@njit
def calculate_fold(A, B, start_val):
    """
    高效计算递推列 D: D[0] = start_val, D[i] = D[i-1] * A[i] + B[i]
    注意:A 和 B 需为一维 float64 数组,且长度 ≥ 1
    """
    n = len(A)
    out = np.empty(n, dtype=np.float64)
    out[0] = start_val

    # 从索引 1 开始迭代(A[0] 和 B[0] 在本例中未被使用)
    for i in range(1, n):
        # 安全处理 NaN:若 A[i] 或 B[i] 为 NaN,则结果设为 NaN
        if np.isnan(A[i]) or np.isnan(B[i]):
            out[i] = np.nan
        else:
            out[i] = out[i-1] * A[i] + B[i]

    return out

# 执行计算(自动提取数值数组,跳过索引对齐开销)
df['D'] = calculate_fold(
    df['A'].to_numpy(dtype=np.float64, na_value=np.nan),
    df['B'].to_numpy(dtype=np.float64, na_value=np.nan),
    start_val=df.loc[0, 'C']  # 使用 C[0] 作为初始值,增强通用性
)

print(df)

输出结果:

Lemonaid
Lemonaid

AI音乐生成工具,在音乐领域掀起人工智能革命

下载
     A    B     C     D
0  NaN  NaN  10.0  10.0
1  0.5  3.0   NaN   8.0
2  0.5  4.0   NaN   8.0
3  0.5  1.0   NaN   5.0
4  0.5  2.0   NaN   4.5

关键优势说明

  • 性能飞跃:相比纯 Python 循环,Numba 编译后通常提速 10–100 倍;较 functools.reduce 或 iter 方案更稳定、内存友好;
  • 零依赖抽象:无需重构为矩阵幂或特殊数学变换(如本例中无闭式解),代码直译业务逻辑;
  • 生产就绪:支持 np.nan 安全处理、类型预声明、多维扩展(如按组分块计算);

⚠️ 注意事项

  • @njit 要求函数内仅使用 Numba 支持的 NumPy 操作和基础 Python 结构(禁用 pandas.Series, list.append 等);
  • 首次调用会触发编译(少量延迟),后续调用即达峰值性能;
  • 若需支持 groupby 场景,可封装为 df.groupby('group').apply(lambda g: pd.Series(calculate_fold(...))),但更优做法是先排序分组再批量传入 Numba 函数。

总结:当面对无法脱离顺序依赖的列生成任务时,“用 Numba 写一个紧致的 JIT 循环”不是妥协,而是兼顾可读性、可维护性与极致性能的务实之选。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

73

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

4

2026.01.31

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

211

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

58

2026.01.05

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

347

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1078

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

178

2025.09.12

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

15

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号