分析時間序列資料


預測給定輸入序列中的下一個是機器學習中的另一個重要概念。 本章為您提供有關分析時間序列資料的詳細說明。

時間序列資料介紹

時間序列資料表示處於一系列特定時間間隔的資料。 如果我們想在機器學習中構建序列預測,那麼必須處理連續的資料和時間。 系列資料是連續資料的摘要。 資料排序是順序資料的一個重要特徵。

序列分析或時間序列分析的基本概念

序列分析或時間序列分析是基於先前觀察到的預測給定輸入序列中的下一個。 預測可以是任何可能接下來的事情:符號,數位,次日天氣,下一個演講等。序列分析在諸如股票市場分析,天氣預報和產品推薦等應用中非常有用。

範例

考慮下面的例子來理解序列預測。 這裡A,B,C,D是給定值,並且必須使用序列預測模型預測值E。

安裝有用的包

對於使用Python進行時間序列資料分析,我們需要安裝以下軟體包 -

Pandas

Pandas是一個開源的BSD許可庫,它為Python提供了高效能,簡便的資料結構使用和資料分析工具。

有關Pandas教學,請存取以下網址:/9/103/3096.html

使用以下命令安裝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