时间序列分析:ARIMA模型预测与结果可视化

本文将使用Python库statsmodels进行时间序列分析,应用ARIMA模型对数据进行拟合,并对未来数据进行预测。该过程包括平稳性检验、差分处理、模型构建和预测,并提供可视化结果展示。

1. 数据准备与平稳性检验

首先,我们需要加载时间序列数据,并使用adfuller函数进行平稳性检验。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 设置合适的字体
font_path = 'C:/Windows/Fonts/simsun.ttc'  # 修改为你系统中合适的字体路径
font_prop = FontProperties(fname=font_path, size=12)

# 读取数据
data = pd.read_excel('D:\M_hua\text.xlsx')
print(data.columns)

# 将时间列作为时间索引
data.set_index('time', inplace=True)

# 查看原始数据的平稳性
def check_stationarity(series):
    result = adfuller(series)
    print('ADF检验结果:')
    print('ADF Statistic:', result[0])
    print('p-value:', result[1])
    print('Critical Values:')
    for key, value in result[4].items():
        print(f'{key}: {value}')

# 查看原始数据的平稳性
print('原始数据的平稳性检验结果:')
check_stationarity(data.iloc[:, 0])

2. 差分处理

如果原始数据不平稳,我们需要进行差分处理,直到数据平稳。

# 进行差分处理,直至平稳
diff_count = 0
while not adfuller(data.iloc[:, 0])[1] < 0.05:
    data = data.diff().dropna()
    diff_count += 1
    
    # 绘制差分后数据图
    plt.plot(data.index, data.values, label=f'差分{diff_count}阶数据')
    plt.legend(prop=font_prop)
    plt.xlabel('时间', fontproperties=font_prop)
    plt.ylabel('数据', fontproperties=font_prop)
    plt.title(f'差分{diff_count}阶数据', fontproperties=font_prop)
    plt.show()

3. ARIMA模型构建与拟合

使用ARIMA函数构建ARIMA模型,并使用fit方法拟合数据。

# 构建ARIMA模型,并拟合数据
model = ARIMA(data, order=(1, 0, 1))
result = model.fit()

# 输出模型系数
print('模型系数:')
print(result.summary().tables[1])

4. 可视化拟合结果

绘制拟合结果图,观察模型拟合效果。

# 获取差分序列拟合值
fitted_values = result.fittedvalues

# 可视化拟合结果
plt.plot(np.arange(len(data)), data.values, label='差分后数据')
plt.plot(np.arange(len(data)), fitted_values.values, color='red', label='拟合结果')
plt.legend(prop=font_prop)
plt.xlabel('时间', fontproperties=font_prop)
plt.ylabel('数据', fontproperties=font_prop)
plt.title('ARIMA模型拟合结果', fontproperties=font_prop)
plt.show()

5. 未来数据预测

使用get_forecast方法预测未来20天数据,并设置预测结果的日期索引。

# 预测未来二十天的数据
forecast = result.get_forecast(steps=20)
forecast_mean = forecast.predicted_mean
forecast_conf_int = forecast.conf_int()

# 设置预测结果的日期索引
forecast_dates = pd.date_range(start=data.index[-1], periods=len(forecast_mean))
forecast_mean.index = forecast_dates
forecast_conf_int.index = forecast_dates

6. 可视化预测结果

绘制预测结果图,展示预测值及其置信区间。

# 可视化预测结果
plt.plot(forecast_mean.index, forecast_mean.values, color='red', label='预测结果')
plt.fill_between(forecast_conf_int.index, forecast_conf_int.iloc[:, 0], forecast_conf_int.iloc[:, 1], color='gray', alpha=0.3)
plt.legend(prop=font_prop)
plt.xlabel('时间', fontproperties=font_prop)
plt.ylabel('数据', fontproperties=font_prop)
plt.title('ARIMA模型预测结果', fontproperties=font_prop)
plt.show()

7. 输出预测结果

输出预测结果的DataFrame。

# 输出预测结果
print('预测结果:')
print(forecast_mean)

代码完整示例

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 设置合适的字体
font_path = 'C:/Windows/Fonts/simsun.ttc'  # 修改为你系统中合适的字体路径
font_prop = FontProperties(fname=font_path, size=12)

# 读取数据
data = pd.read_excel('D:\M_hua\text.xlsx')
print(data.columns)

# 将时间列作为时间索引
data.set_index('time', inplace=True)

# 查看原始数据的平稳性
def check_stationarity(series):
    result = adfuller(series)
    print('ADF检验结果:')
    print('ADF Statistic:', result[0])
    print('p-value:', result[1])
    print('Critical Values:')
    for key, value in result[4].items():
        print(f'{key}: {value}')

# 查看原始数据的平稳性
print('原始数据的平稳性检验结果:')
check_stationarity(data.iloc[:, 0])

# 进行差分处理,直至平稳
diff_count = 0
while not adfuller(data.iloc[:, 0])[1] < 0.05:
    data = data.diff().dropna()
    diff_count += 1
    
    # 绘制差分后数据图
    plt.plot(data.index, data.values, label=f'差分{diff_count}阶数据')
    plt.legend(prop=font_prop)
    plt.xlabel('时间', fontproperties=font_prop)
    plt.ylabel('数据', fontproperties=font_prop)
    plt.title(f'差分{diff_count}阶数据', fontproperties=font_prop)
    plt.show()

# 构建ARIMA模型,并拟合数据
model = ARIMA(data, order=(1, 0, 1))
result = model.fit()

# 输出模型系数
print('模型系数:')
print(result.summary().tables[1])

# 获取差分序列拟合值
fitted_values = result.fittedvalues

# 可视化拟合结果
plt.plot(np.arange(len(data)), data.values, label='差分后数据')
plt.plot(np.arange(len(data)), fitted_values.values, color='red', label='拟合结果')
plt.legend(prop=font_prop)
plt.xlabel('时间', fontproperties=font_prop)
plt.ylabel('数据', fontproperties=font_prop)
plt.title('ARIMA模型拟合结果', fontproperties=font_prop)
plt.show()

# 预测未来二十天的数据
forecast = result.get_forecast(steps=20)
forecast_mean = forecast.predicted_mean
forecast_conf_int = forecast.conf_int()

# 设置预测结果的日期索引
forecast_dates = pd.date_range(start=data.index[-1], periods=len(forecast_mean))
forecast_mean.index = forecast_dates
forecast_conf_int.index = forecast_dates

# 可视化预测结果
plt.plot(forecast_mean.index, forecast_mean.values, color='red', label='预测结果')
plt.fill_between(forecast_conf_int.index, forecast_conf_int.iloc[:, 0], forecast_conf_int.iloc[:, 1], color='gray', alpha=0.3)
plt.legend(prop=font_prop)
plt.xlabel('时间', fontproperties=font_prop)
plt.ylabel('数据', fontproperties=font_prop)
plt.title('ARIMA模型预测结果', fontproperties=font_prop)
plt.show()

# 输出预测结果
print('预测结果:')
print(forecast_mean)

请根据你的实际情况修改代码中的文件路径和列名。运行代码后,你将获得原始数据图、差分后数据图、ARIMA模型的拟合结果图以及预测的未来二十天的数据的单独成图。

希望这次能够满足你的需求。如果还有其他问题,请随时提问。

时间序列分析:ARIMA模型预测与结果可视化

原文地址: https://www.cveoy.top/t/topic/b8OX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录