文章目录

  • abstract
  • 可视化
  • 读入数据
    • 简单时序图
    • 季节性时序图
    • 季节性箱线图
    • 趋势箱线图
  • 时序的主要成分
  • statsmodels 安装
  • 周期检验
  • STL算法介绍
  • Homework
    • 简单时序图
    • 季节时序图
    • 季节箱线图
    • 趋势箱线图
    • ACF查看周期
    • STL 检测

abstract

  1. 时间序列可视化
  2. 时间序列的四个主要成分: 趋势,季节性(周期性),外部变量,噪音
  3. 计算时间序列的自相关性系数,根据自相关性系数判断季节性
  4. 掌握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)相关推荐

  1. [深度学习项目] - 时间序列预测 (5)[待补充]

    基于RNN的时序预测 基于LSTM的时序预测: 输入数据时 输入的 y t y_t yt​和 x t + 1 x_{t+1} xt+1​之间存在一个时间差. DeepAR 和 MQRNN 都可以实现时 ...

  2. [深度学习项目] - 时间序列预测 (4)

    Prophet 算法 只需要有基本的建模知识即可 有较强的可解释性和可视化支持 能作为大部分时间序列预测的benchmark 模型结构: 关于时间的广义线性模型 y ( t ) = g ( t ) + ...

  3. 深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战 LSTM(Long Short Term Memory Network)长短时记忆网络,是一种改进之后的循环神经网 ...

  4. 深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见 ...

  5. 深度学习多变量时间序列预测:Encoder-Decoder LSTM算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:Encoder-Decoder LSTM算法构建时间序列多变量模型预测交通流量+代码实战 LSTM是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要 ...

  6. 深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战 卷积神经网络,听起来像是计算机科学.生物学和数学的诡异组合,但它们已经成为计算机视觉领域中最具影响力 ...

  7. 深度学习多变量时间序列预测:GRU算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:GRU算法构建时间序列多变量模型预测交通流量+代码实战 GRU是LSTM网络的一种效果很好的变体,它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常流形的一种 ...

  8. matlab使用深度学习进行时间序列预测

    使用深度学习进行时间序列预测 - MATLAB & Simulink - MathWorks 中国 Deep Learning Toolbox 快速入门 - MathWorks 中国

  9. 基于深度学习的时间序列预测方法

    之前对时间序列预测的方法大致梳理了一下,最近系统的学习了深度学习,同时也阅读了一些处理序列数据的文献,发现对于基于深度学习的时间序列预测的方法,还可以做进一步细分:RNN.Attention和TCN. ...

  10. 基于深度学习的时间序列预测

    # 技术黑板报 # 第十一期 推荐阅读时长:15min 前言 时间序列建模历来是学术和工业界的关键领域,比如用于气候建模.生物科学和医学等主题应用,零售业的商业决策和金融等.虽然传统的统计方法侧重于从 ...

最新文章

  1. Python3中raise用法
  2. 圆桌讨论:人工智能的未来
  3. 2张图片就能「算出」一段视频,Reddit网友都惊呆了 | 旷视北大出品
  4. pymongo连接mongodb的replset
  5. linux卸载桌面Ubuntu,Ubuntu安装卸载KDE桌面之折腾记
  6. 日常生活 -- 开博二周年
  7. leetcode1052. 爱生气的书店老板(滑动窗口)
  8. 电脑显示连接了网络但是不能上网_为什么电脑插上网线显示已连接却上不了网...
  9. Maven打包时报Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war解决方案
  10. 拓端tecdat:R语言KMEANS均值聚类和层次聚类:亚洲国家地区生活幸福质量异同可视化分析和选择最优聚类数
  11. js 生成二维码及打印
  12. u盘内存怎么测试软件,怎么使用U盘启动盘进行内存测试?电脑内存测试工具使用方法...
  13. 正面管教:不凶不吼教出好孩子读后感
  14. ACM-ICPC 2018 沈阳赛区网络预赛 F题 Fantastic Graph
  15. 免费的二维码图片生成API接口和使用
  16. bzero()与 memset()等的区别
  17. Anaconda之通过可视化界面配置虚拟环境
  18. matlab亥姆霍兹线圈叠加原理,亥姆霍兹线圈仿真剖析.docx
  19. RR、时间片轮转算法
  20. 2022P气瓶充装考试试题及在线模拟考试

热门文章

  1. OneNote中快速笔记怎么打开和删除
  2. 圆柱体积怎么算立方公式_圆柱体积公式是什么,怎么算,
  3. python实现高斯消元法求线性方程组的解
  4. cmd命令快速切换电源模式-平衡模式和卓越模式
  5. Tongweb 7 集中管理工具
  6. HTML注册表单的页面制作
  7. 电脑玩CF、DNF、LOL等游戏掉帧.卡顿.黑屏怎么办?驱动人生十大游戏检测图文教程
  8. BZOJ2001 HNOI2010 城市建设
  9. pdf如何转化成word文档?
  10. 中国知网收费太贵,不妨试试这3个论文网站(大学生写论文必备)