SARIMA python代码实现
时间: 2023-11-16 15:00:34 浏览: 345
SARIMA是一种时间序列预测模型,它是ARIMA模型的扩展,可以处理季节性时间序列数据。下面是SARIMA模型的Python代码实现:
```python
from statsmodels.tsa.statespace.sarimax import SARIMAX
# 创建SARIMA模型
model = SARIMAX(train_data, order=(p, d, q), seasonal_order=(P, D, Q, s))
# 拟合模型
model_fit = model.fit()
# 预测未来值
predictions = model_fit.predict(start=len(train_data), end=len(train_data)+len(test_data)-1, dynamic=False)
```
其中,train_data是训练数据,test_data是测试数据,p、d、q、P、D、Q、s是SARIMA模型的参数。model_fit.predict()函数用于预测未来值。
相关问题
季节性自回归集成移动平均模型(SARIMA)python代码
以下是使用Python实现季节性自回归集成移动平均模型(SARIMA)的代码:
首先,导入必要的库:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
```
接着,读取时间序列数据:
```python
df = pd.read_csv('data.csv', parse_dates=['datetime'], index_col='datetime')
```
其中,data.csv是一个包含日期时间和时间序列数据的CSV文件,datetime列被解析为日期时间格式,并被设置为索引列。
然后,检查和处理数据:
```python
# 检查缺失值
print(df.isnull().sum())
# 填充缺失值
df = df.fillna(method='ffill')
# 检查重复值
print(df.duplicated().sum())
```
我们发现缺失值并用前向填充方法进行填充,同时也检查了是否有重复值。
接下来,根据季节性和趋势性进行差分:
```python
# 差分
diff = df.diff(periods=1)
diff = diff.dropna()
# 绘制差分后的图像
plt.plot(diff)
plt.show()
```
这里我们选择了一阶差分,并绘制了差分后的时间序列图。
然后,对差分后的时间序列数据进行模型拟合和预测:
```python
# 拟合 SARIMA 模型
model = SARIMAX(df, order=(1, 1, 1), seasonal_order=(0, 1, 1, 12))
result = model.fit()
# 预测未来 12 个月
forecast = result.predict(start=len(df), end=len(df)+11, dynamic=True)
# 绘制预测结果
plt.plot(df, label='Actual')
plt.plot(forecast, label='Forecast')
plt.legend()
plt.show()
```
这里我们使用了SARIMA模型,其中order和seasonal_order参数分别设置了ARIMA模型的阶数和季节性阶数。我们用拟合好的模型对未来12个月的数据进行预测,并将结果绘制在时间序列图上。
最后,输出模型评估指标:
```python
# 输出模型评估指标
print(result.summary())
```
这里我们使用result.summary()输出了模型的各项指标,如AIC、BIC、残差等。
SARIMA预测模型实现代码
以下是使用Python中的statsmodels库实现SARIMA模型的代码示例:
首先,我们需要导入必要的库和数据集。在本例中,我们将使用statsmodels库中的airpassengers数据集。
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller
# Load data
data = pd.read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv')
```
接下来,我们将对时间序列数据进行预处理。我们将使用月份作为时间间隔,并将“Month”列转换为datetime格式。
```python
# Preprocessing
data['Month'] = pd.to_datetime(data['Month'])
data.set_index('Month', inplace=True)
data.index.freq = 'MS'
```
然后,我们将对时间序列进行可视化,以便更好地了解其趋势、季节性和噪音等特征。
```python
# Visualize data
plt.figure(figsize=(10, 6))
plt.plot(data)
plt.xlabel('Year')
plt.ylabel('Passengers')
plt.title('Air Passengers Data')
plt.show()
```
接下来,我们需要确定时间序列的阶数。我们可以使用自相关函数(ACF)和部分自相关函数(PACF)来确定模型的阶数。
```python
# Determine order of differencing (d) using Augmented Dickey-Fuller Test
result = adfuller(data['#Passengers'])
print('ADF Statistic: {}'.format(result[0]))
print('p-value: {}'.format(result[1]))
# Determine order of AR term (p) using PACF
plot_pacf(data, lags=30)
plt.show()
# Determine order of MA term (q) using ACF
plot_acf(data, lags=30)
plt.show()
```
在这里,我们使用了Augmented Dickey-Fuller测试来确定要对时间序列进行多少级差分。然后,我们使用PACF和ACF来确定AR和MA项的阶数。
接下来,我们将创建SARIMA模型并训练它。
```python
# Define the SARIMA model and fit it to the data
model = SARIMAX(data, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
results = model.fit()
# Print summary of the model
print(results.summary())
```
在这里,我们定义了一个SARIMA模型,并将其训练到数据上。我们使用order参数指定ARIMA模型的阶数,使用seasonal_order参数指定季节性ARIMA模型的阶数。在这里,我们使用(1, 1, 1)和(1, 1, 1, 12)作为参数值。
最后,我们可以使用训练后的模型进行预测。
```python
# Generate predictions
preds = results.predict(start='1959-01-01', end='1960-12-01')
# Visualize predictions
plt.figure(figsize=(10, 6))
plt.plot(data, label='Observed')
plt.plot(preds, label='Predicted')
plt.xlabel('Year')
plt.ylabel('Passengers')
plt.title('Air Passengers Data')
plt.legend()
plt.show()
```
在这里,我们生成了从1959年1月到1960年12月的预测,并使用可视化工具查看了预测结果。
阅读全文