0

0

Python如何计算移动平均值?rolling函数使用教程

星夢妙者

星夢妙者

发布时间:2025-07-15 13:30:03

|

880人浏览过

|

来源于php中文网

原创

python中计算移动平均值最常用的方法是使用pandas库的rolling函数。1. 导入pandas和numpy;2. 创建一个series或dataframe;3. 使用rolling函数并指定window参数来定义窗口大小;4. 调用mean()方法计算移动平均值;5. 可通过设置min_periods参数处理窗口数据不足的情况。rolling函数还可用于sum、std、median等多种聚合操作,甚至支持自定义函数。选择窗口大小需权衡平滑度与响应速度,并结合数据频率和分析目标。此外,pandas还支持指数移动平均(ema),但使用的是ewm()方法而非rolling。

Python如何计算移动平均值?rolling函数使用教程

在Python里计算移动平均值,最常用也最方便的工具就是Pandas库里的rolling函数。说白了,它就是给你一个数据序列,然后你告诉它一个“窗口”大小,它就会在这个窗口里滑动,计算出每个窗口内的平均值。这功能在处理时间序列数据时简直是利器,比如你想平滑股价波动,或者看看某个指标的长期趋势,它都能帮上大忙。

Python如何计算移动平均值?rolling函数使用教程

解决方案

要用Pandas的rolling函数计算移动平均值,步骤其实挺直观的。首先,你需要有Pandas库,然后创建一个Series或者DataFrame。

import pandas as pd
import numpy as np

# 创建一个示例Series
# 假设这是一段时间内的某种观测值,比如每日销售额
data = pd.Series([10, 12, 15, 13, 18, 20, 22, 19, 25, 23, 28, 30])

# 计算5日的简单移动平均(SMA)
# window=5 表示窗口大小是5个数据点
# min_periods=1 表示即使数据不足5个,只要有1个数据点就开始计算(通常用于序列开头)
# 如果不设置min_periods,默认是window大小,那样前面几个值会是NaN
moving_avg = data.rolling(window=5, min_periods=1).mean()

print("原始数据:\n", data)
print("\n5日移动平均:\n", moving_avg)

# 如果是DataFrame,你可以对特定列进行操作
df = pd.DataFrame({
    'Date': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05',
                            '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10']),
    'Price': [100, 102, 101, 105, 103, 106, 108, 107, 109, 110]
})

# 计算'Price'列的3日移动平均
df['3_day_moving_avg'] = df['Price'].rolling(window=3, min_periods=1).mean()

print("\n原始DataFrame:\n", df)
print("\n带有3日移动平均的DataFrame:\n", df[['Date', 'Price', '3_day_moving_avg']])

# 你还可以通过设置center=True让窗口居中,但这会导致结果向两端延伸,需要注意NaN的处理
# df['3_day_moving_avg_centered'] = df['Price'].rolling(window=3, min_periods=1, center=True).mean()
# print("\n居中3日移动平均:\n", df[['Date', 'Price', '3_day_moving_avg_centered']])

这里头,window参数决定了你希望计算多少个数据点的平均值。min_periods则是个挺实用的参数,它告诉你,即使窗口里数据不够window设定的个数,只要达到min_periods的个数,就给我算。这对于序列开头的数据特别有用,不然前几个值就都是NaN了。

立即学习Python免费学习笔记(深入)”;

Python如何计算移动平均值?rolling函数使用教程

移动平均值在数据分析中有哪些实际应用场景?

移动平均值这东西,在数据分析里简直是万金油。我个人用得最多的,就是看趋势和去噪。

首先,趋势识别。比如分析股票价格,单看每天的涨跌,噪声太大,很难看出长期走向。但如果你算个20日或60日移动平均线,这条线就能很好地平滑掉短期的波动,让你一眼看出价格是在上涨、下跌还是盘整。在销售数据分析里也一样,用移动平均能帮你识别出季节性趋势或者产品生命周期。

Python如何计算移动平均值?rolling函数使用教程

其次,数据平滑与噪声消除。很多传感器数据或者实时系统的数据,往往会有一些瞬时的毛刺或异常值,这些噪声会干扰你对真实信号的判断。移动平均就像一个低通滤波器,能有效滤除高频噪声,让你看到数据背后的真实模式。比如工业生产线上的温度传感器数据,用移动平均可以避免因为单个异常读数而误判设备状态。

再来,支撑与阻力位判断(金融领域)。在技术分析中,移动平均线常被用作动态的支撑线或阻力线。当价格跌到某条移动平均线附近时可能获得支撑,反之则可能遇到阻力。这虽然是经验性的,但在很多交易策略里都有体现。

还有,基准线设定。比如在质量控制中,你可以计算一个产品某个关键指标的移动平均值作为基准,任何偏离这个基准太远的产品,可能就需要进一步检查。我甚至用它来分析用户行为数据,比如一个用户过去7天的平均活跃度,可以作为判断他是否流失的指标。

说到底,移动平均就是一种“看整体,不纠结局部”的思维方式在数据上的体现。它能帮你从纷繁复杂的数据点中,抽离出更稳定、更有意义的信息。

如何选择合适的滚动窗口大小(window size)?

选择window大小,这真是个艺术活,没有一劳永逸的答案。我通常会这么考虑:

IBM Watson
IBM Watson

IBM Watson文字转语音

下载

首先,看你的数据频率和分析目的。 如果是日度数据,你想看短期波动,可能3日、5日移动平均就够了;如果想看中期趋势,20日、30日甚至60日移动平均会更合适。如果是季度销售数据,那可能4个季度(一年)的移动平均更有意义,能消除季节性影响。窗口越大,平滑效果越好,但对数据变化的响应就越慢;窗口越小,响应越快,但平滑效果就越差,更容易受到噪声影响。这是一个经典的平滑度与响应速度的权衡。

其次,结合领域知识。 你在分析什么数据?这个领域有没有约定俗成的周期?比如股票市场,20日均线(月线)和60日均线(季线)就是常见的参考。在某些工业生产中,一个生产周期是多久?这些都可能成为你选择window大小的依据。

然后,尝试和可视化。 最直接的方法就是多试几个window大小,然后把结果画出来看看。肉眼观察哪条线最能反映你想要捕捉的趋势,同时又不会过于滞后或过于抖动。我发现,很多时候,最佳的window大小是通过反复试验和对结果的直观感受来确定的。没有哪个数学公式能完美解决这个问题。

最后,考虑min_periods 我前面提过,min_periods可以让你在窗口数据不足时也计算结果。如果你对序列开头的准确性要求不高,或者数据量很大,可以不设min_periods(让它默认等于window大小),这样能保证每个计算出来的平均值都是基于完整窗口的数据。但如果你的数据序列比较短,或者序列开头的数据也很重要,那就需要把min_periods设置得小一些,比如1。

我个人在做数据探索的时候,会先从一个比较小的窗口(比如数据频率的2-3倍)开始,然后逐渐增大,直到曲线看起来足够平滑,但又没有丢失重要的拐点信息。

除了简单移动平均(SMA),Pandas的rolling函数还能计算哪些类型的移动平均?

Pandas的rolling函数远不止计算简单移动平均(SMA)那么简单。它实际上提供了一个“滚动窗口”的框架,你可以在这个窗口里执行各种聚合操作。

最常见的,除了mean()(平均值),你还可以用:

  • sum():计算滚动窗口内的总和。比如,计算过去7天的总销售额。
  • std():计算滚动窗口内的标准差。这在分析数据的波动性时非常有用,比如股票价格的波动性。
  • var():计算滚动窗口内的方差。和标准差类似,也是衡量波动性的指标。
  • min():计算滚动窗口内的最小值。
  • max():计算滚动窗口内的最大值。
  • median():计算滚动窗口内的中位数。中位数对异常值不那么敏感,有时候比平均值更能反映数据的中心趋势。
  • count():计算滚动窗口内的非NaN值的数量。

这些都是内置的聚合函数,用起来非常方便。

# 示例:使用不同的聚合函数
data_series = pd.Series([10, 12, 15, np.nan, 18, 20, 22, 19, 25, 23, 28, 30])

print("原始数据:\n", data_series)
print("\n5日滚动和:\n", data_series.rolling(window=5, min_periods=1).sum())
print("\n5日滚动标准差:\n", data_series.rolling(window=5, min_periods=1).std())
print("\n5日滚动最大值:\n", data_series.rolling(window=5, min_periods=1).max())

更高级一点,你还可以用apply()方法来应用任何自定义函数到滚动窗口上。这意味着你可以实现非常复杂的滚动计算,只要你的函数能接受一个Series(代表当前窗口的数据)并返回一个标量值。

# 示例:使用apply计算滚动加权平均
# 假设我们想给最近的数据更高的权重
def weighted_mean(window_data):
    weights = np.arange(1, len(window_data) + 1) # 简单的线性权重
    return (window_data * weights).sum() / weights.sum()

print("\n5日滚动加权平均:\n", data_series.rolling(window=5, min_periods=1).apply(weighted_mean, raw=False))

这里需要注意,raw=False参数表示将窗口数据作为Series传递给weighted_mean函数。

至于指数移动平均(EMA),虽然它也是一种移动平均,但Pandas通常不通过rolling函数直接实现,而是提供了专门的ewm()(Exponential Weighted Moving)方法。ewm的计算方式和rolling的固定窗口平均不同,它会给近期数据更大的权重,并且权重是指数衰减的。如果你需要EMA,直接用df.ewm(...).mean()会更符合预期。但从广义的“移动平均”概念来说,rolling的这些功能已经足够强大,能覆盖绝大多数场景了。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

78

2025.12.04

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

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

32

2026.01.31

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

传感器故障解决方法
传感器故障解决方法

传感器故障排除指南:识别故障症状(如误读或错误代码)。检查电源和连接(确保连接牢固,无损坏)。校准传感器(遵循制造商说明)。诊断内部故障(目视检查、信号测试、环境影响评估)。更换传感器(选择相同规格,遵循安装说明)。验证修复(检查信号准确性,监测异常行为)。

498

2024.06.04

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

216

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

412

2026.03.04

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

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