经典时间序列的学习(一)简单的认识时间序列

1. 什么是时间序列

同一统计指标数值按照时间先后顺序排列而成的数据。本质上是反映一个变量随时间序列变化的趋势。

  1. 简单的例子就像是学生每一年的身高数据,这个也是一个时间序列。变量是我们的身高;每一年都不一样。
  2. 我们支付宝或者微信的零钱,每一天每一个月都有一个实际的值。

2. 在python中如何导入时间序列数据`

from dateutil.parser import parse  #关于时间的函数
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
import datetime  #关于日期的函数

plt.rcParams.update({'figure.figsize': (10, 7), 'figure.dpi': 120})

# Import as Dataframe
df = pd.read_csv('../datasets/a10.csv', parse_dates=['date'])
df.head()
    date     value

0 1991-07-01 3.526591
1 1991-08-01 3.180891
2 1991-09-01 3.252221
3 1991-10-01 3.611003
4 1991-11-01 3.565869``

3.面板数据

有多个时间节点,且每一个时间节点上有多个维度的数据

4. 可视化时间序列

##获得数据

import matplotlib.pyplot as plt

df = pd.read_csv('../datasets/a10.csv')
df['date'] = df['date'].apply(lambda x: datetime.datetime.strptime(x, "%Y-%m-%d"))
#######关注一下匿名函数的用法
df.head()
    date     value

0 1991-07-01 3.526591
1 1991-08-01 3.180891
2 1991-09-01 3.252221
3 1991-10-01 3.611003
4 1991-11-01 3.565869

画图

# 画图
def plot_df(df, x, y, title="", xlabel="Date", ylabel="Value", dpi=100):
    plt.figure(figsize=(12, 4), dpi=dpi)
    plt.plot(df[x], df[y], color='tab:red')
    plt.gca().set(title=title, xlabel=xlabel, ylabel=ylabel)
    plt.show()
plot_df(df, x="date", y="value")

在这里插入图片描述

区域填充图

####用了之前的图像专题的一些知识点fill与hlines
fig, ax = plt.subplots(1, 1, figsize=(12, 4), dpi=100)
ax.fill_between(x=df['date'], y1=df['value'], y2=-df['value'], alpha=0.5, linewidth=2, color='seagreen')
ax.set_title("demo data", fontsize=16)
ax.hlines(y=0, xmin=np.min(df['date']), xmax=np.max(df['date']), linewidth=0.5)
plt.show()

在这里插入图片描述

季节性的图

df['year'] = df['date'].apply(lambda x: x.year)##这是年
df['month'] = df['date'].apply(lambda x: int(x.strftime('%m'))) ##这是月作为标签使用

fig, ax = plt.subplots(figsize=(10, 7))
for index, tempyear in enumerate(df['year'].unique().tolist()):
    tempdata = df.loc[df['year'] == tempyear].sort_values(by=['date'])
    ax.plot(tempdata['month'], tempdata['value'], label=tempyear)
    ax.text(tempdata.tail(1)['month'], tempdata.tail(1)['value'], tempyear)

font = {'family': 'serif',
        'color': 'darkred',
        'weight': 'normal',
        'size': 16,
        }
ax.set_ylabel("$Drug Sales$", fontdict=font)
ax.set_xlabel('$Month$', fontdict=font)
ax.set_title("Seasibak Plot of Drug Sales Time Series",
             fontdict=font)
x_axis_ticks = np.arange(start=1, stop=13)
ax.set_xticks(x_axis_ticks)
ax.set_xticklabels(x_axis_ticks)

在这里插入图片描述

结论
  1. 从月的角度来看,在每年的1月到2月,毒品的销售都是骤降,3月再次上升,4月再次下降,显然,每年重复如此。
  2. 从年的角度来看,毒品的销售逐年增加。
    我们可以通过逐年的boxplot和逐月的boxplot观察到这些特点。
########箱图############
fig, ax = plt.subplots(ncols=2, nrows=1, figsize=(12, 5))
sns.boxplot(x='year', y='value', data=df, ax=ax[0])
sns.boxplot(x='month', y='value', data=df, ax=ax[1])

ax[0].set_title("Year-wise BoxPlot \n(The Trend)", fontsize=18)
xlabel = ax[0].get_xticklabels()
ax[0].set_xticklabels(xlabel, rotation=45)
ax[1].set_title("Month-wise BoxPlot \n(The Trend)", fontsize=18)

在这里插入图片描述

  1. 从boxplot可以看出来:毒品销售和年以及月份是相关的。
  2. 从月份的boxplot可以看出来,1月和12月的毒品销量比较高,这个可以用假期折扣来解释。

5. 时间序列中的模式

任何时间序列可以可以被拆分为3个部分:

  1. 趋势:趋势是比较明显的,比如极速的上升或者迅速下跌。
  2. 季节性:可以在数据中看到明显的周期性,并且这个周期性和时间周期有关。这个周期可能是月,可能是季度,也可能是年。
  3. 误差项。
但是不是说所有的时间序列都必须具备这3个部分。时间序列可能没有明显的趋势、可能没有明显的周期性。或者两个都没有。

因此,可以将时间序列看成趋势、周期性、误差项的组合。

df1=pd.read_csv("guinearice.csv")
df1.head()
df2=pd.read_csv('sunspotarea.csv')
df2.head()
df3=pd.read_csv("AirPassengers.csv")
df3.head()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(12, 4), dpi=100)
pd.read_csv("../datasets/guinearice.csv", parse_dates=['date'], index_col=['date']).plot(title="Trend Only", legend=False,
                                                                                      ax=ax[0])
pd.read_csv("../datasets/sunspotarea.csv", parse_dates=['date'], index_col=['date']).plot(title="Seasonality Only",
                                                                                       legend=False, ax=ax[1])
pd.read_csv("../datasets/AirPassengers.csv", parse_dates=['date'], index_col=['date']).plot(title="Trend and Seasonality",
                                                                                         legend=False, ax=ax[2])

在这里插入图片描述

另外一个需要注意的就是循环行为,如果发现时间序列中的跌幅是有周期性的,且这个周期性只是和时间间隔有关,和特定的时间节点无关,那么就是周期性。不能称之为季节性。
学习总结
箱图与季节图的绘制
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值