arima时间序列预测python代码实现
时间: 2025-01-06 20:35:39 浏览: 3
### ARIMA 时间序列预测 Python 实现代码示例
对于ARIMA时间序列预测,在Python中的实现主要依赖于`statsmodels`库。下面是一个完整的例子,展示了如何加载数据、处理缺失值、确定参数\(p\)、\(d\)以及\(q\),训练模型,并最终做出预测。
#### 加载必要的库和准备数据集
```python
import pandas as pd
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima.model import ARIMA
import numpy as np
```
#### 数据预处理
假设有一个CSV文件名为'data.csv',其中包含日期列'Date'和目标变量'y'。
```python
df = pd.read_csv('data.csv', parse_dates=['Date'], index_col='Date')
series = df['y']
plt.figure(figsize=(10, 6))
plt.plot(series)
plt.title('Time Series Data')
plt.show()
```
为了使时间序列平稳,可能需要执行差分操作来移除趋势成分。这一步骤有助于决定\(d\)的取值[^2]。
#### 差分化和平稳性检验
通过ADF测试判断是否已经达到了平稳状态;如果不是,则继续增加差异阶数直到满足条件为止。
```python
def check_stationarity(ts):
result = adfuller(ts.dropna())
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
check_stationarity(series)
# 如果不平稳则进行一次或多次差分
diff_series = series.diff().dropna()
check_stationarity(diff_series)
```
一旦确认了合适的\(d\)值之后,就可以利用ACF图与PACF图帮助选择最佳的\(p\)和\(q\)组合[^3]。
#### 参数估计:绘制ACF/PACF图表辅助选取 \(p\), \(q\)
```python
plot_acf(series)
plot_pacf(series)
plt.show()
```
基于上述分析选定具体的\(p\)、\(d\)、\(q\)数值后,可以构建ARIMA模型并对其进行拟合。
#### 构建与评估ARIMA模型
```python
model = ARIMA(series, order=(p, d, q)) # 替换这里的(p,d,q)为你自己的选择
fit_model = model.fit()
print(fit_model.summary())
residuals = fit_model.resid
fig, ax = plt.subplots(1, 2, figsize=(14, 5))
ax[0].hist(residuals, bins=25);
ax[1].plot(np.cumsum(residuals));
plt.tight_layout();
plt.show()
```
最后,使用已训练好的模型来进行未来时间段内的预测工作。
#### 预测未来的值
```python
forecast_steps = 10 # 要预测多少步后的值
predictions = fit_model.forecast(steps=forecast_steps)[0]
future_index = pd.date_range(start=df.index[-1], periods=forecast_steps+1, freq='D')[1:]
predicted_df = pd.DataFrame(predictions, index=future_index, columns=['Prediction'])
plt.figure(figsize=(10, 6))
plt.plot(df['y'].tail(50), label="Observed", color="blue") # 显示最近的数据作为对比
plt.plot(predicted_df, label="Forecast", linestyle="--", color="red")
plt.legend(loc='upper left')
plt.title('Actual vs Predicted Values')
plt.show()
```
阅读全文