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

星夢妙者

星夢妙者

2025-07-15

960人浏览

原创

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如何计算移动平均值?rolling函数使用教程

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

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

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

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

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

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

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

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

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

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

ApiPost接口调试与文档生成工具
ApiPost接口调试与文档生成工具

ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键

下载

首先,看你的数据频率和分析目的。 如果是日度数据,你想看短期波动,可能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的这些功能已经足够强大,能覆盖绝大多数场景了。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python 聚合函数

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

相关专题

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

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

2025.12.04

149

15

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

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

2026.01.31

129

21

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

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

2026.04.13

69

25

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

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

2023.11.20

1057

5

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

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

2024.06.04

1659

7

火山引擎API接入教程
火山引擎API接入教程

火山引擎API接入适合需要在应用、脚本、后台服务或AI工具中调用火山引擎能力的开发者参考。本专题整理控制台入口、服务开通、API Key获取、接口地址配置、请求参数填写、调用测试、权限设置、额度查询和常见接口报错排查。

2026.08.04

0

10

火山引擎DeepSeek API调用教程
火山引擎DeepSeek API调用教程

火山引擎DeepSeek API适合需要在应用、脚本、智能体或AI编程工具中调用DeepSeek模型的开发者参考。本专题整理火山引擎控制台入口、模型服务开通、API Key获取、Base URL配置、模型名称填写、调用测试、额度查询和常见接口报错排查。

2026.08.04

0

10

火山引擎控制台操作教程
火山引擎控制台操作教程

火山引擎控制台中常用功能包括API密钥管理、模型调用配置、云资源查看、账单明细、用量统计和权限分配。本专题整理控制台基础操作、服务开通流程、Key创建与保存、费用消耗查看、子账号权限设置和调用失败排查,方便开发者完成日常管理。

2026.08.04

0

10

PDF与PPT格式转换操作方法及在线转换技巧
PDF与PPT格式转换操作方法及在线转换技巧

本专题聚焦 PDF 与 PPT 文件格式转换需求,整理 PDF 转 PPT 在线转换方法、PPT 批量转换 PDF 操作步骤、转换后格式错乱处理以及文档版式检查技巧。通过详细教程帮助用户掌握 PDF、PPT 双向转换方法,解决演示文稿制作、文件整理和办公格式转换中的常见问题,提高办公效率。

2026.07.31

112

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习