当前位置:首页 > 文章列表 > 文章 > python教程 > Python滚动函数教程:移动平均计算详解

Python滚动函数教程:移动平均计算详解

2025-07-16 08:15:25 0浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Python移动平均计算教程:rolling函数详解》,聊聊,我们一起来看看吧!

在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大小,这真是个艺术活,没有一劳永逸的答案。我通常会这么考虑:

首先,看你的数据频率和分析目的。 如果是日度数据,你想看短期波动,可能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滚动函数教程:移动平均计算详解》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

HTML文档类型声明详解HTML文档类型声明详解
上一篇
HTML文档类型声明详解
Redis数据安全防护全攻略
下一篇
Redis数据安全防护全攻略
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • SEO  简篇 AI 排版:3 秒生成精美文章,告别排版烦恼
    简篇AI排版
    SEO 简篇 AI 排版,一款强大的 AI 图文排版工具,3 秒生成专业文章。智能排版、AI 对话优化,支持工作汇报、家校通知等数百场景。会员畅享海量素材、专属客服,多格式导出,一键分享。
    5次使用
  • SEO  小墨鹰 AI 快排:公众号图文排版神器,30 秒搞定精美排版
    小墨鹰AI快排
    SEO 小墨鹰 AI 快排,新媒体运营必备!30 秒自动完成公众号图文排版,更有 AI 写作助手、图片去水印等功能。海量素材模板,一键秒刷,提升运营效率!
    4次使用
  • AI Fooler:免费在线AI音频处理,人声分离/伴奏提取神器
    Aifooler
    AI Fooler是一款免费在线AI音频处理工具,无需注册安装,即可快速实现人声分离、伴奏提取。适用于音乐编辑、视频制作、练唱素材等场景,提升音频创作效率。
    5次使用
  • 易我人声分离:AI智能音频处理,一键分离人声与背景音乐
    易我人声分离
    告别传统音频处理的繁琐!易我人声分离,基于深度学习的AI工具,轻松分离人声和背景音乐,支持在线使用,无需安装,简单三步,高效便捷。
    5次使用
  • 妙鸭相机:AI写真神器,一键生成你的专属数字分身
    妙鸭相机-AI帮你拍写真
    妙鸭相机,阿里巴巴旗下AI美学生活平台,用AI帮你拍写真、修图、换造型。上传照片,拥有专属数字分身,一键生成专业质感写真大片。
    4次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码