今天给大家讲解一下移动平均,其在时间序列分析中具有重要的作用。

1 简介

移动平均(moving average)主要应用于时间序列的分析,其能够去除不同时间步长的序列间的微小差异。

移动平均的目的是去除噪声

移动平均需要指定一个窗口大小(window size),称为窗口宽度(window width)。这定义了用于计算移动平均值的原始观测值的数量。

移动是指由窗宽定义的窗口沿时间序列滑动,计算新序列的平均值。

移动平均主要有两种形式:居中和截尾移动平均(Centered and Trailing Moving Average)。

居中移动平均

t 时刻的值计算由原始观测值在 t 时刻、之前和之后的平均值。

假设窗口为3,则:

center_ma(t) = mean(obs(t-1),obs(t),obs(t+1))

这个方法需要用到未来值。可以作为一种从时间序列中去除趋势和季节成分的通用方法,而在预测时通常不能使用这种方法。

截尾移动平均

t 时刻的值计算由原始观测值在 t 时刻以及之前的平均值。

假设窗口为3,则:

trail_ma(t) = mean(obs(t-2),obs(t-1),obs(t))

这个方法只用到历史数据,并可以用于时间序列预测。

本文主要侧重于截尾移动平均。

在应用移动平均时,需要对数据提出一些假设。假设趋势和季节成分已经从时序中去除。意味着数据是平稳的(stationary)或者未显示出明显的趋势(长期增长或下降)和季节性(一致的周期性结构)。

在时序数据预测时,有很多方法可以去除趋势和季节性,主要有差分法(differencing method)和建立行为模型,并显式地从序列中减去它。

接下来从三个面讲解截尾平均移动的应用。

2 移动平均的应用

2.1 数据准备

数据集是总共有365条记录,数据记录的是1959年加州每日出生的女婴数量。

链接:https://pan.baidu.com/s/1SpDi0oT-6jqKmAT4JwC0TA

提取码:6ylx

数据:daily-total-female-births.csv

代码:moving_average.py

显示数据的前5条记录:

Date,Births
1959/1/1,35
1959/1/2,32
1959/1/3,30
1959/1/4,31
1959/1/5,44

移动平均可以作为一种数据准备技术来创建原始数据集的平滑版本。

平滑(smoothing)是一种有用的数据准备技术,因为它可以减少观测中的随机变化。

pandas 中的 rolling() 函数可以自动根据窗口大小对观测数据进行移动平均。

假设窗口大小为3,则 t 时刻的转换值等于前三个观测值(t-2,t-1,t)的均值。

trans_obs(t) = 1/3 * ( obs(t-2) + obs(t-1) + obs(t) )

现在开始正式分析:

# 引入相关的包
import pandas as pd  # 表格和数据操作
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import mean_squared_error# -------------------------------------------------------------------------------------
# 读入数据
birth = pd.read_csv(r'./test/daily-total-female-births.csv', index_col=['Date'], parse_dates=['Date'])
birth.info()
birth.head()
plt.figure(figsize=(15, 7))
plt.plot(birth)

从上图可以看出,这个数据集是研究移动平均方法的一个很好的例子,因为它没有显示任何明显的趋势或季节性。

下面是在窗口大小为3 的情况下的移动平均值。

window = 3
# trail-rolling average transform
rolling = birth.rolling(window=window)
rolling_mean = rolling.mean()
plt.figure(figsize=(15, 7))
plt.plot(birth)
plt.plot(rolling_mean, 'r')

从图中可以看出,原始观测值(蓝色)被移动平均转换值(红色)覆盖。

rolling_mean.head()
               Births
Date
1959-01-01        NaN
1959-01-02        NaN
1959-01-03  32.333333
1959-01-04  31.000000
1959-01-05  35.000000

移动平均值的前两个观测值是 NaN,因为前两个观测值的时间点在移动时缺少前面时刻的数据。这两个转换值需被删除。

2.2 特征工程

当建立时序预测模型可以被看做为监督学习问题时,移动平均可以作为新信息的来源。

在本例中移动平均计算得到的值可以作为一个新的特征。

lag1 = birth.shift(1)
lag3 = birth.shift(3)
lag3_mean = lag3.rolling(window=window).mean()
df = pd.concat([lag3_mean, lag1, lag3], axis=1)
df.columns = ['lag3_mean', 't-1', 't-3']df.head()

这里的 df 相当于是特征,本例中有三个特征,当把时序预测模型看做是监督问题时,此时的 Y 就是原始观测值 (Births):

                  lag3_mean   t-1   t-3  Births
Date
1959-01-01        NaN   NaN   NaN      35
1959-01-02        NaN  35.0   NaN      32
1959-01-03        NaN  32.0   NaN      30
1959-01-04        NaN  30.0  35.0      31
1959-01-05        NaN  31.0  32.0      44
1959-01-06  32.333333  44.0  30.0      29

在建模时,将有NaN的行删除后再建模。

2.3 预测

移动平均值可以直接看做是预测值。

这是一个最基础的模型,其假设时间序列的趋势和季节性成分已经被删除或调整。

移动平均作为预测模型是直接向前走的形式,当有新的观测值,则这个模型会更新并预测。

# prepare situation
X = birth.values
history = [X[i] for i in range(window)]
test = [X[i] for i in range(window, len(X))]
predictions = []# walk forward over time steps in test
for t in range(len(test)):length = len(history)yhat = np.mean([history[i] for i in range(length - window, length)])predictions.append(yhat)history.append(test[t])print('predicted=%f, excepted=%f' % (yhat, test[t]))error = mean_squared_error(test, predictions)
print('Test MSE: %3f' % error)
plt.figure(figsize=(15, 7))
plt.plot(test)
plt.plot(predictions, 'r')

以上就是移动平均的相关知识,希望对你有用。

建议阅读:

高考失利之后,属于我的大学本科四年

【资源分享】对于时间序列,你所能做的一切.

【时空序列预测第一篇】什么是时空序列问题?这类问题主要应用了哪些模型?主要应用在哪些领域?

【AI蜗牛车出品】手把手AI项目、时空序列、时间序列、白话机器学习、pytorch修炼

公众号:AI蜗牛车保持谦逊、保持自律、保持进步个人微信
备注:昵称+学校/公司+方向
如果没有备注不拉群!
拉你进AI蜗牛车交流群

【时间序列】时序分析之移动平均-python实战相关推荐

  1. 干货满满的 Python 实战项目,点赞收藏

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编来给大家介绍3个干货满满的计算机视觉方向的Python实战项目,主要用到的库有 opencv-python numpy pillow 要是大家所 ...

  2. python语言type board_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题……...

    针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...

  3. python 靶心_手把手教你使用Python实战反欺诈模型|原理+代码

    原标题:手把手教你使用Python实战反欺诈模型|原理+代码 作者 | 萝卜 来源 | 早起Python(ID: zaoqi-python) 本文将基于不平衡数据,使用Python进行 反欺诈模型数据 ...

  4. 客户信贷评级 Python 实战

    作者 | 萝卜 来源 | 早起Python(ID:zaoqi-python) 前言 大样本的数据集固然提供了丰富的信息,但也在一定程度上增加了问题的复杂性.如果我们分别对每个指标进行分析,往往得到的结 ...

  5. Python 实战多元线性回归模型,附带原理+代码

    作者 | 萝卜 来源 | 早起Python( ID:zaoqi-python ) 「多元线性回归模型」非常常见,是大多数人入门机器学习的第一个案例,尽管如此,里面还是有许多值得学习和注意的地方.其中多 ...

  6. python wx窗口无法关闭_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题…...

    针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...

  7. python项目归纳总结-这4个Python实战项目,让你瞬间读懂Python!

    原标题:这4个Python实战项目,让你瞬间读懂Python! 来自:https://www.toutiao.com/a6593456515221291528/ Python 是一种极具可读性和通用性 ...

  8. python项目-这4个Python实战项目,让你瞬间读懂Python!

    前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Pytho ...

  9. python教程下载地址-最新python实战教程网盘下载地址

    原标题:最新python实战教程网盘下载地址 Python在程序员中始终流行:40%的受访者都会学习,44%的受访者每周都会学习.目前技术领域最热点的技术排名,排在前一位的是:Python.Pytho ...

  10. python有趣的小项目-有趣的十个Python实战项目,让你瞬间爱上Python!

    前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Pytho ...

最新文章

  1. garch预测 python_【2019年度合辑】手把手教你用Python做股票量化分析
  2. ITK:将图像粘贴到另一个
  3. 2019 ICPC Asia Yinchuan Regional(9 / 13)
  4. 第五届蓝桥杯校内选拔赛试题java组_第五届蓝桥杯校内选拔赛试题java组
  5. Shell中的变量替换
  6. SiamFC代码分析(architecture、training、test)
  7. java 调停者模式_[Java教程]《JAVA与模式》之调停者模式
  8. 两台windows电脑通过以太网互ping
  9. 手把手教你用深度学习做物体检测(四):模型使用
  10. 电子邮件地址允许使用哪些字符?
  11. 如何先梳理业务逻辑再写代码
  12. 白嫖?给我也整一个!白嫖网易云游戏平台时长(网易云游戏平台自动签到)
  13. 用投影机控制软件2017 V3(可在多媒体教室代替遥控器中控机)
  14. c语言长方体体积float,如何在C语言中实现长方体体积的计算?
  15. 在android上模拟ios阴影效果
  16. 【Qt】 Fractal Designer 5.3 - Help(中文版)
  17. wordpress教程 – 修改增加默认文章阅读量的最简单办法
  18. PDF批量加水印及加密解密
  19. 最新的BAT大厂面试题整理(完整的问答模式)
  20. 世界排名前3名的Linux桌面系统,快如闪电!立马让老旧电脑变废为宝

热门文章

  1. 联想台式主机拆机教程_联想一体机拆机图解 联想一体机电脑该怎么拆机
  2. 二阶有源带通滤波器滤波原理
  3. 尚学堂马士兵老师的JAVA自学之路
  4. matlab对控制系统进行时域和频域联合分析
  5. 专业SMT贴片螺母生产厂家|支持贴片螺母非标定制符合产品要求
  6. 网络监测用计算机安全管理制度,计算机信息网络安全管理制度
  7. 记录一下Mac浏览器劫持searchbaron.com的经历
  8. el-table 样式自定义
  9. smartdrv.exe的使用及简单说明和相关程序下载
  10. 查看本地MSN帐号和密码