# Python自回归移动平均和自回归综合移动平均及快速预测每月飞机乘客

{% tabs %}
{% tab title="关键词" %}
Python | 自回归移动平均(ARMA) | 自回归综合移动平均(ARIMA) | 探索性数据分析(EDA) | Pandas | NumPy | seaborn | Matplotlib
{% endtab %}

{% tab title="梗概" %}
理解并在 Python 中实现 ARMA 和 ARIMA 模型以进行时间序列预测。

### ARMA(自回归移动平均)模型

回想一下，$$p$$阶的自回归过程定义为：

$$y_{t}=c+\phi_{1} y_{t-1}+\phi_{2} y_{t-2}+\ldots+\phi_{p} y_{t-p}+\epsilon_{t}$$

其中，$$p$$是阶数，$$c$$是常数，$$\epsilon$$是噪音

还记得移动平均过程 $$q$$ 定义为：

$$y_{t}=c+\epsilon_{t}+\theta_{1} \epsilon_{t-1}+\theta_{2} \epsilon_{t-2}+. . \theta_{q} \epsilon_{t-q}$$

其中，$$q$$是阶数，$$c$$是常数，$$\epsilon$$是噪音

ARMA(p,q) 只是将两个模型组合成一个方程：

$$y_{t}=c+\epsilon_{t}+\theta_{1} \epsilon_{t-1}+\theta_{2} \epsilon_{t-2}+\ldots \theta_{q} \epsilon_{t-q}+\phi_{1} y_{t-1}+\phi_{2} y_{t-2}+\ldots+\phi_{p} y_{t-p}$$

因此，该模型可以解释时间序列与随机噪声（移动平均部分）和前一步（自回归部分）本身的关系。

#### 模拟此过程

让我们从移动平均和自回归部分的 1 阶 ARMA 过程的简单示例开始。

```python
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.arima_process import ArmaProcess
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.stattools import pacf
from statsmodels.tsa.stattools import acf
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
```

然后，我们将模拟以下 ARMA 流程：

$$y_{t}=1+0.9 \epsilon_{t-1}+1+0.33 y_{t-1}$$

我们现在可以绘制前 200 个点，可视化生成的时间序列：

```python
plt.figure(figsize=[15, 7.5]); # Set dimensions for figure
plt.plot(simulated_ARMA_data)
plt.title("Simulated ARMA(1,1) Process")
plt.xlim([0, 200])
plt.show()
```

然后，我们可以看一下 ACF 和 PACF 图：

#### 模拟 ARMA(2,2) 过程

### ARIMA(自回归综合移动平均)模型

#### 项目1：每季收益额建模

### 预测误差估计量

```python
ps = range(0, 8, 1)
d = 1
qs = range(0, 8, 1)
# Create a list with all possible combination of parameters
parameters = product(ps, qs)
parameters_list = list(parameters)
order_list = []
for each in parameters_list:
    each = list(each)
    each.insert(1, 1)
    each = tuple(each)
    order_list.append(each)
    
result_df = optimize_ARIMA(order_list, exog=data['data'])
result_df
```

### 项目2：快速预测每月飞机乘客

### 源代码
{% endtab %}
{% endtabs %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}
