# Python时间序列统计模型自回归预测网络流量

{% tabs %}
{% tab title="关键词" %}
Python | 时间序列 | 统计自回归预测模型 | 网络流量 | NumPy | Matplotlib | Pandas
{% endtab %}

{% tab title="梗概" %}
预测过程包括预测时间序列的未来值，或者通过仅基于其过去行为（自回归）对序列进行建模，或者通过使用其他外部变量来进行建模。 本文档描述了如何使用机器学习和统计模型来预测访问网站的流量。

使用自 2020 年 7 月 1 日起，查看网站的每日访问历史。 目标是生成一个能够预测未来 7 天网络流量的预测模型。 用户希望能够在每周一运行模型并获得本周剩余时间的每日流量预测。

为了根据预期用途评估模型的性能，建议不要仅预测时间序列的最后 7 天，而是模拟整个过程。 执行此类验证时可以使用的两种策略是：

* 每次在进行预测之前都会对模型进行训练，这样，模型就可以使用迄今为止所有可用的信息。 它是标准交叉验证的一种变体，但不是随机分布观察结果，而是按顺序增加训练集，保持数据的时间顺序。
* 在初始训练之后，模型被顺序使用却不更新它并遵循数据的时间顺序。 这种策略的优点是速度更快，因为模型只训练一次。 但是，该模型没有包含可用的最新信息，因此它可能会随着时间的推移失去预测能力。

最合适的验证方法将取决于生产中使用的策略，模型是否将在预测过程之前定期重新训练。

### 数据集

数据已从集成到网站中的分析服务获得，可在此处下载。包含的字段有：

* 日期：日/月/年
* 用户：访问网络的用户总数

```python
data['date'] = pd.to_datetime(data['date'], format='%d/%m/%y')
data = data.set_index('date')
data = data.asfreq('1D')
data = data.sort_index()
```

```python
# Split data: train-validation-test
# ==============================================================================
end_train = '2021-03-30 23:59:00'
end_validation = '2021-06-30 23:59:00'

data_train = data.loc[: end_train, :]
data_val   = data.loc[end_train:end_validation, :]
data_test  = data.loc[end_validation:, :]

print(f"Training dates   : {data_train.index.min()} --- {data_train.index.max()}")
print(f"Validation dates : {data_val.index.min()} --- {data_val.index.max()}")
print(f"Test dates       : {data_test.index.min()} --- {data_test.index.max()}")
```

### 图形趋势绘制

使用时间序列时，表示它们的值很重要。这允许识别趋势和季节性等模式。

```python
plot_train = data_train.users.hvplot.line(label='train')
plot_val   = data_val.users.hvplot.line(label='val')
plot_test  = data_test.users.hvplot.line(label='test')

layout = plot_train * plot_val * plot_test
layout = layout.opts(title='Daily visitors', ylabel='users')
layout
```

#### 自相关图

### 自回归模型

#### 预测模型训练

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

### 预测添加外生特征

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

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