【火爐煉AI】機器學習043-pandas操作時間序列資料
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
時間序列資料分析是機器學習領域中的一個重要領域,時間序列資料是隨著時間變化而不斷變化的資料,最典型的一個例子就是股價資料,隨著日期的不同而不同,還有一年四季的溫度變化,颱風執行軌跡等等領域。這個領域的一個重要點是收集到的樣本資料在時間是相關的,我們不能像以前那樣打亂樣本資料之間的順序,故而這各領域需要特別的研究方式。
1. 準備時間序列資料
本章用到的時間序列資料來源於檔案data_timeseries.txt,這個檔案中第一列是年份,從1940到2015,第二列是月份,第三列和第四列是資料。
1.1 資料轉換為時間序列格式
我們可以將第一列和第二列合併,然後在用一個函式將合併後的字串轉換為Date型別,但是此處的資料很有規律性,時間上沒有遺漏,故而我們可以藉助pandas的date_range()函式來構建時間序列,並將該時間序列作為DataFrame資料集的index
第一步:用pandas載入資料集
# 載入資料集 data_path='E:\PyProjects\DataSet\FireAI/data_timeseries.txt' df=pd.read_csv(data_path,header=None) print(df.info()) # 檢視資料資訊,確保沒有錯誤 print(df.head()) print(df.tail()) 複製程式碼
第二步:用pd.date_range()建立時間序列資料
start=str(df.iloc[0,0])+'-'+str(df.iloc[0,1]) # 1940-1 if df.iloc[-1,1] %12 ==0: # 如果是12月結尾,需要轉為第二年1月 end=str(int(df.iloc[-1,0])+1)+'-01' else: end=str(df.iloc[-1,0])+'-'+str(int(df.iloc[-1,1])+1) print(end) dates=pd.date_range(start,end,freq='M') # 構建以月為間隔的日期資料 print(dates[0]) print(dates[-1]) # 最後一個是2015-12 沒有錯誤 print(len(dates)) 複製程式碼
注意上面有一個判斷最後一個月是否是12月,因為date_range在freq為月的時候得到的結果不包含end所在的月份,故而此處我們要加上一個月份,使得最終日期的個數相同。
-------------------------------------輸---------出--------------------------------
2016-01 1940-01-31 00:00:00 2015-12-31 00:00:00 912
--------------------------------------------完-------------------------------------
第三步:將時間序列資料設定為df的index
df.set_axis(dates) print(df.info()) print(df.head()) 複製程式碼
從結果中可以看出,上面得到的dates日期資料已經變成了df這個資料集的index.
1.2 時間序列資料的繪圖
pandas內部本來就集成了matplotlib這個函式的多種畫圖功能,故而我們可以直接畫圖,比如對所有的第二列資料畫圖,程式碼為:
# 畫圖 df.iloc[:,2].plot() # 畫出第2列的時序資料 複製程式碼

上面圖中資料量太大,導致密密麻麻看不清楚,故而我們需要只繪製一部分圖來看清楚某一個時間段內的資料走勢,可以用下列方法:
# 上面的圖中資料太密集了,我們需要檢視部分時間段的資料 start='2008-2' end='2010-3' df.iloc[:,2][start:end].plot() # 注意這種寫法,先獲取第二列資料為Series,然後對Series進行時間範圍切片即可 複製程式碼

也可以選擇某幾年的資料來繪圖
start='2008' # 給定年份來獲取資料 end='2010' df.iloc[:,2][start:end].plot() 複製程式碼

上面每次只繪製一列資料,其實可以同時繪製多列資料,如下:
# 上面每次只繪製一列資料,下面同時繪製兩列資料 start='2008' # 給定年份來獲取資料 end='2010' df.iloc[:,2:4][start:end].plot()# 同時繪製第二列和第三列的資料 複製程式碼

還可以繪製這兩列資料之間的差,或和,或min,max等如下:
# 也可以繪製兩列資料的差異 start='2008' # 給定年份來獲取資料 end='2010' temp_df=df.iloc[:,2][start:end]-df.iloc[:,3][start:end] temp_df.plot() 複製程式碼

還可以繪製出某一列大於某值且另一列小於某值的一部分資料。
# 還可以篩選出第一個大於某個值,同時第二列小於某個值的資料來繪圖 temp_df2=df[df.iloc[:,2]>60][df.iloc[:,3]<20].iloc[:,2:4] temp_df2.plot() 複製程式碼

1.3 獲取統計資料
1.3.1 獲取Max,Min,Mean等
# 獲取資料集的統計資料 part_df=df.iloc[:,2:4] # 只取第二和第三列進行統計 print('Max: \n{}'.format(part_df.max())) print('Min: \n{}'.format(part_df.min())) print('Mean: \n{}'.format(part_df.mean())) # 上面這個方法雖然可以獲取Max,Min,Mean值,但是還不如下面這個函式好用 print(part_df.describe()) # 這個可以從整體上看出資料的分佈情況 複製程式碼
上面幾個函式很簡單,就不貼列印結果了。
1.3.2 計算移動平均值
移動平均值的意義主要是消除噪聲,使得訊號看起來更加的平滑,計算方法就是計算前面N個數據的平均值,然後在移動一位,始終計算最近N個數據的平均值。如果你會炒股,那麼對移動平均線的意義和計算方法應該會了然於胸。
# 計算移動平均值MAn N=20 MAn=part_df.rolling(N).mean() MAn.plot() 複製程式碼

1.3.3 計算移動平均值的相關係數
移動平均值的相關係數可以理解為:兩列資料的相關性,如果相關性很強,那麼這兩列資料具有很強的關聯,用股票資料來說明的話,移動平均值的相關性就是這兩隻股票的股價走勢相關性,如果相關性很強,那麼這兩隻股票會表現出同步的“同漲共跌”的走勢,如果相關性很小,說明兩個股票的價格走勢沒有太大關係。
# 計算移動平均值MAn的相關係數 N=20 MAn=part_df.rolling(N).mean() corr=MAn.iloc[:,0].rolling(window=40).corr(MAn.iloc[:,1]) corr.plot() 複製程式碼

########################小**********結###############################
1,這部分很多都是Pandas模組的基本方法,所以也沒有太多要講解的內容。
#################################################################
注:本部分程式碼已經全部上傳到( ofollow,noindex"> 我的github )上,歡迎下載。
參考資料:
1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯