1. 什么是时间序列
同一统计指标数值按照时间先后顺序排列而成的数据。本质上是反映一个变量随时间序列变化的趋势。
- 简单的例子就像是学生每一年的身高数据,这个也是一个时间序列。变量是我们的身高;每一年都不一样。
- 我们支付宝或者微信的零钱,每一天每一个月都有一个实际的值。
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月到2月,毒品的销售都是骤降,3月再次上升,4月再次下降,显然,每年重复如此。
- 从年的角度来看,毒品的销售逐年增加。
我们可以通过逐年的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)
- 从boxplot可以看出来:毒品销售和年以及月份是相关的。
- 从月份的boxplot可以看出来,1月和12月的毒品销量比较高,这个可以用假期折扣来解释。
5. 时间序列中的模式
任何时间序列可以可以被拆分为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])