引言

时间序列分析属于统计学的一个分支,它涉及对有序的,通常是时间数据的研究。 时间序列分析可以揭示未知的趋势,提取有用的统计数据,甚至预测未来的趋势。 由于这些原因,它被应用于许多领域,包括经济、天气预报、能力规划等等。

在本教程中,我们将介绍在时间序列分析中使用的一些常用技术,并逐步介绍操作、可视化时间序列数据所需的迭代步骤。

先决条件

本指南将介绍如何在本地桌面或远程服务器上进行时间序列分析。 处理大型数据集可能需要大量内存,因此无论哪种情况,计算机都需要至少2 GB 的内存来执行本指南中的一些计算。

在本教程中,我们将使用 Jupyter Notebook 处理数据。 如果你还没有,你应该按照我们的教程来安装和设置 Python 3的 Jupyter Notebook。

第一步ー安装软件包

我们将利用 pandas 库和 statsmodels 库,前者在处理数据时提供了很大的灵活性,后者允许我们用 Python 执行统计计算。 这两个库一起使用,扩展了 Python 以提供更好的功能,并显著增加了我们的分析工具包。

与其他 Python 包一样,我们可以使用 pip 安装 pandas 和 statsmodels。 首先,让我们进入本地编程环境或基于服务器的编程环境:

  • cd environments
  • . my_env/bin/activate

从这里,让我们为我们的项目创建一个新的目录。 我们将称之为时间片,然后移动到目录中。 如果您称项目为不同的名称,请确保在整个指南中将您的名称替换为时间片段

  • mkdir timeseries
  • cd timeseries

我们现在可以安装 pandas、 statsmodels 和数据绘图包 matplotlib。 它们的依赖项也会被安装:

  • pip install pandas statsmodels matplotlib

在这一点上,我们现在准备开始与大熊猫和州政府合作。

第二步ー载入时间序列资料

为了开始处理我们的数据,我们将启动 Jupyter Notebook:

  • jupyter notebook

要创建一个新的笔记本文件,从右上角的下拉菜单中选择 New python3:

这将打开一个笔记本,允许我们加载所需的库(注意用于引用 pandas、 matplotlib 和 statsmodels 的标准缩写)。 在我们的笔记本的顶部,我们应该写下:

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

在本教程中的每个代码块之后,您应该键入 ALT + ENTER 来运行代码并移动到笔记本中的新代码块中。

方便的是,statsmodels 带有内置的数据集,因此我们可以直接将时间序列数据集加载到内存中。

我们将使用一个名为“来自美国夏威夷莫纳罗亚火山天文台的连续空气样本的大气二氧化碳”的数据集,该数据集收集了1958年3月至2001年12月的二氧化碳样本。 我们可以提供以下数据:

data = sm.datasets.co2.load_pandas()
co2 = data.data

让我们来看看时间序列数据的前5行是什么样的:

print(co2.head(5))
Output
co2 1958-03-29 316.1 1958-04-05 317.3 1958-04-12 317.6 1958-04-19 317.5 1958-04-26 316.4

随着我们的软件包的导入和 CO2数据集的准备,我们可以继续索引我们的数据。

第三步ー利用时间序列资料建立索引

你可能已经注意到,日期已经被设置为我们的大熊猫 DataFrame 的索引。 在 Python 中处理时间序列数据时,我们应该确保将日期用作索引,所以一定要经常检查这一点,这可以通过运行以下命令来实现:

co2.index
Output
DatetimeIndex(['1958-03-29', '1958-04-05', '1958-04-12', '1958-04-19', '1958-04-26', '1958-05-03', '1958-05-10', '1958-05-17', '1958-05-24', '1958-05-31', ... '2001-10-27', '2001-11-03', '2001-11-10', '2001-11-17', '2001-11-24', '2001-12-01', '2001-12-08', '2001-12-15', '2001-12-22', '2001-12-29'], dtype='datetime64[ns]', length=2284, freq='W-SAT')

Dtype datetime [ ns ]字段确认我们的索引是由日期戳对象组成的,而长度为2284和 freq‘ W-SAT’则告诉我们从周六开始每周有2,284个日期戳。

周数据可能很难处理,所以让我们使用我们的时间序列的月平均值来代替。 这可以通过使用方便的重采样函数来实现,该函数允许我们将时间序列分组为桶(1个月) ,对每个组应用一个函数(平均值) ,并将结果(每组一行)结合起来。

y = co2['co2'].resample('MS').mean()

在这里,术语 MS 意味着我们将数据按照月份分组,并确保我们使用每个月的开始时间作为时间戳:

y.head(5)
Output
1958-03-01 316.100 1958-04-01 317.200 1958-05-01 317.120 1958-06-01 315.800 1958-07-01 315.625 Freq: MS, Name: co2, dtype: float64

大熊猫的一个有趣的特征是它处理日期戳索引的能力,这使我们能够快速地分割我们的数据。 例如,我们可以对数据集进行切片,只检索1990年以后的数据点:

y['1990':]
Output
1990-01-01 353.650 1990-02-01 354.650 ... 2001-11-01 369.375 2001-12-01 371.020 Freq: MS, Name: co2, dtype: float64

或者,我们可以对数据集进行切片,只检索1995年10月至1996年10月期间的数据点:

y['1995-10-01':'1996-10-01']
Output
1995-10-01 357.850 1995-11-01 359.475 1995-12-01 360.700 1996-01-01 362.025 1996-02-01 363.175 1996-03-01 364.060 1996-04-01 364.700 1996-05-01 365.325 1996-06-01 364.880 1996-07-01 363.475 1996-08-01 361.320 1996-09-01 359.400 1996-10-01 359.625 Freq: MS, Name: co2, dtype: float64

通过对数据进行适当的索引以处理时态数据,我们可以转向处理可能丢失的值。

步骤4ー处理时间序列数据中的缺失值

现实世界的数据往往是混乱的。 从图中我们可以看到,时间序列数据包含缺失值的情况并不少见。 最简单的检查方法是直接绘制数据,或者使用下面的命令来显示输出中的缺失数据:

y.isnull().sum()
Output
5

这个输出告诉我们,我们的时间序列中有5个月缺失值。

一般来说,如果缺失的值不是太多,我们应该“填补”它们,这样我们就不会在数据中出现空白。 我们可以使用 fillna ()命令在熊猫中进行此操作。 为了简单起见,我们可以用时间序列中最接近的非空值来填充缺失的值,尽管有时最好使用滚动平均值。

y = y.fillna(y.bfill())

填充了缺失的值之后,我们可以再次检查是否存在空值,以确保我们的操作正常运行:

y.isnull().sum()
Output
0

在执行这些操作之后,我们看到我们已经成功地填补了时间序列中所有缺失的值。

第五步ー时间序列数据的可视化

在处理时间序列数据时,可以通过可视化显示很多信息。 需要注意的一些事情是:

  • 季节性: 数据是否显示一个清晰的周期模式?
  • 趋势: 数据是一致的上升还是下降?
  • 噪声: 是否存在与其余数据不一致的异常点或缺失值?

我们可以在 matplotlib API 周围使用 pandas 包装器来显示我们数据集的图形:

y.plot(figsize=(15, 6))
plt.show()

在对数据进行绘图时,会出现一些可区分的模式。 时间序列具有明显的季节性特征,总体呈上升趋势。 我们还可以使用一种称为时间序列分解的方法来可视化我们的数据。 顾名思义,时间序列分解允许我们将时间序列分解为三个不同的组成部分: 趋势、季节性和噪音。

幸运的是,statsmos 提供了方便的季节分解功能,实现了季节分解。 如果您有兴趣了解更多,可以参考下面的文章,“ STL: 基于黄土的季节趋势分解过程”

下面的脚本展示了如何在 Python 中执行时间序列的季节性分解。 缺省情况下,季节分解返回的数字相对较小,因此这个代码块的前两行确保输出数字足够大以便我们可视化。

from pylab import rcParams
rcParams['figure.figsize'] = 11, 9

decomposition = sm.tsa.seasonal_decompose(y, model='additive')
fig = decomposition.plot()
plt.show()

使用时间序列分解可以更容易地快速识别数据中变化的均值或变化。 上面的图表清楚地显示了我们数据的上升趋势,以及它的年度季节性。 这些可以用来理解我们的时间序列的结构。 时间序列分解背后的直觉很重要,因为许多预测方法都是建立在这种结构化分解的概念之上来产生预测。

总结

如果您按照本指南进行了操作,那么您现在已经有了用 Python 可视化和操作时间序列数据的经验。

为了进一步提高您的技能,您可以加载另一个数据集并重复本教程中的所有步骤。 例如,您可能希望使用 pandas 库读取 CSV 文件,或者使用 statsmodels 库预加载的太阳黑子数据集: data sm.datasets.sunspots.load pandas ()。 数据。