Python滚动函数教程:移动平均计算详解
时间:2025-07-16 08:15:25 220浏览 收藏
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里计算移动平均值,最常用也最方便的工具就是Pandas库里的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
了。

移动平均值在数据分析中有哪些实际应用场景?
移动平均值这东西,在数据分析里简直是万金油。我个人用得最多的,就是看趋势和去噪。
首先,趋势识别。比如分析股票价格,单看每天的涨跌,噪声太大,很难看出长期走向。但如果你算个20日或60日移动平均线,这条线就能很好地平滑掉短期的波动,让你一眼看出价格是在上涨、下跌还是盘整。在销售数据分析里也一样,用移动平均能帮你识别出季节性趋势或者产品生命周期。

其次,数据平滑与噪声消除。很多传感器数据或者实时系统的数据,往往会有一些瞬时的毛刺或异常值,这些噪声会干扰你对真实信号的判断。移动平均就像一个低通滤波器,能有效滤除高频噪声,让你看到数据背后的真实模式。比如工业生产线上的温度传感器数据,用移动平均可以避免因为单个异常读数而误判设备状态。
再来,支撑与阻力位判断(金融领域)。在技术分析中,移动平均线常被用作动态的支撑线或阻力线。当价格跌到某条移动平均线附近时可能获得支撑,反之则可能遇到阻力。这虽然是经验性的,但在很多交易策略里都有体现。
还有,基准线设定。比如在质量控制中,你可以计算一个产品某个关键指标的移动平均值作为基准,任何偏离这个基准太远的产品,可能就需要进一步检查。我甚至用它来分析用户行为数据,比如一个用户过去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学习网公众号也会发布文章相关知识,快来关注吧!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
388 收藏
-
230 收藏
-
135 收藏
-
102 收藏
-
267 收藏
-
190 收藏
-
181 收藏
-
202 收藏
-
239 收藏
-
355 收藏
-
297 收藏
-
260 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习