2016年8月8日 星期一

[機器學習練習] [Machine Learning Practice] 用 Scikit 預測河川水位資料(二)

這一篇教學中,會開始使用Python,下載網頁在這

如果你用的是 Mac ,直接在終端機打入 brew install python,就可以安裝了。

Windows 用戶呢,點進網頁,下載安裝檔並安裝就可以在 IDE coding了。
(建議大家選用 Python 3,因為我偶像推薦 3。)



除此之外,建議大家再安裝Sublime,很好用的coding tool :)

下載網址

最後,在 coding 時,常需要匯入不同的 module ,建議大家使用 pip 來管理這些 module。

安裝方法在這

好,正文開始。


------------------------------------------------------------------------------------------------------------

Step 4 : 整理資料 - 下

首先,我們先在創立一個文字檔並命名為 DBriver.py

在檔案中,先匯入我們會使用到的 module 如下圖。


import pandas as pd  #取資料和匯入DataFrame格式
import matplotlib.pyplot as plt #資料視覺化
from matplotlib import style
style.use('fivethirtyeight')
import numpy as np #處理array
from datetime import timedelta, datetime #處理時間軸
from sklearn import preprocessing, cross_validation, svm #主角
from sklearn.linear_model import LinearRegression #主角


接下來,我們把剛剛下載的 excel 檔案和這個 python 檔案放在同一個資料夾中,

並使用 pandas 來取得 excel 中的資料。


df1 = pd.read_excel('C waterlevel.xlsx')
df2 = pd.read_excel('W waterlevel.xlsx')
df3 = pd.read_excel('CT rainfall.xlsx')
df4 = pd.read_excel('DS rainfall.xlsx')

# 這邊是為了幫原本沒有 column label 的資料加上 label,等一下才好處理資料。
columns_name = ['time','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24']

df1.columns= columns_name
df2.columns= columns_name
df3.columns= columns_name
df4.columns= columns_name


好,如上一章節中提到的問題,我們的資料格式,縱軸是日期橫軸是逐時資料。

但我們希望是縱軸是每日逐時資料而橫軸是各個水位站和雨量站

單個站點資料如下:







(後面還有到24小時,但我沒有擷取)

而我們希望整合各個水位站和雨量站資料成這樣:











所以我們用個for loop去把資料一個一個取出來並且匯入到新的dictionary。


data = {'time':[], 'crc':[], 'wll':[], 'ctrf':[], 'dasrf':[]}

starttime = datetime(2014, 1, 1, 0, 0, 0) #設定資料起始時間
interval = timedelta(hours=1) #設定縱軸間隔

for i in range(len(df1.index)):
    for item in df1:
        if item == 'time':
            pass
        else:
            data['time'].append(starttime)
            data['crc'].append(df1[item][i])
            data['wll'].append(df2[item][i])
            data['ctrf'].append(df3[item][i])
            data['dasrf'].append(df4[item][i])
            starttime += interval

df = pd.DataFrame(data) #把dict匯入dataframe裡面
df.set_index('time', inplace=True)
df[df < 0] = 0
df.fillna(0, inplace=True)

print (df.head(10))  #印出前十列資料

好!到這邊算是把資料處理好,並成為我們可以用的資料了!



在終端機目標資料夾中輸入

    python DBriver.py

應該會出現錯誤訊息 哈哈哈哈哈



還有兩件事情要做!

1. 安裝我們有匯入的 module

    pip install -U scikit-learn

    pip install matplotlib

    pip install pandas

其他類推,他會告訴你該怎麼取名。

2. 如果你是用複製貼上code,要記得把 # 註解後面的中文字刪掉,不然會不能編碼

都做完之後,在終端機中輸入

    python DBriver.py

應該就可以成功跑出我們抓到的資料了!!






現在試試看把資料視覺化,看看資料長相。

在程式中,再加入以下:

ax1 = plt.subplot2grid((3,1),(0,0))
ax2 = plt.subplot2grid((3,1),(1,0), sharex=ax1)
ax3 = plt.subplot2grid((3,1),(2,0), sharex=ax1)

df[['crc','wll']].plot(ax= ax1, linewidth = 1, color=['r','b'])
df['ctrf'].plot(ax= ax2, label="rf1", linewidth = 1, color='g')
df['dasrf'].plot(ax= ax3, label="rf2", linewidth = 1)

ax1.set_ylabel('Waterlevel')
ax2.set_ylabel('CT rainfall')
ax3.set_ylabel('DAS rainfall')
plt.show()


在終端機目標資料夾中輸入

    python DBriver.py

matplotlib 會給你下面這張圖:



藉由觀察這樣圖像化的資料,可以更幫助我們了解,到底該怎麼取features,

以及很多很多的好處,比如像是:

1. 因為 C 站的堤防高度是 5.1m,而 W 站的堤防高度是 6.1m,所以我們知道研究 C 站毫無意義,因為根本不會有溢堤的現象。

2. C 站因為靠近海邊,所以算是感潮河段。因此水位高度因為潮汐的關係,每日有兩個波峰。又因為滿月和新月時引力最大,造成每月也有兩次波峰,所以水位呈現sincos的合成波,如下圖:











3. 兩個雨量站的趨勢非常相近,相關係數有 0.81,所以大雨時段雨量均勻假設算可以接受。

------------------------------------------------------------------------------------------------------------

Step 5 : 決定 features

在決定features方面,文獻中有提及每個河段匯聚雨量的面積大小不一樣,

地形結構也不一樣,所以對於水位對於雨量反應的延遲時間也不一樣。

但我們就知道延遲時間是一個參數。

現在我們想知道,到底幾小時前下的雨,對我現在的水位高度影響最大,

所以,要再想一想。


------------------------------------------------------------------------------------------------------------

Reference

[1] " Forecasting Time Series Water Levels on Mekong River Using Machine Learning Models ", 10.1109/KSE.2015.53

[2] '' Application of Support Vector Machine in Lake Water Level Prediction " , http://ascelibrary.org/doi/abs/10.1061/(ASCE)1084-0699(2006)11%3A3(199)

[3] " Integrating Support Vector Regression and a geomorphologic Artificial Neural Network for daily rainfall-runoff modelling", http://www.sciencedirect.com/science/article/pii/S1568494615006304

[4] Scikit-Learn, http://machine-learning-python.kspax.io

[5] Scikit-Learn, http://scikit-learn.org/stable/

[6] 水文資訊網, http://gweb.wra.gov.tw/hyis/index.aspx

[7] 水利署防災資訊服務網, http://fhy.wra.gov.tw/fhy/

[8] 典寶溪排水治理計畫 - 經濟部水利署



下一集:

[機器學習練習] [Machine Learning Practice] 用 Scikit 預測河川水位資料(三)

沒有留言:

張貼留言