- Python AI 教程
- 首页
- Python AI – 基础概念
- Python AI – 入门
- Python AI – 机器学习
- Python AI – 数据准备
- 监督学习:分类
- 监督学习:回归
- Python AI – 逻辑编程
- 无监督学习:聚类
- 自然语言处理
- Python AI – NLTK 包
- 时间序列数据分析
- Python AI – 语音识别
- Python AI – 启发式搜索
- Python AI – 游戏
- Python AI – 神经网络
- 强化学习
- Python AI – 遗传算法
- Python AI – 计算机视觉
- Python AI – 深度学习
- Python AI 资源
- Python AI – 快速指南
- Python AI – 有用资源
- Python AI – 讨论
Python AI – 时间序列数据分析
预测给定输入序列中的下一个值是机器学习中的另一个重要概念。本章将详细解释如何分析时间序列数据。
介绍
时间序列数据是指以特定时间间隔连续出现的数据。如果我们想在机器学习中构建序列预测模型,那么我们必须处理顺序数据和时间。序列数据是顺序数据的抽象。数据的顺序是顺序数据的一个重要特征。
序列分析或时间序列分析的基本概念
序列分析或时间序列分析是根据先前观察到的数据来预测给定输入序列中的下一个值。预测可以是任何可能接下来出现的内容:符号、数字、次日天气、语音中的下一个词等等。序列分析在股票市场分析、天气预报和产品推荐等应用中非常有用。
示例
考虑以下示例来理解序列预测。这里A,B,C,D是给定的值,您必须使用序列预测模型预测值E。
安装有用的软件包
对于使用 Python 进行时间序列数据分析,我们需要安装以下软件包:
Pandas
Pandas 是一个开源的 BSD 许可库,它为 Python 提供高性能、易于使用的数据结构和数据分析工具。您可以使用以下命令安装 Pandas:
pip install pandas
如果您使用的是 Anaconda 并希望使用conda包管理器安装,则可以使用以下命令:
conda install -c anaconda pandas
hmmlearn
这是一个开源的 BSD 许可库,它包含简单的算法和模型,用于在 Python 中学习隐马尔可夫模型 (HMM)。您可以使用以下命令安装它:
pip install hmmlearn
如果您使用的是 Anaconda 并希望使用conda包管理器安装,则可以使用以下命令:
conda install -c omnia 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包按日期索引 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() 重新采样的输出图表:
使用 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𝒙M观测或发射概率矩阵 (EPM),
- π 是一个 N 维初始状态概率分布向量。
示例:股票市场数据分析
在这个示例中,我们将逐步分析股票市场数据,以了解 HMM 如何与顺序数据或时间序列数据一起工作。请注意,我们正在 Python 中实现此示例。
导入必要的软件包,如下所示:
import datetime import warnings
现在,使用matpotlib.finance包中的股票市场数据,如下所示:
import numpy as np
from matplotlib import cm, pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator
try:
from matplotlib.finance import quotes_historical_yahoo_och1
except ImportError:
from matplotlib.finance import (
quotes_historical_yahoo as quotes_historical_yahoo_och1)
from hmmlearn.hmm import GaussianHMM
从开始日期和结束日期加载数据,即在两个特定日期之间,如下所示:
start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)
在此步骤中,我们将提取每天的收盘价。为此,使用以下命令:
closing_quotes = np.array([quote[2] for quote in quotes])
现在,我们将提取每天交易的股票数量。为此,使用以下命令:
volumes = np.array([quote[5] for quote in quotes])[1:]
在这里,使用以下代码获取收盘价的百分比差异:
diff_percentages = 100.0 * np.diff(closing_quotes) / closing_quotes[:-] dates = np.array([quote[0] for quote in quotes], dtype = np.int)[1:] training_data = np.column_stack([diff_percentages, volumes])
在此步骤中,创建并训练高斯 HMM。为此,使用以下代码:
hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
warnings.simplefilter('ignore')
hmm.fit(training_data)
现在,使用显示的命令使用 HMM 模型生成数据:
num_samples = 300 samples, _ = hmm.sample(num_samples)
最后,在此步骤中,我们将绘制和可视化差异百分比和交易的股票数量作为图表的输出。
使用以下代码绘制和可视化差异百分比:
plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')
使用以下代码绘制和可视化交易的股票数量:
plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()