python代码:时序预测,使用ARIMA模型,先对原始数据进行归一化和二阶差分且分为训练集和测试集,然后定阶,然后在测试集进行ARIMA预测,然后把数据反归一化等,并输出对比图
时间: 2024-03-18 10:41:47 浏览: 13
以下是一个简单的 Python 代码示例,使用 ARIMA 模型进行时序预测,包括数据处理、模型构建、预测和可视化等步骤:
```python
import pandas as pd
import numpy as np
from statsmodels.tsa.arima_model import ARIMA
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('data.csv', header=None)
# 归一化处理
data = np.array(df[0])
normalized_data = (data - np.min(data)) / (np.max(data) - np.min(data))
# 二阶差分
diff_data = np.diff(normalized_data, 2)
# 切分训练集和测试集
train_size = int(len(diff_data) * 0.7)
train_data, test_data = diff_data[:train_size], diff_data[train_size:]
# 确定ARIMA模型的阶数
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 绘制ACF和PACF图
plot_acf(train_data).show()
plot_pacf(train_data).show()
# 使用pmdarima库自动确定阶数
from pmdarima.arima.utils import ndiffs
d = ndiffs(train_data, test='adf')
from pmdarima.arima import auto_arima
model = auto_arima(train_data, start_p=0, start_q=0, max_p=5, max_q=5, m=12, start_P=0, seasonal=True, d=d, D=1, trace=True, error_action='ignore', suppress_warnings=True, stepwise=True)
print(model.summary())
# 模型训练和预测
model.fit(train_data)
forecast = model.predict(n_periods=len(test_data))
# 反归一化处理
def invert_diff(original_data, diff_data, interval):
inverted = []
for i in range(len(diff_data)):
value = diff_data[i] + original_data[-interval + i]
inverted.append(value)
return inverted
inverted_forecast = invert_diff(normalized_data, forecast, 2)
# 可视化对比图
plt.plot(test_data, label='actual')
plt.plot(inverted_forecast, label='predicted')
plt.legend()
plt.show()
# 计算误差
mse = mean_squared_error(test_data, inverted_forecast)
print(f'Mean squared error: {mse:.3f}')
```
这个示例中,我们首先读取数据、对数据进行归一化和二阶差分,然后将数据划分为训练集和测试集。接着,我们使用 ACF 和 PACF 图以及自动化工具 pmdarima 来确定 ARIMA 模型的阶数。然后,我们训练 ARIMA 模型,并在测试集上进行预测,最后反归一化处理并绘制对比图。最后,我们计算了预测误差。