时间序列分析:基于ARIMA模型的预测
时间序列分析:基于ARIMA模型的预测
本文将介绍如何使用Python对时间序列数据进行分析和预测。我们将使用ARIMA模型,该模型是一种强大的统计方法,适用于分析和预测具有趋势和季节性的时间序列数据。
1. 数据准备
首先,我们需要导入必要的库并加载数据。这里假设数据存储在名为'text.xlsx'的Excel文件中,其中包含时间列和数据列。pythonimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom matplotlib.font_manager import FontPropertiesfrom statsmodels.tsa.stattools import adfullerfrom statsmodels.tsa.arima.model import ARIMAfrom 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)
2. 平稳性检验
在构建ARIMA模型之前,我们需要检查时间序列数据的平稳性。平稳性是指时间序列的统计特性(如均值、方差和自相关性)不随时间变化。我们可以使用ADF检验来测试平稳性。python# 查看原始数据的平稳性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])
3. 差分处理
如果时间序列数据不平稳,我们需要对其进行差分处理,使其平稳。差分是计算连续观测值之间的差异的过程。python# 进行差分处理,直至平稳diff_count = 0acf_pacf_fig = plt.figure(figsize=(12, 10))
while not adfuller(data.iloc[:, 0])[1] < 0.05: diff_count += 1 diff_data = data.diff().dropna() # 绘制差分后数据图 plt.figure() plt.plot(diff_data.index, diff_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.savefig(f'差分{diff_count}阶数据.png') plt.show() # 绘制差分后数据的ACF和PACF acf_pacf_fig = plt.figure(figsize=(8, 6)) ax1 = acf_pacf_fig.add_subplot(211) ax2 = acf_pacf_fig.add_subplot(212) plot_acf(diff_data.values.squeeze(), ax=ax1, lags=20) plot_pacf(diff_data.values.squeeze(), ax=ax2, lags=20) ax1.set_xlabel('滞后', fontproperties=font_prop) ax1.set_ylabel('ACF', fontproperties=font_prop) ax2.set_xlabel('滞后', fontproperties=font_prop) ax2.set_ylabel('PACF', fontproperties=font_prop) ax1.set_title(f'差分{diff_count}阶数据的ACF', fontproperties=font_prop) ax2.set_title(f'差分{diff_count}阶数据的PACF', fontproperties=font_prop) plt.tight_layout() plt.savefig(f'差分{diff_count}阶数据的ACF和PACF.png') plt.show() # 更新数据 data = diff_data
4. ARIMA模型构建
一旦数据平稳,我们就可以构建ARIMA模型。ARIMA模型有三个参数:(p, d, q)。
- p:自回归(AR)模型的阶数* d:差分的阶数* q:移动平均(MA)模型的阶数
我们可以使用ACF和PACF图来确定这些参数的值。python# 构建ARIMA模型,并拟合数据model = ARIMA(data, order=(1, 0, 1))result = model.fit()
输出模型系数print('模型系数:')print(result.summary().tables[1])
5. 模型预测
构建好ARIMA模型后,我们就可以用它来预测未来的值。python# 预测未来二十天的数据forecast = result.get_forecast(steps=20)forecast_mean = forecast.predicted_meanforecast_conf_int = forecast.conf_int()
设置预测结果的日期索引forecast_dates = pd.date_range(start=data.index[-1], periods=len(forecast_mean))forecast_mean.index = forecast_datesforecast_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()
输出预测结果forecast_df = pd.DataFrame({'预测结果': forecast_mean})forecast_df.index.name = '日期'forecast_df.to_csv('预测结果.csv', encoding='utf-8-sig')print('预测结果已保存到文件'预测结果.csv'中。')
6. 总结
本文介绍了如何使用Python进行时间序列分析和预测。我们使用了ARIMA模型,并展示了如何进行平稳性检验、差分处理、模型构建和预测。
原文地址: https://www.cveoy.top/t/topic/cd6b 著作权归作者所有。请勿转载和采集!