Artificial Intelligence With Python 简明教程
AI with Python – Analyzing Time Series Data
预测给定输入序列中的下一个序列是机器学习中的另一个重要概念。本章详细解释了如何分析时间序列数据。
hmmlearn
这是一个开源的 BSD 许可库,其中包含一些简单的算法和模型来学习 Python 中的隐马尔可夫模型 (HMM)。您可以使用以下命令安装它:
pip install hmmlearn
如果您使用的是 Anaconda,并且想通过 conda 软件包管理器进行安装,则可以使用以下命令:
conda install -c omnia hmmlearn
Pandas: Handling, Slicing and Extracting Statistic from Time Series Data
如果您需要处理时间序列数据,Pandas 是一个非常有用的工具。借助 Pandas,您可以执行以下操作:
-
使用 pd.date_range 软件包创建日期范围
-
使用 pd.Series 软件包用日期对 Pandas 进行索引
-
使用 ts.resample 软件包执行重新采样
-
Change the frequency
Example
以下示例演示了如何使用 Pandas 处理和切分时间序列数据。请注意,此处我们使用的是北极涛动月度数据,它可以从以下链接下载: monthly.ao.index.b50.current.ascii ,并且可以转换成文本格式供我们使用。
Handling time series data
要处理时间序列数据,您需要执行以下步骤:
第一步是导入以下软件包:
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()
您将观察到如下图像中所示的图表 -
Extracting Statistic from Time Series Data
在需要得出一些重要结论的情况下,您必须从给定的数据中提取一些统计信息。均值、方差、相关性、最大值和最小值是此类统计数据的一部分。如果您想从给定的时间序列数据中提取此类统计信息,可以使用以下代码 -
Getting everything at once
如果您想一次计算所有统计信息,您可以使用 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
Re-sampling with mean()
您可以使用以下代码使用 mean() 方法重新采样数据,这是默认方法 -
timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()
然后,您可以观察以下图形作为使用 mean() 重新采样的输出 -
Analyzing Sequential Data by Hidden Markov Model (HMM)
HMM 是一个统计模型,广泛用于具有连续性和可扩展性的数据,如时间序列股票市场分析、健康检查和语音识别。本节详细介绍了使用隐马尔可夫模型 (HMM) 分析顺序数据。
Example: Analysis of Stock Market data
在此示例中,我们将逐步分析股票市场的数据,了解 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()