python3機器學習經典實例-第八章解剖時間序列和時序數據29
來自專欄 python機器學習經典實踐-學習筆記
簡介
時間序列數據就是隨著時間的變化收集的測量序列數據。這些數據是根據預定義的變數並在固定的間隔時間採集的。時間序列數據最主要的特徵就是其順序是非常關鍵的。我們收集的數據是按照時間軸排序的,它們的出現順序包含很多隱藏的模式和信息。如果改變順序,則將徹底改變數據的含義。序列數據的廣義概念是指任意序列形式的數據,包括時間序列數據。我們的目標是構建一個模型,該模型描述了時間序列或任意序列的模式,用於描述時間序列模式的重要特徵。可以用這些模型解釋過去可能會影響到未來,查看兩個數據集是如何相互關聯的,如何預測未來可能的值,或者如何控制基於某個度量標準的給定變數。為了將時間序列數據可視化,我們傾向於將其用折線圖或柱狀圖畫出。時間序列數據分析常用於金融、信號處理、天氣預測、軌道預測、地震預測或者任意需要處理時間數據的場合。我們在時間序列和順序數據分析中構建的模型應該考慮數據的順序,並提取相互之間的關係。接下來分析Python中的時間序列和順序數據。
將數據轉換為時間序列格式
下面以理解如何將一系列觀察結果轉換為時間序列數據並將其可視化作為本章的開始。本例將用到pandas庫來分析時間序列數據。在進行接下來的學習之前,請確保已經安裝好了pandas庫,安裝方法可以參考http://pandas.pydata.org/pandas-docs/stable/install.htm。
- 創建convert_to_timeseries.py文件,載入必要的資料庫。
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
- 定義一個函數來讀取輸入文件,該文件將序列觀察結果轉換為時間序列數據:
def convert_data_to_timeseries(input_file, column, verbose=True): # Load the input file data = np.loadtxt(input_file, delimiter=,)
這裡將用到一個包含4列的文本文件,其中第一列表示年,第二列表示月,第三列和第四列表示數據。將文件載入到NumPy數組。
- 因為數據是按時間的前後順序排列的,數據的第一行是起始日期,而數據的最後一行是終止日期。下面提取出數據集的起始日期和終止日期:
# Extract the start and end dates start_date = str(int(data[0,0])) + - + str(int(data[0,1])) end_date = str(int(data[-1,0] + 1)) + - + str(int(data[-1,1] % 12 + 1))
- 這個函數還有一個詳細的版本。因此,當這個值為真時,就列印一些信息。列印出起始日期和終止日期:
if verbose: print ("
Start date =", start_date) print ("End date =", end_date)
- 創建一個pandas變數,該變數包含了以月為間隔的日期序列;下一步是將給定的列轉換為時間序列數據。可以用年和月訪問這些數據(而不是索引):
# Create a date sequence with monthly intervals dates = pd.date_range(start_date, end_date, freq=M) # Convert the data into time series data data_timeseries = pd.Series(data[:,column], index=dates)
- 列印出最開始的10個元素:返回時間索引變數:
if verbose: print ("
Time series data:
", data_timeseries[:10]) return data_timeseries
- 定義main函數:本例將使用本書提供的data_timeseries.txt文件:載入文本文件的第三列,並將其轉換為時間序列數據:pandas庫提供了非常實用的畫圖功能,你可以直接在變數上運行:
if __name__==__main__: # Input file containing data input_file = data_timeseries.txt # Load input data column_num = 2 data_timeseries = convert_data_to_timeseries(input_file, column_num) # Plot the time series data data_timeseries.plot() plt.title(Input data) plt.show()
結果顯示out
Start date = 1940-1End date = 2016-1Time series data: 1940-01-31 98.961940-02-29 10.891940-03-31 6.221940-04-30 67.851940-05-31 31.701940-06-30 15.631940-07-31 76.171940-08-31 81.101940-09-30 87.241940-10-31 37.49Freq: M, dtype: float64
推薦閱讀:
※提升方法(AdaBoost)
※Deep Metric Learning via Lifted Structured Feature Embedding(CVPR,2016)
※【求援】需要你的參與
※精準營銷:剖析廣告點擊率預估系統
※Google自動編程框架AutoML入門指南