top of page
Search
Learn with Shin

時間序列資料 - Time Series

Updated: Nov 19, 2021



今天要跟大家簡單看一下如何利用Python處理跟時間有關的資料。


Time Series(時間序列)是一種資料的類型。簡單來說資料由一定的時間間隔方式呈現,譬如說每月的銷售金額、每天的股票價格、或是每個禮拜的網路造訪者流量,都屬於Time Series的資料。


遇到Time Series資料,當然必須要知道如何跟日期時間打交道(參考之前我們有寫過一篇如何處理Python的日期時間的文章)。


OK,下面我們用一個簡單的資料例:黃金的歷史價格(資料源:kaggle)。



一般而言處理Time Series資料的第一步,就是將日期時間的欄轉換成index。這是跟一般資料比較不一樣的地方,也是容易大家剛開始不習慣的部分。


利用pandas的read_csv,可以直接在資料讀進來的同時,將指定的日期欄設定為index(index_col=欄位名),並將string的日期轉換成日期時間的物件(parse_dates=True):



可以看到index的部份現在是pandas的DatetimeIndex。



重點是,為什麼要將日期時間的欄位當成index呢?


因為它可以帶來不少好處!下面來看一些常用的作法吧。


搜尋日期


將日期變成index之後,就可以讓我們利用日期來做搜尋!例如我想要看某一天的資料的話(注意我們需要用.loc來指定):


甚至可以像下面這樣直接指定一段日期區間:


相當合理對不對,將日期變成index就類似dictionary中的key,讓我們能夠快速的找到想要的資料。所以如果我們在意時間所呈現的變化,記得要將它轉成index喔☝️



重組間隔(Resampling)


我們還可以輕鬆將日期重組成固定間隔,譬如說weekly, monthly, yearly, 或是任何指定的天數間隔,只要再配上一個你要的集合函數(像是mean, median, max, min, sum...)。下面的例子是用月間的方式呈現每月(rule="M")的平均數:


每三天的平均數:


關於更多指定日期的寫法可參考官方文件



滾動式間隔(Rolling Window)


有時候,我們會想減低極端值帶來的激烈變動(spike),目的是可以更清楚的看到趨勢走向。這時可能會利用到像Moving Average這樣的滾動計算。我們可以利用DataFrame的.rolling來做到這一點。


下面來做個比較,把2000年後的資料抽出來,在不做任何加工的情況下把圖形畫出來,看起來會像這樣👇。可以看到有許多小小的上下波動。



當rolling window設定為100的時候,曲線則變的較平緩。


如果設定為500的話,曲線又變的更加平滑,一些原本的刺刺都被磨掉了。幫助我們更清楚的看到大方向的走勢📈。



填補空缺的日期時間


話說,我們看到這個黃金價格的資料並不是所有的天數都有。資料本身有或多或少的缺陷,在實作中其實是相當正常的。




因此有時候,我們會想要盡量去補足這些資料。我們可以利用DataFrame的asfreq試著去把它補齊:


  • pd.offsets.Day()會以天為單位補上缺口的日期,如果想用工作日的話可以使用pd.offsets.BDay()。

  • method="pad" 會利用過去最近的資料(last known value)去填補,詳細可參考這裡


結論


今天很快的介紹了Time Series資料以及常看到的一些作法:

  • 何謂Time Series

  • 利用時間日期來搜尋

  • 重組時間間隔 (Resampling)

  • 滾動式間隔 (Rolling Windows)

  • 填補時間空缺 (Missing Dates)

利用pandas這些技巧可以幫助我們快速的了解資料,以及做一些必要的處理,尤其如果今天我們要做簡報呈現這些資料給老闆看,這是相當實用的工具。


當然,在Time Series的分析,往往目的是為了做出預測未來的數值,畢竟過去的已經過去了👴。能夠預測未來數值可以幫助我們、特別是公司在做決策時的重要根據。而實作上,會使用一些統計的模型來幫助我們做出預測,較有名的像是ARIMA。避免篇幅過長,下次有機會再討論吧。


以上,希望對你有幫助喔~😀





Comments


Post: Blog2_Post
bottom of page