SARIMAX模型如何使用,代码实现
时间: 2024-06-09 22:09:37 浏览: 15
SARIMAX是一种常用的时间序列分析模型,可用于预测未来的时间序列值。下面是一个使用Python实现SARIMAX模型的示例代码:
首先,我们需要导入相关的库:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.statespace.sarimax import SARIMAX
```
接下来,我们需要准备好时间序列数据。在这个示例中,我们将使用一个包含季节性和趋势性的时间序列数据:
```python
# 准备时间序列数据
df = pd.read_csv('data.csv', parse_dates=['date'], index_col='date')
```
接下来,我们需要将时间序列数据拆分为训练集和测试集,通常情况下,我们会使用前80%的数据作为训练集,后20%的数据作为测试集:
```python
# 拆分数据集
train_data = df[:int(0.8*(len(df)))]
test_data = df[int(0.8*(len(df))):]
```
接下来,我们需要使用SARIMAX模型来拟合训练数据,并使用该模型进行预测:
```python
# 拟合SARIMAX模型
model = SARIMAX(train_data, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
result = model.fit()
# 预测未来值
start = len(train_data)
end = len(train_data) + len(test_data) - 1
predictions = result.predict(start=start, end=end, dynamic=False, typ='levels').rename('SARIMAX(1,1,1)(1,1,1,12) Predictions')
```
最后,我们可以将预测结果与测试集数据进行可视化比较:
```python
# 可视化比较
plt.figure(figsize=(12,5), dpi=100)
plt.plot(train_data, label='Training Data')
plt.plot(test_data, label='Testing Data')
plt.plot(predictions, label='Predicted Data')
plt.legend()
plt.show()
```
完整代码如下:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.statespace.sarimax import SARIMAX
# 准备时间序列数据
df = pd.read_csv('data.csv', parse_dates=['date'], index_col='date')
# 拆分数据集
train_data = df[:int(0.8*(len(df)))]
test_data = df[int(0.8*(len(df))):]
# 拟合SARIMAX模型
model = SARIMAX(train_data, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
result = model.fit()
# 预测未来值
start = len(train_data)
end = len(train_data) + len(test_data) - 1
predictions = result.predict(start=start, end=end, dynamic=False, typ='levels').rename('SARIMAX(1,1,1)(1,1,1,12) Predictions')
# 可视化比较
plt.figure(figsize=(12,5), dpi=100)
plt.plot(train_data, label='Training Data')
plt.plot(test_data, label='Testing Data')
plt.plot(predictions, label='Predicted Data')
plt.legend()
plt.show()
```