AI 使用 Python – 分析时间序列数据


预测给定输入序列中的下一个是机器学习中的另一个重要概念。本章为您详细介绍了如何分析时间序列数据。

介绍

时间序列数据是指一系列特定时间间隔内的数据。如果我们想在机器学习中建立序列预测,那么我们必须处理序列数据和时间。系列数据是顺序数据的抽象。数据的排序是顺序数据的一个重要特征。

序列分析或时间序列分析的基本概念

序列分析或时间序列分析是根据先前观察到的情况来预测给定输入序列中的下一个。预测可以是接下来可能出现的任何内容:符号、数字、第二天的天气、下一个演讲术语等。序列分析在股票市场分析、天气预报和产品推荐等应用中非常方便。

例子

请考虑以下示例以了解序列预测。这里A、B、C、D是给定值,您必须使用序列预测模型来预测值E。

序列预测模型

安装有用的包

对于使用 Python 进行时间序列数据分析,我们需要安装以下软件包 -

pandas

Pandas 是一个 BSD 许可的开源库,为 Python 提供高性能、易于使用的数据结构和数据分析工具。您可以借助以下命令安装 Pandas -

pip install pandas

如果您使用 Anaconda 并希望使用conda包管理器进行安装,则可以使用以下命令 -

conda install -c anaconda pandas

嗯学习

它是一个 BSD 许可的开源库,由简单的算法和模型组成,用于在 Python 中学习隐马尔可夫模型(HMM)。您可以在以下命令的帮助下安装它 -

pip install hmmlearn

如果您使用 Anaconda 并希望使用conda包管理器进行安装,则可以使用以下命令 -

conda install -c omnia hmmlearn

结构体

它是一个结构化的学习和预测库。PyStruct 中实现的学习算法的名称包括条件随机场 (CRF)、最大边际马尔可夫随机网络 (M3N) 或结构支持向量机。您可以在以下命令的帮助下安装它 -

pip install pystruct

CVXOPT

它用于基于Python编程语言的凸优化。它也是一个免费软件包。您可以借助以下命令安装它 -

pip install cvxopt

如果您使用 Anaconda 并希望使用conda包管理器进行安装,则可以使用以下命令 -

conda install -c anaconda cvdoxt

Pandas:处理、切片和从时间序列数据中提取统计数据

如果您必须处理时间序列数据,Pandas 是一个非常有用的工具。在 Pandas 的帮助下,您可以执行以下操作 -

  • 使用pd.date_range包创建日期范围

  • 使用pd.Series包为 pandas 建立索引

  • 使用ts.resample包执行重新采样

  • 改变频率

例子

以下示例展示了使用 Pandas 处理和切片时间序列数据。请注意,这里我们使用的是每月北极涛动数据,该数据可以从monthly.ao.index.b50.current.ascii下载,并且可以转换为文本格式供我们使用。

处理时间序列数据

为了处理时间序列数据,您必须执行以下步骤 -

第一步涉及导入以下包 -

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

接下来,定义一个将从输入文件中读取数据的函数,如下面给出的代码所示 -

def read_data(input_file):
   input_data = np.loadtxt(input_file, delimiter = None)

现在,将此数据转换为时间序列。为此,创建时间序列的日期范围。在本例中,我们保留一个月作为数据频率。我们的文件包含从 1950 年 1 月开始的数据。

dates = pd.date_range('1950-01', periods = input_data.shape[0], freq = 'M')

在此步骤中,我们借助 Pandas Series 创建时间序列数据,如下所示 -

output = pd.Series(input_data[:, index], index = dates)	
return output
	
if __name__=='__main__':

输入输入文件的路径,如下所示 -

input_file = "/Users/admin/AO.txt"

现在,将列转换为时间序列格式,如下所示 -

timeseries = read_data(input_file)

最后,使用所示命令绘制和可视化数据 -

plt.figure()
timeseries.plot()
plt.show()

您将观察到如下图所示的图 -

测试系列

地块

时间序列数据切片

切片涉及仅检索时间序列数据的一部分。作为示例的一部分,我们仅对 1980 年到 1990 年的数据进行切片。观察执行此任务的以下代码 -

timeseries['1980':'1990'].plot()
   <matplotlib.axes._subplots.AxesSubplot at 0xa0e4b00>

plt.show()

当您运行用于切片时间序列数据的代码时,您可以观察到下图,如下图所示 -

时间序列数据切片

从时间序列数据中提取统计数据

如果您需要得出一些重要的结论,您将必须从给定的数据中提取一些统计数据。平均值、方差、相关性、最大值和最小值是此类统计数据中的一些。如果您想从给定的时间序列数据中提取此类统计信息,您可以使用以下代码 -

意思是

您可以使用Mean()函数来查找平均值,如下所示 -

timeseries.mean()

那么您将在所讨论的示例中观察到的输出是 -

-0.11143128165238671

最大限度

您可以使用max()函数来查找最大值,如下所示 -

timeseries.max()

那么您将在所讨论的示例中观察到的输出是 -

3.4952999999999999

最低限度

您可以使用 min() 函数来查找最小值,如下所示 -

timeseries.min()

那么您将在所讨论的示例中观察到的输出是 -

-4.2656999999999998

一次性获得所有内容

如果您想一次计算所有统计数据,您可以使用describe()函数,如下所示 -

timeseries.describe()

那么您将在所讨论的示例中观察到的输出是 -

count   817.000000
mean     -0.111431
std       1.003151
min      -4.265700
25%      -0.649430
50%      -0.042744
75%       0.475720
max       3.495300
dtype: float64

重新采样

您可以将数据重新采样到不同的时间频率。执行重采样的两个参数是 -

  • 时间段
  • 方法

使用mean()重新采样

您可以使用以下代码通过mean()方法对数据进行重新采样,这是默认方法 -

timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()

然后,您可以观察下图作为使用mean()重采样的输出 -

均值法重新采样

使用中位数()重新采样

您可以使用以下代码使用中值()方法对数据重新采样-

timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()

然后,您可以观察下图作为使用中位数()重新采样的输出 -

中值法重新抽样

滚动平均值

您可以使用以下代码来计算滚动(移动)平均值 -

timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()

然后,您可以观察下图作为滚动(移动)平均值的输出 -

滚动平均值

通过隐马尔可夫模型 (HMM) 分析序列数据

HMM是一种统计模型,广泛应用于具有连续性和可扩展性的数据,例如时间序列股市分析、健康检查、语音识别等。本节详细介绍使用隐马尔可夫模型 (HMM) 分析序列数据。

隐马尔可夫模型(HMM)

HMM 是一种随机模型,它建立在马尔可夫链的概念之上,基于这样的假设:未来统计的概率仅取决于当前的过程状态,而不是其之前的任何状态。例如,抛硬币时,我们不能说第五次抛的结果是正面。这是因为硬币没有任何记忆,下一个结果不依赖于上一个结果。

从数学上讲,HMM 由以下变量组成 -

州 (S)

它是 HMM 中存在的一组隐藏或潜在状态。用S表示。

输出符号(O)

它是 HMM 中存在的一组可能的输出符号。用O表示。

状态转移概率矩阵 (A)

它是从一种状态转换到其他每种状态的概率。用A表示。

观测发射概率矩阵 (B)

它是在特定状态下发射/观察符号的概率。其用B表示。

先验概率矩阵 (Π)

它是从系统的各种状态开始到特定状态的概率。用Π表示。

因此,HMM 可以定义为