用python做时间序列预测十:时间序列实践-航司乘客数预测

本文通过航司乘客数预测实例,演示时间序列预测的步骤,涵盖时间序列分解、ARIMA模型等,旨在提供时间序列预测的实战应用指南。
摘要由CSDN通过智能技术生成

本文以航司乘客数预测的例子来组织相关时间序列预测的代码,通过了解本文中的代码,当遇到其它场景的时间序列预测亦可套用。

航司乘客数序列

预测步骤
# 加载时间序列数据
_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_seri
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值