讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

AniShort
AniShort

AI短剧协同制作平台

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

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

轻明姑娘_8476

轻明姑娘_8476

发布时间: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)

输出结果:

     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工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

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

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

360

2025.12.04

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

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

292

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

931

2026.04.13

lambda表达式
lambda表达式

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

1171

2023.09.15

python lambda函数
python lambda函数

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

345

2025.11.08

Python lambda详解
Python lambda详解

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

674

2026.01.05

C++ Lambda 表达式与函数式编程
C++ Lambda 表达式与函数式编程

深入讲解 C++ Lambda 表达式与函数式编程范式,涵盖 Lambda 基础语法与返回值推导、值捕获与引用捕获的区别与陷阱、初始化捕获(C++14 广义捕获)、泛型 Lambda(auto 参数)、mutable 关键字修改捕获变量、std::function 类型擦除与函数包装、std::bind 参数绑定(及其被 Lambda 替代的趋势)、Lambda 在 STL 算法(sort/transform/for_each/remo

849

2026.05.06

Java 函数式接口与 Lambda 进阶技巧
Java 函数式接口与 Lambda 进阶技巧

在 Java Stream 基础之上进一步深入函数式编程,涵盖 @FunctionalInterface 注解与自定义函数式接口设计、四种方法引用(静态/实例/对象/构造器)的使用场景、Lambda 中的 effectively final 变量捕获规则、函数组合(andThen/compose)与柯里化技巧、Comparator 链式比较器构建、CompletableFuture 异步函数式编排、Reactor / RxJava 响应

448

2026.05.08

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn