【时间序列】时序分析之移动平均-python实战
今天给大家讲解一下移动平均,其在时间序列分析中具有重要的作用。
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实战相关推荐
- 干货满满的 Python 实战项目,点赞收藏
作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编来给大家介绍3个干货满满的计算机视觉方向的Python实战项目,主要用到的库有 opencv-python numpy pillow 要是大家所 ...
- python语言type board_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题……...
针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...
- python 靶心_手把手教你使用Python实战反欺诈模型|原理+代码
原标题:手把手教你使用Python实战反欺诈模型|原理+代码 作者 | 萝卜 来源 | 早起Python(ID: zaoqi-python) 本文将基于不平衡数据,使用Python进行 反欺诈模型数据 ...
- 客户信贷评级 Python 实战
作者 | 萝卜 来源 | 早起Python(ID:zaoqi-python) 前言 大样本的数据集固然提供了丰富的信息,但也在一定程度上增加了问题的复杂性.如果我们分别对每个指标进行分析,往往得到的结 ...
- Python 实战多元线性回归模型,附带原理+代码
作者 | 萝卜 来源 | 早起Python( ID:zaoqi-python ) 「多元线性回归模型」非常常见,是大多数人入门机器学习的第一个案例,尽管如此,里面还是有许多值得学习和注意的地方.其中多 ...
- python wx窗口无法关闭_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题…...
针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...
- python项目归纳总结-这4个Python实战项目,让你瞬间读懂Python!
原标题:这4个Python实战项目,让你瞬间读懂Python! 来自:https://www.toutiao.com/a6593456515221291528/ Python 是一种极具可读性和通用性 ...
- python项目-这4个Python实战项目,让你瞬间读懂Python!
前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Pytho ...
- python教程下载地址-最新python实战教程网盘下载地址
原标题:最新python实战教程网盘下载地址 Python在程序员中始终流行:40%的受访者都会学习,44%的受访者每周都会学习.目前技术领域最热点的技术排名,排在前一位的是:Python.Pytho ...
- python有趣的小项目-有趣的十个Python实战项目,让你瞬间爱上Python!
前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Pytho ...
最新文章
- garch预测 python_【2019年度合辑】手把手教你用Python做股票量化分析
- ITK:将图像粘贴到另一个
- 2019 ICPC Asia Yinchuan Regional(9 / 13)
- 第五届蓝桥杯校内选拔赛试题java组_第五届蓝桥杯校内选拔赛试题java组
- Shell中的变量替换
- SiamFC代码分析(architecture、training、test)
- java 调停者模式_[Java教程]《JAVA与模式》之调停者模式
- 两台windows电脑通过以太网互ping
- 手把手教你用深度学习做物体检测(四):模型使用
- 电子邮件地址允许使用哪些字符?
- 如何先梳理业务逻辑再写代码
- 白嫖?给我也整一个!白嫖网易云游戏平台时长(网易云游戏平台自动签到)
- 用投影机控制软件2017 V3(可在多媒体教室代替遥控器中控机)
- c语言长方体体积float,如何在C语言中实现长方体体积的计算?
- 在android上模拟ios阴影效果
- 【Qt】 Fractal Designer 5.3 - Help(中文版)
- wordpress教程 – 修改增加默认文章阅读量的最简单办法
- PDF批量加水印及加密解密
- 最新的BAT大厂面试题整理(完整的问答模式)
- 世界排名前3名的Linux桌面系统,快如闪电!立马让老旧电脑变废为宝