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

文章目录

abstract

  1. 时间序列可视化
  2. 时间序列的四个主要成分: 趋势,季节性(周期性),外部变量,噪音
  3. 计算时间序列的 自相关性系数,根据 自相关性系数判断 季节性
  4. 掌握STL算法 分解时间序列

可视化

读入数据

import pandas as pd
import numpy as np
import matplotlib.pyplot  as plt

pd.options.display.max_rows = 400
pd.options.display.max_columns = None

import warnings
warnings.filterwarnings("ignore")

df_price = pd.read_csv("stock_price.csv", parse_dates=["date"])

df_sales = pd.read_csv("store_sales.csv", parse_dates=["week"])

简单时序图

时间-观测值之间的关系


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()

[深度学习项目] - 时间序列预测 (2)
从简单时序图中,我们可以看到每个公司的上升/下降/持平趋势。 但是因为这是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()

[深度学习项目] - 时间序列预测 (2)
在更短的时间内,我们可以看到股价的尺寸波动情况(噪声)。 另外没有发现明显的周期性。

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()

[深度学习项目] - 时间序列预测 (2)
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()

[深度学习项目] - 时间序列预测 (2)
我们可以看到,门店的每个部门销量是存在明显的周期性的。但是明显的周期性波动 使得销量的长期趋势 展示不够明显。 以及周期性的具体周期数值是多少,也需要进一步统计。另外周期的高峰和低估等数据也需要分析。

季节性时序图

季节时序图用于分析 周期性的一些特征。 在一个周期中,高峰和低估出现的阶段和数值大小。
因为销量的周期就是一年,因此直接按照每年来划分数据,看每年中 销量在每年的不同周的变化。


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.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()

[深度学习项目] - 时间序列预测 (2)
可以看到在 第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()

plt.boxplot(  data_boxplot["sales"].values, labels=data_boxplot["week_of_year"].values  )
plt.show()

[深度学习项目] - 时间序列预测 (2)
均值,最大值,最小值,二十五分位数,七十五分位数。

趋势箱线图


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.weekofyear

data_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()

[深度学习项目] - 时间序列预测 (2)
我们只使用 第19周到43周的数据,这样子可以反应 销售低估时期,不同年的趋势。

时序的主要成分

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

; statsmodels 安装

statsmodels

周期检验

自相关系数检验(ACF) 【具体内容待查找】
r h = C o r ( X t , X t + h ) , e v e r y t r_h=Cor(X_t,X_{t+h}),every\ t r h ​=C or (X t ​,X t +h ​),e v ery t

C o r ( X t , X t + h ) = E [ ( X t − μ t ) ( X t + h − μ t + h ) ] σ ( X t ) σ ( X t + 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}) }C or (X t ​,X t +h ​)=σ(X t ​)σ(X t +h ​)E [(X t ​−μt ​)(X t +h ​−μt +h ​)]​

当我们改变h,用于计算不同的h下 序列X t X_t X t ​与序列X t + h X_{t+h}X t +h ​之间的相关性。 如果在时间T下存在周期性,那么在T , 2 T , … , n T T,2T,\dots,nT T ,2 T ,…,n T下都存在周期性, 都会有较强的相关性系数。

因此,只有T , 2 T , … , n T T,2T,\dots,nT T ,2 T ,…,n T下都存在 较高的 相关性系数,那么才能说明 周期性是T。


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()

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

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()

[深度学习项目] - 时间序列预测 (2)
我们可以看到,趋势项和之前的 趋势箱线图较为相似; 季节性中的周期性:在年初和年末都是有高峰期,在年中是低谷期。
但是实际上 周期性是由于 外部变量(促销互动等)造成的,实际上也是残差中的一部分。

Homework

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

; 简单时序图

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()

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

季节时序图

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

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()

[深度学习项目] - 时间序列预测 (2)
可以看到 还是每年会存在 周期性的重叠。 但和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()

plt.boxplot(  data_boxplot["sales"].values, labels=data_boxplot["week_of_year"].values  )
plt.xticks(rotation=90)
plt.show()

[深度学习项目] - 时间序列预测 (2)
可以看到 大部分时间的方差较小,说明每年的相同时间差别不是很大;但具体上升还是下降,可以根据 趋势箱线图查看。

趋势箱线图

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_1

data_boxplot = data_boxplot.groupby( ["year"] )["sales"].agg(list).reset_index()
plt.boxplot( data_boxplot["sales"].values, labels=data_boxplot["year"].values )
plt.show()

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

可以看到 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()

[深度学习项目] - 时间序列预测 (2)
从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)
我们可以看到 整体趋势和 趋势箱线图一致。 对于季节性趋势,每年存在周期性。另外每一年内 前半部分趋势较为平缓,后半部分波动较大。
同时根据残差图,我们可以看到 在第二年中 方差波动最大,说明三年中存在 外部变量波动较为剧烈。
同时周期中 存在一些外部变量 影响每年内的变化。

Original: https://blog.csdn.net/upr_rom/article/details/126917368
Author: 最適当承诺
Title: [深度学习项目] – 时间序列预测 (2)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/751799/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python基础–简单数据类型预览

    为了适应更多的使用场景,将数据划分为多种类型,每种类型都有各自的特点和使用场景, 帮助计算机高效的处理和展示数据。(比如数字用于数学运算、字符串用于信息传递、页面文字展示等) 1….

    Python 2023年10月31日
    034
  • 强大的数据分析工具——Pandas操作、易错点、知识点三万字详解

    一、 Pandas数据结构 1.Series2.DataFrame3.从DataFrame中查询出Series DataFrame: 二维数据、整个表格、多行多列 Series:一…

    Python 2023年8月22日
    059
  • Pygame使用测试(三)

    使用帧数 计算机的速度非常快,可以在一秒钟内完成数百万个循环周期。现在显然,这对我们人类来说有点快。作为参考,电影以每秒 24 帧的速度运行。任何小于这个值的东西都会有明显的卡顿,…

    Python 2023年9月23日
    058
  • vue-router路由之路-极简教程

    01、什么是前端路由? 前端路由的一个大背景就是当下流行的单页应用SPA,一些主流的前端框架,如vue、react、angular都属于SPA,那什么是SPA呢? 1.1、SPA …

    Python 2023年10月12日
    019
  • Python教程:list.sort()和函数sorted(list)

    In [90]: x = [4, 6, 2, 1, 7, 9] In [91]: x.sort() In [92]: x Out[92]: [1, 2, 4, 6, 7, 9] I…

    Python 2023年5月23日
    063
  • 专注效率提升「GitHub 热点速览 v.22.36」

    本周最大的 GitHub 事件无疑是国内多家自媒体报道过的,GitHub 官方或将下架 GitHub Trending 页面。作为 GitHub Trending 长期用户,本周也…

    Python 2023年10月23日
    067
  • for循环语法

    for循环 for循环常用来遍历取值! for循环的基本语法 for 变量名 in 可&am…

    Python 2023年11月1日
    032
  • 数据分析与展示-Pandas入门

    Pandas是Python第三方库,提供高性能易用数据类型和分析工具。Pandas基于NumPy实现,常与NumPy和Matplotlib一同使用。pandas的导入: impor…

    Python 2023年8月17日
    030
  • Flask 自建扩展

    开源发布准备 * 1. 添加文档字符串与注释后的完整代码 """ Flask-Share # ~~~~~~~~~~~~~~ Create social…

    Python 2023年8月10日
    072
  • Android手机做为云服务器实操

    Android手机做为云服务器实操 工具-TWRP-frp-Termux】旧手机暴改成免费云服务器旧手机搭建云服务器教你从0到1升级自己的旧手机,让你家里成为云服务中心旧安卓机别扔…

    Python 2023年8月13日
    033
  • pytest系列教程——3、setup和teardown

    setup和 teardown是用来处理用例的开始前工作和结束后的工作,pytest提供了多种类型的前置和后置,其中包括: setup_module / teardown_modu…

    Python 2023年9月12日
    026
  • python如何关闭线程

    python如何关闭线程 原创 ch3nnn2022-07-18 17:41:14博主文章分类:Python ©著作权 文章标签 开发语言 python 停止线程 ide 文章分类…

    Python 2023年5月25日
    075
  • Python pandas 将字典dict转化为DataFrame时需避免的坑

    先上结论: 以下是详细阐述。 有这样一个字典 d = {‘a’:1, ‘b’:2, ‘c’:4} 如果直接使用 pd.DataFrame(data=d),会出现以下的报错: Val…

    Python 2023年8月7日
    076
  • 《红色印记》读后感

    古时的人们没有录音机,没有摄像机,因此许多流传在人们口中的英雄故事被人们遗忘了。如今,我们拥有了各种各样的记录设备。因此,我们不能让近百年来流传于人们口中的红色故事遗失。为此,央广…

    Python 2023年6月12日
    060
  • 【深度学习】检测CUDA、cuDNN、Pytorch是否可用

    检测CUDA、cuDNN、Pytorch是否可用 大家看完代码不妨看一下后文的详解哦~ 默子在原有基础上增加了很多新的内容。 解释的更加详细,更加具体,更加新颖! 废话不多说,我们…

    Python 2023年10月28日
    035
  • 用Python画出圣诞树,瞧瞧我这简易版的吧

    前言 嗨嗨,大家好,我是小圆 今天来实现一下 用python画出圣诞树 代码 模块 源码.点击领取即可 import turtle as t from turtle import …

    Python 2023年9月15日
    044
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球