分析时间序列数据
预测给定输入序列中的下一个是机器学习中的另一个重要概念。 本章为您提供有关分析时间序列数据的详细说明。
时间序列数据介绍
时间序列数据表示处于一系列特定时间间隔的数据。 如果我们想在机器学习中构建序列预测,那么必须处理连续的数据和时间。 系列数据是连续数据的摘要。 数据排序是顺序数据的一个重要特征。
序列分析或时间序列分析的基本概念
序列分析或时间序列分析是基于先前观察到的预测给定输入序列中的下一个。 预测可以是任何可能接下来的事情:符号,数字,次日天气,下一个演讲等。序列分析在诸如股票市场分析,天气预报和产品推荐等应用中非常有用。
实例
考虑下面的例子来理解序列预测。 这里A,B,C,D是给定值,并且必须使用序列预测模型预测值E。
安装有用的包
对于使用Python进行时间序列数据分析,我们需要安装以下软件包 -
Pandas
Pandas是一个开源的BSD许可库,它为Python提供了高性能,简便的数据结构使用和数据分析工具。
有关Pandas教程,请访问以下网址:http://www.zyiz.net/pandas/
使用以下命令安装Pandas -
pip install pandas
如果您使用的是Anaconda并希望使用conda软件包管理器进行安装,那么可以使用以下命令 -
conda install -c anaconda pandas
hmmlearn
它是一个开源BSD许可的库,它由简单的算法和模型组成,用于学习Python中的隐马尔可夫模型(HMM)。 使用以下命令安装它 -
pip install hmmlearn
如果您使用的是Anaconda并希望使用conda软件包管理器进行安装,那么可以使用以下命令 -
conda install -c anaconda hmmlearn
PyStruct
它是一个结构化的学习和预测库。 在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
包对带有日期数据进行索引 - 使用
ts.resample
包执行重新采样 - 改变频率
示例
以下示例显示使用Pandas处理和分割时间序列数据。 请注意,这里使用月度北极涛动数据,可以从monthly.ao.index.b50.current.ascii
下载并可以转换为文本格式。
处理时间序列数据
要处理时间序列数据,您必须执行以下步骤 -
第1步 ,导入以下软件包 -
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()
重采样输出的图形 -
使用median()重新采样
使用以下代码使用median()
方法重新采样数据 -
timeseries_mm = timeseries.resample("A").median() timeseries_mm.plot() plt.show()
然后,观察下面的图形是使用median()
重新采样的输出 -
滚动平均值
使用下面的代码来计算滚动(移动)的平均值 -
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可以被定义为λ=(S,O,A,B,π)
,
其中,
- S = {s1,s2,…,sN}是一组N个可能的状态,
- O = {o1,o2,…,oM}是一组M个可能的观察符号,
- A是N×N状态转移概率矩阵(TPM),
- B是N
扫描二维码
程序员编程王