分析時間序列數據
預測給定輸入序列中的下一個是機器學習中的另一個重要概念。 本章爲您提供有關分析時間序列數據的詳細說明。
時間序列數據介紹
時間序列數據表示處於一系列特定時間間隔的數據。 如果我們想在機器學習中構建序列預測,那麼必須處理連續的數據和時間。 系列數據是連續數據的摘要。 數據排序是順序數據的一個重要特徵。
序列分析或時間序列分析的基本概念
序列分析或時間序列分析是基於先前觀察到的預測給定輸入序列中的下一個。 預測可以是任何可能接下來的事情:符號,數字,次日天氣,下一個演講等。序列分析在諸如股票市場分析,天氣預報和產品推薦等應用中非常有用。
實例
考慮下面的例子來理解序列預測。 這裏A,B,C,D是給定值,並且必須使用序列預測模型預測值E。
安裝有用的包
對於使用Python進行時間序列數據分析,我們需要安裝以下軟件包 -
Pandas
Pandas是一個開源的BSD許可庫,它爲Python提供了高性能,簡便的數據結構使用和數據分析工具。
有關Pandas教程,請訪問以下網址:https://www.yiibai.com/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