赞
踩
上期讲了理论部分,这期结合代码看看如何做预测,并与预测结果进行比较。
一、导入数据包,关注公众号后台回复 wind 即可下载
import matplotlib.pyplot as plt
import numpy as np
from dateutil.relativedelta import relativedelta
import datetime
import time
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.stattools import acf
from statsmodels.tsa.stattools import pacf
from statsmodels.tsa.seasonal import seasonal_decompose
df=pd.read_excel(r'D:\weather_forecast\wind.xlsx',index_col=u'YM')
表格包含两列,一列为时间,一列为我们的变量,时间为每个月第一天,也就是我们的时间序列是每个月一个数据,将时间那一列设置为index(也可以使用pandas.DataFrame.set_index ()来实现)。然后简单查看一下这个时间序列的图像,可能潜在哪些趋势:
df['data_list'].plot(figsize=(12,8),title="Daily Wind",fontsize=14)
可以看出这列时间序列存在很明显的周期性,且以年为周期。
二、使用seasonal_decompose查看时间序列概况
decomposition=seasonal_decompose(df['data_list'],freq=12)
fig=plt.figure()
fig=decomposition.plot()
fig.set_size_inches(12,6)
上图使用了移动平均来进行季节性分解。第一个小图observed就是我们观测到的实际值,和最初我们用简单画出来的图像其实是一样的,只是更扁平了,下面第二个图Trend可以看到它整体的变化趋势,然后第三个seasonal是整个序列表现出来的季节性部分,第四个residual是残差。
statsmodels.tsa.seasonal.seasonal_decompose(x, model=‘additive’, filt=None, period=None, two_sided=True, extrapolate_trend=0)
接下来对seasonal_decompose的参数和用法做一个详细的介绍。
x: 你要分析的序列。
Model: 第二个参数model 有两种形式。
使用下图来举例:
Level: 序列中的平均值。
Trend: 在序列中增加或减小的值。
Seasonality: 季节性表示这个序列中短期周期的重复出现。
Noise: 序列中的随机变量,其实就是整个序列减去趋势和季节性所剩下的残差。
左图为additive model,相加模式,它的季节性变化的幅度是独立于时间轴的。中间的红色线为均值,时间序列中每个时刻的值用黑色的点表示,这些黑色的点用公式表示如下:
y(t) = Level + Trend + Seasonality + Noise
在上面四个因素中,他们不互相作用,而是互相区别,直接相加来影响y值。在相加模式下,它在时间轴上是线性的,随着时间的改变是一致的。在这种情况下,线性的周期性有相同的幅度和频率。
右图为The multiplicative model, 相乘模式。
在这种模式中,趋势、季节性和噪音成分是相乘的。它是非线性的,可以是指数形式(exp),多次方的形式。可以用如下公式表示:
y(t) = Level * Trend * Seasonality * Noise
不同于相加模式,随着时间的推移,相乘模式表现出增长(下降)的幅度或者频率。
Filt : 过滤参数,用来过滤掉季节性成分(seasonal)和趋势成分(trend)。可以设置你自己的过滤矩阵,也可以直接设置该参数等于None(default)。当Filt设置自定义为None时,里面代码会根据你的period给你一个Filt矩阵,因为这个在计算时是必须要有的。
当不设置filt参数时,即filt=None时,period为偶数时:
当不设置filt参数时,period为奇数时:
过滤矩阵确定下来后,过滤时所使用的具体移动平均方法,由two_sided的参数决定。
period: 就是周期。
Two_sided:过滤中使用的移动平均(moving average)方法。如果为True, 那么使用的是中心移动平均,就是你计算完移动平均之后,把平均值放在所计算的周期的中间时刻,类似于pandas.rolling_mean(center=True)。如果为false,那么仅用于过去值。
Extrapolate_trend: int or ‘freq’在计算trend的时候,会留有空缺值,这个参数的设置就是判定是否要剥离两端的,或者一端的NaN value,使用前后的效果对比图如下:
了解完它的各个参数,下面看看计算seasonal_decompose中observed, trend, seasonal residual这四个结果的计算。
Observed=x
trend的计算(仅限extrapolate_trend=0时,因为不等于0时,会把NaN值给剥离掉,还需要考虑到two_side参数):
Tip:此trend非彼trend,注意到这里的trend=上面提及的level+trend,之前提及到的trend是非常纯粹的trend,周期内的平均值是被剥离掉的,它只是表述一个变化趋势。
n_filt: 过滤器的长度,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。