时间序列处理与应用


介绍

一般情况下,在进行数据分析时,几乎都会遇到与时间序列相关的任务。例如:某企业的某项指标在第二天或者每周,又或每月等会发生什么;某款应用每天的下载量是多少等等。在本节实验中,将使用不同的方法来处理这些与时间序列相关的任务。

在本节中,还会介绍如何使用 Python 中的时间序列处理工具,可以使用哪些方法和模型进行预测,什么是双指数和三指数拟合,如果遇到非平稳的数据该怎么办,如何建立 SARIMA 模型,如何使用 XGBoost 进行预测等。此外,本次实验也会将这些算法应用在来自实际采集的数据中。

知识点

  • 时间序列
  • SARIMA
  • 线性回归
  • XGBoost
  • Prophet

时间序列数据介绍

让我们先从时间序列的简单 开始。一般情况下,时间序列可以定义如下:

时间序列指的是同一个统计指标的数值按其发生的时间先后顺序排列而构成的一组数列。

因此,时间序列数据通常是与时间相关的序列数据,并且与随机样本数据相比,时间序列可能会包含了一些有用的历史信息。

在本次实验中,主要使用 Statsmodels 这个库来对序列进行处理,该库拥有许多的统计函数,也包括处理时间序列的函数。对于从 R 语言转到 Python 的人来说,Statsmodels 肯定会更加熟悉,因为它支持 Wage~Egex + Education 等模型定义。先导入一些实验所需要的库。

In [1]:
import warnings
from itertools import product
from dateutil.relativedelta import relativedelta
from tqdm import tqdm_notebook
from scipy import stats
import scipy.stats as scs
import statsmodels.api as sm
import statsmodels.tsa.api as smt
import statsmodels.formula.api as smf  # 统计与计量
from scipy.optimize import minimize  # 优化函数
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
%matplotlib inline
warnings.filterwarnings('ignore')

为了直观地理解时间序列。通过举个例子来进行说明,这里有一份真实的手机游戏数据,记录的是用户每小时观看的广告和每天游戏货币的支出,先导入数据集。

In [2]:
ads = pd.read_csv('../../data/ads.csv',
                  index_col=['Time'], parse_dates=['Time'])
currency = pd.read_csv('../../data/currency.csv',
                       index_col=['Time'], parse_dates=['Time'])
ads.shape, currency.shape
Out[2]:
((216, 1), (300, 1))

为了便于观察,画出广告数据的图形。

In [3]:
plt.figure(figsize=(15, 4))
plt.plot(ads.Ads.values)
plt.title('Ads watched (hourly data)')
plt.grid(True)
plt.show()

同样的方法,画出游戏币支出的图形。

In [4]:
plt.figure(figsize=(15, 4))
plt.plot(currency.GEMS_GEMS_SPENT)
plt.title('In-game currency spent (daily data)')
plt.grid(True)
plt.show()

预测质量评价指标

在开始预测之前,先来理解怎么样去评估模型预测结果的好坏。常用的评价指标如下: