[深度学习项目] - 时间序列预测 (2)
文章目录
- abstract
- 可视化
- 读入数据
- 简单时序图
- 季节性时序图
- 季节性箱线图
- 趋势箱线图
- 时序的主要成分
- statsmodels 安装
- 周期检验
- STL算法介绍
- Homework
- 简单时序图
- 季节时序图
- 季节箱线图
- 趋势箱线图
- ACF查看周期
- STL 检测
abstract
- 时间序列可视化
- 时间序列的四个主要成分: 趋势,季节性(周期性),外部变量,噪音
- 计算时间序列的自相关性系数,根据自相关性系数判断季节性
- 掌握STL算法分解时间序列
可视化
读入数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 设置pandas 显示行数和列数
pd.options.display.max_rows = 400
pd.options.display.max_columns = None# 忽略 warnings
import warnings
warnings.filterwarnings("ignore")
# jupyter notebook 可以安装 nbextensionsdf_price = pd.read_csv("stock_price.csv", parse_dates=["date"])
# print(df_price.head(2))
df_sales = pd.read_csv("store_sales.csv", parse_dates=["week"])
# print(df_sales.head(2))
简单时序图
时间-观测值之间的关系
######## 简单时序图
### 股价
company = df_price["company"].drop_duplicates().tolist()
print(company)
for every_company in company:data_company = df_price[ df_price["company"]==every_company ].sort_values("date")plt.plot( data_company["date"], data_company["price"] ,".-" )plt.xticks(rotation=90)
plt.legend(company)
plt.show()
从简单时序图中,我们可以看到每个公司的上升/下降/持平趋势。 但是因为这是10年的数据,没办法展示短时间内的股价变化情况。因此可以查看更短时间(2年内)的股价变化情况。
###### 阶段性 简单时序图
date_start = "2020-01-01"
date_end = "2021-12-31"company = df_price[ (df_price["date"]>=date_start) &(df_price["date"]<=date_end)]["company"].drop_duplicates().tolist()
print(company)
for every_company in company:data_company = df_price[ (df_price["company"]==every_company) &(df_price["date"]>=date_start) &(df_price["date"]<=date_end)].sort_values("date")plt.plot( data_company["date"], data_company["price"] ,".-" )plt.xticks(rotation=90)
plt.legend(company)
plt.show()
在更短的时间内,我们可以看到股价的尺寸波动情况(噪声)。 另外没有发现明显的周期性。
######## 简单时序图
### 销量
depts = df_sales[ df_sales["store"]==1 ]["dept"].drop_duplicates().tolist()
for every_dept in depts:data_dept = df_sales[ (df_sales["store"]==1) &(df_sales["dept"]==every_dept)].sort_values("week")plt.plot( data_dept["week"], data_dept["sales"] ,".-" )plt.xticks(rotation=90)
plt.legend(depts)
plt.title("sales in store 1")
plt.show()
data_sales = df_sales[ (df_sales["store"]==1) & (df_sales["dept"]==1) ].sort_values("week")
plt.plot( data_sales["week"], data_sales["sales"], ".-" )
plt.xticks(rotation=90)
plt.show()
我们可以看到,门店的每个部门销量是存在明显的周期性的。但是明显的周期性波动 使得销量的长期趋势 展示不够明显。 以及周期性的具体周期数值是多少,也需要进一步统计。另外周期的高峰和低估等数据也需要分析。
季节性时序图
季节时序图用于分析 周期性的一些特征。 在一个周期中,高峰和低估出现的阶段和数值大小。
因为销量的周期就是一年,因此直接按照每年来划分数据,看每年中 销量在每年的不同周的变化。
# 季节性时序图df_salse1_1 = df_sales[ (df_sales["store"]==1)&(df_sales["dept"]==1) ].sort_values("week")df_year = df_salse1_1["week"].dt.year.unique().tolist()
df_salse1_1["week_of_year"] = df_salse1_1["week"].dt.weekofyear
df_salse1_1["year"] = df_salse1_1["week"].dt.yearprint(df_year)
for every_year in df_year:data_year = df_salse1_1[ df_salse1_1["year"] ==every_year ]plt.plot( data_year["week_of_year"], data_year["sales"],".-" )
plt.legend( df_year )
plt.show()
可以看到在 第19周 到 43周 都是销售的低谷。 而第8周,第12周,第43周会出现销售的短时间高峰。 而且 第12周的高峰有一定对的错开,说明可能与一些外部因素(过年时间,节气,促销活动等有关,得到一些有影响性的外部变量)。
季节性箱线图
# 季节性箱线图df_salse1_1 = df_sales[ (df_sales["store"]==1)&(df_sales["dept"]==1) ].sort_values("week")df_year = df_salse1_1["week"].dt.year.unique().tolist()
df_salse1_1["week_of_year"] = df_salse1_1["week"].dt.weekofyear
data_boxplot = df_salse1_1.groupby( ["week_of_year"] ).agg(list).reset_index()
# print(data_boxplot["sales"].values )
plt.boxplot( data_boxplot["sales"].values, labels=data_boxplot["week_of_year"].values )
plt.show()
均值,最大值,最小值,二十五分位数,七十五分位数。
趋势箱线图
# 趋势箱线图
df_salse1_1 = df_sales[ (df_sales["store"]==1)&(df_sales["dept"]==1) ].sort_values("week")
df_salse1_1["year"] = df_salse1_1["week"].dt.year
df_salse1_1["week_of_year"] = df_salse1_1["week"].dt.weekofyeardata_boxplot = df_salse1_1[ (df_salse1_1["week_of_year"]>=19)&(df_salse1_1["week_of_year"]<=43)]data_boxplot = data_boxplot.groupby( ["year"] )["sales"].agg(list).reset_index()
plt.boxplot( data_boxplot["sales"].values, labels=data_boxplot["year"].values )
plt.show()
我们只使用 第19周到43周的数据,这样子可以反应 销售低估时期,不同年的趋势。
时序的主要成分
statsmodels 安装
statsmodels
周期检验
自相关系数检验(ACF) 【具体内容待查找】
rh=Cor(Xt,Xt+h),everytr_h=Cor(X_t,X_{t+h}),every\ trh=Cor(Xt,Xt+h),every t
Cor(Xt,Xt+h)=E[(Xt−μt)(Xt+h−μt+h)]σ(Xt)σ(Xt+h)Cor(X_t,X_{t+h})=\frac{E[ (X_t - \mu_{t})(X_{t+h}-\mu_{t+h}) ]}{\ \sigma(X_t)\sigma(X_{t+h}) }Cor(Xt,Xt+h)= σ(Xt)σ(Xt+h)E[(Xt−μt)(Xt+h−μt+h)]
当我们改变h,用于计算不同的h下 序列XtX_tXt与序列Xt+hX_{t+h}Xt+h之间的相关性。 如果在时间T下存在周期性,那么在T,2T,…,nTT,2T,\dots,nTT,2T,…,nT下都存在周期性, 都会有较强的相关性系数。
因此,只有T,2T,…,nTT,2T,\dots,nTT,2T,…,nT下都存在 较高的 相关性系数,那么才能说明 周期性是T。
# ACF检验
from statsmodels.graphics.tsaplots import plot_acf
df_salse1_1 = df_sales[ (df_sales["store"]==1)&(df_sales["dept"]==1) ].sort_values("week")
plot_acf( df_salse1_1["sales"],lags=140 )
plt.show()
STL算法介绍
STL: “Seasonal and Trend decomposition using Loess”
将时间序列分解成季节性,趋势项,剩余项
剩余项使用线性,非线性回归的方式拆解为 外部变量的影响与残差。
from statsmodels.tsa.seasonal import STL
stl = STL( df_salse1_1["sales"].values, period=52 )
res = stl.fit()
res.plot()
plt.show()#res.trend
#res.seasonal
#res.residual
我们可以看到,趋势项和之前的 趋势箱线图较为相似; 季节性中的周期性:在年初和年末都是有高峰期,在年中是低谷期。
但是实际上 周期性是由于 外部变量(促销互动等)造成的,实际上也是残差中的一部分。
Homework
简单时序图
data_sales = df_sales[ (df_sales["store"]==1) & (df_sales["dept"]==9) ].sort_values("week")
plt.plot( data_sales["week"], data_sales["sales"], ".-" )
plt.xticks(rotation=90)
plt.show()
季节时序图
df_salse1_1 = df_sales[ (df_sales["store"]==1)&(df_sales["dept"]==9) ].sort_values("week")df_year = df_salse1_1["week"].dt.year.unique().tolist()
df_salse1_1["week_of_year"] = df_salse1_1["week"].dt.weekofyear
df_salse1_1["year"] = df_salse1_1["week"].dt.year# print(df_year)
for every_year in df_year:data_year = df_salse1_1[ df_salse1_1["year"] ==every_year ]plt.plot( data_year["week_of_year"], data_year["sales"],".-" )
plt.legend( df_year )
plt.show()
可以看到 还是每年会存在 周期性的重叠。 但和1-1有较大的区别。 1-9中每年的起伏波动比较大。第35周至54周每周都波动剧烈。
季节箱线图
df_salse1_1 = df_sales[ (df_sales["store"]==1)&(df_sales["dept"]==9) ].sort_values("week")df_year = df_salse1_1["week"].dt.year.unique().tolist()
df_salse1_1["week_of_year"] = df_salse1_1["week"].dt.weekofyear
data_boxplot = df_salse1_1.groupby( ["week_of_year"] ).agg(list).reset_index()
# print(data_boxplot["sales"].values )
plt.boxplot( data_boxplot["sales"].values, labels=data_boxplot["week_of_year"].values )
plt.xticks(rotation=90)
plt.show()
可以看到 大部分时间的方差较小,说明每年的相同时间差别不是很大;但具体上升还是下降,可以根据 趋势箱线图查看。
趋势箱线图
df_salse1_1 = df_sales[ (df_sales["store"]==1)&(df_sales["dept"]==9) ].sort_values("week")
df_salse1_1["year"] = df_salse1_1["week"].dt.year
df_salse1_1["week_of_year"] = df_salse1_1["week"].dt.weekofyear
data_boxplot = df_salse1_1data_boxplot = data_boxplot.groupby( ["year"] )["sales"].agg(list).reset_index()
plt.boxplot( data_boxplot["sales"].values, labels=data_boxplot["year"].values )
plt.show()
可以看到 2010年到2011年稍有增长,2012年上涨幅度较大。
ACF查看周期
df_salse1_1 = df_sales[ (df_sales["store"]==1)&(df_sales["dept"]==9) ].sort_values("week")
plot_acf( df_salse1_1["sales"],lags=140 )
plt.show()
从ACF可以看到,每个26周,都会有加大的波动。但是在最后一个时刻130周,ACF较低。同时每半年进行 季节性时序图和箱线图分析,方差较大。 因此认为周期为一年比较恰当。
STL 检测
df_salse1_1 = df_sales[ (df_sales["store"]==1)&(df_sales["dept"]==9) ].sort_values("week")
stl = STL( df_salse1_1["sales"].values, period=52 )
res = stl.fit()
res.plot()
plt.show()
我们可以看到 整体趋势和 趋势箱线图一致。 对于季节性趋势,每年存在周期性。另外每一年内 前半部分趋势较为平缓,后半部分波动较大。
同时根据残差图,我们可以看到 在第二年中 方差波动最大,说明三年中存在 外部变量波动较为剧烈。
同时周期中 存在一些外部变量 影响每年内的变化。
[深度学习项目] - 时间序列预测 (2)相关推荐
- [深度学习项目] - 时间序列预测 (5)[待补充]
基于RNN的时序预测 基于LSTM的时序预测: 输入数据时 输入的 y t y_t yt和 x t + 1 x_{t+1} xt+1之间存在一个时间差. DeepAR 和 MQRNN 都可以实现时 ...
- [深度学习项目] - 时间序列预测 (4)
Prophet 算法 只需要有基本的建模知识即可 有较强的可解释性和可视化支持 能作为大部分时间序列预测的benchmark 模型结构: 关于时间的广义线性模型 y ( t ) = g ( t ) + ...
- 深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战 LSTM(Long Short Term Memory Network)长短时记忆网络,是一种改进之后的循环神经网 ...
- 深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见 ...
- 深度学习多变量时间序列预测:Encoder-Decoder LSTM算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:Encoder-Decoder LSTM算法构建时间序列多变量模型预测交通流量+代码实战 LSTM是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要 ...
- 深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战 卷积神经网络,听起来像是计算机科学.生物学和数学的诡异组合,但它们已经成为计算机视觉领域中最具影响力 ...
- 深度学习多变量时间序列预测:GRU算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:GRU算法构建时间序列多变量模型预测交通流量+代码实战 GRU是LSTM网络的一种效果很好的变体,它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常流形的一种 ...
- matlab使用深度学习进行时间序列预测
使用深度学习进行时间序列预测 - MATLAB & Simulink - MathWorks 中国 Deep Learning Toolbox 快速入门 - MathWorks 中国
- 基于深度学习的时间序列预测方法
之前对时间序列预测的方法大致梳理了一下,最近系统的学习了深度学习,同时也阅读了一些处理序列数据的文献,发现对于基于深度学习的时间序列预测的方法,还可以做进一步细分:RNN.Attention和TCN. ...
- 基于深度学习的时间序列预测
# 技术黑板报 # 第十一期 推荐阅读时长:15min 前言 时间序列建模历来是学术和工业界的关键领域,比如用于气候建模.生物科学和医学等主题应用,零售业的商业决策和金融等.虽然传统的统计方法侧重于从 ...
最新文章
- Python3中raise用法
- 圆桌讨论:人工智能的未来
- 2张图片就能「算出」一段视频,Reddit网友都惊呆了 | 旷视北大出品
- pymongo连接mongodb的replset
- linux卸载桌面Ubuntu,Ubuntu安装卸载KDE桌面之折腾记
- 日常生活 -- 开博二周年
- leetcode1052. 爱生气的书店老板(滑动窗口)
- 电脑显示连接了网络但是不能上网_为什么电脑插上网线显示已连接却上不了网...
- Maven打包时报Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war解决方案
- 拓端tecdat:R语言KMEANS均值聚类和层次聚类:亚洲国家地区生活幸福质量异同可视化分析和选择最优聚类数
- js 生成二维码及打印
- u盘内存怎么测试软件,怎么使用U盘启动盘进行内存测试?电脑内存测试工具使用方法...
- 正面管教:不凶不吼教出好孩子读后感
- ACM-ICPC 2018 沈阳赛区网络预赛 F题 Fantastic Graph
- 免费的二维码图片生成API接口和使用
- bzero()与 memset()等的区别
- Anaconda之通过可视化界面配置虚拟环境
- matlab亥姆霍兹线圈叠加原理,亥姆霍兹线圈仿真剖析.docx
- RR、时间片轮转算法
- 2022P气瓶充装考试试题及在线模拟考试