航司乘客数序列
预测步骤
# 加载时间序列数据
_ts = load_data()
# 使用样本熵评估可预测性
print(f'原序列样本熵:{SampEn(_ts.values, m=2, r=0.2 * np.std(_ts.values))}')
# 检验平稳性
use_rolling_statistics(_ts) # rolling 肉眼
use_df(_ts) # Dickey-Fuller Test 量化
# 平稳变换
_ts_log, _rs_log_diff = transform_stationary(_ts)
# 使用样本熵评估可预测性
print(f'平稳变换后的序列样本熵:{SampEn(_ts.values, m=2, r=0.2 * np.std(_ts.values))}')
# acf,pacf定阶分析
order_determination(_rs_log_diff)
# plot_lag(_rs)# lag plot(滞后图分析相关性)
# 构建模型
_fittedvalues, _fc, _conf, _title = build_arima(
_ts_log) # 这里只传取log后的序列是因为后面会通过指定ARIMA模型的参数d=1来做一阶差分,这样在预测的时候,就不需要手动做逆差分来还原序列,而是由ARIMA模型自动还原
# 预测,并绘制预测结果图
transform_back(_ts, _fittedvalues, _fc, _conf, _title)
预测结果
完整代码
# coding='utf-8'
"""
航司乘客数时间序列数据集
该数据集包含了1949-1960年每个月国际航班的乘客总数。
"""
import numpy as np
from matplotlib import rcParams
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import acf, pacf
params = {'font.family': 'serif',
'font.serif': 'FangSong',
'font.style': 'italic',
'font.weight': 'normal', # or 'blod'
'font.size': 12, # 此处貌似不能用类似large、small、medium字符串
'axes.unicode_minus': False
}
rcParams.update(params)
import matplotlib.pyplot as plt
import pandas as pd
# 未来pandas版本会要求显式注册matplotlib的转换器,所以添加了下面两行代码,否则会报警告
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
def load_data():
from datetime import datetime
date_parse = lambda x: datetime.strptime(x, '%Y-%m-%d')
data = pd.read_csv('datas/samples/AirPassengers.csv',
index_col='Month', # 指定索引列
parse_dates=['Month'], # 将指定列按照日期格式来解析
date_parser=date_parse # 日期格式解析器
)
ts = data['y']
print(ts.head(10))
plt.plot(ts)
plt.show()
return ts
def use_rolling_statistics(time_series_datas):
'''
利用标准差和均值来肉眼观测时间序列数据的平稳情况
:param time_series_datas:
:return:
'''
roll_mean = time_series_datas.rolling(window=12).mean()
roll_std = time_series_datas.rolling(window=12).std()
# roll_variance = time_series_datas.rolling(window=12).var()
plt.plot(time_series_datas, color='blue', label='Original')
plt.plot(roll_mean, color='red', label='Rolling Mean')
plt.plot(roll_std, color='green', label='Rolling Std')
# plt.plot(roll_variance,color='yellow',label='Rolling Variance')
plt.legend(loc='best')
plt.title('利用Rolling Statistics来观测时间序列数据的平稳情况')
plt.show(block=False)
def use_df(time_series_datas):
'''
迪基-富勒单位根检验
:param time_series_datas:
:return:
'''
from statsmodels.tsa.stattools import adfuller
dftest = adfuller(time_series_datas, autolag='AIC')
dfoutput = pd.Series(dftest[