Time Series Analysis & Data Visualization
Source [link]Hai, semuanya. Kembali kita lanjutkan bahasan sebelumnya tentan Python Data Science menggunakan Pandas. Jika kalian belum baca tulisan sebelumnya, bisa diakses link berikut ini,
Nah sekarag kita akan mencoba untuk memanfaatkan fitur time series & visualisasi data pada Pandas. Pandas memiliki banyak fitur manipulasi dan analisis data time series yang mampu mengelola data Time, Date sampai Datetime[1]. Pandas menggabungkan banyak library time series mulai dari formating date time Numpy datetime64 and timedelta64 dtypes sampai ke fitur time series scikits.timeseries [2].
Time, Date dan Datetime Pandas
Beberapa perintah operasi datetime yang di support oleh Pandas:
- Parsing data time series dari berbagai sumber dan format
import datetime
import numpy as npdti = pd.to_datetime(['1/1/2018', \
np.datetime64('2018-01-01'), \
datetime.datetime(2018, 1, 1)])dtiPandas dapat memproses data datetime dariberbagai sumber dan format
Terlihat bahwa pandas mampu menerima beragam format datetime, mulai dari format string, numpy datetime64() mapun dari library datetime.
- Generate tanggal berurutan dengan frekuensi tetap,
- Set local datetime dan konversi timezone,
konvert ke timezone Indonesia,
dti.tz_convert('Asia/Jakarta')assign localize dan convert timezone- Resampling / convert time series kefrekuesi tertentu,
generate date_range dengan frekuensi hour H sebanyak 5 period
idx = pd.date_range('2018-01-01', periods=5, freq='H')idxgenerate date_range , freq= ‘H’, periods = 5Buat pandas Series, dengan index idx (datetime index)
ts = pd.Series(range(len(idx)), index=idx)tsgenerate Series dengan index idxResampling time series data dengan frekuensi 2H (2 jam) setelah itu dicari rata-rata datanya,
ts.resample('2H').mean()hasil resampling 2Hpandas dengan mudah dapat melakukan resampling time series data dan melakukan kalkulasi statistik mean() untuk tiap item resampling.
- Kemampuan untuk operasi aritmetik date & time,
setelah itu kita tambah 1 hari dengan menggunakan function Timedelta(),
saturday = friday + pd.Timedelta('1 day')saturday.day_name()menambahkan 1 hari bussines day dengan menggunakan function offsets.BDay(),
Time Series Analysis
Selanjutnya kita akan masuk ke analisa data time series menggunakan Pandas, terlebih dahulu kita download data time series dari sensor karbon monoksida (CO) disini.
Setelah itu simpan ke folder dengan nama Pandas_Timeseries, setelah itu akses folder dari Jupyter Notebook, sehingga tampak seperti berikut,
folder Pandas_Timeseries diakses menggunakan Jupyter NotebookSelanjutnya membuat file notebook baru, dengan menekan dropdown New dilanjutkan dengan memilih python3
membuat file notebook baruSehingga pada page home jupyter terbentuk file notebook yang barusan dika create,
File notebook yang berhasil dicreatePada file notebook yang sudah dibuat, kita terlebih dahulu import library yang dibutuhkan,
import pandas as pdimport numpy as np
setelah itu kita baca csv data time series CO yang sudah kita download sebelumnya,
CO_TS = pd.read_csv("CO_Sample_TimeSeries.csv", sep=";")CO_TS.head()penggunaan parameter sep=";" diperlukan agar Pandas mampu membaca csv diatas dengan separator ; ,
Data time series CO dengan separator `;`Data Frame dari file CSV Time Series COselanjutnya kita periksa data type tiap kolom pada data frame dengan fungsi .info(),
CO_TS.info()datatype untuk tiap kolom pada data frame time series COTerlihat pada kolom Date dan Time memiliki tipe data object , selanjutnya kita akan membuat kolom baru dengan nama Datetime untuk menggabungkan kolom Date dan Time menjadi satu kesatuan.
CO_TS["DateTime"] = pd.to_datetime(CO_TS.Date + " " + CO_TS.Time)CO_TS.head()Membuat kolom `Datetime`Selanjutnya kita hilangkan kolom Date dan Time dengan menggunakan fungsi .drop() , parameter inplace=True digunakan untuk reassign data frame terhadap dirinya sendiri,
CO_TS.drop(["Date", "Time"], axis=1, inplace=True)CO_TS.head()Data frame tanpa kolom Date dan TimeSelanjutnya kita akan assign kolom Datetime menjadi index data frame dengan memanfaatkan fungsi .index() dilanjutkan dengan drop kolom Datetime,
CO_TS.index = pd.to_datetime(CO_TS.DateTime)CO_TS.drop(["DateTime"], axis=1, inplace=True)CO_TS.head()Data frame dengan index Datetime
dengan fungsi lain seperti set_index() , kita dapat menjadikan kolom pada data frame menjadi index tanpa harus dilanjutkan dengan drop kolom seperti diatas.
Karena index data frame sudah dalam tipe data datetime, maka kita dapat melakukan operasi datetime terhadap index,
misalnya kita ingin melihat data pada data frame untuk tiap detik ke-10,
CO_TS[CO_TS.index.second == 10]Data frame dengan index.second == 10Kita juga dapat langsung memanggil data dengan datetime secara parsial,
CO_TS["2020-02-15 12:40"]mengakses data frame dengan datetime parsialAtau bahkan mengambil data pada rentang waktu tertentu,
CO_TS["2020-02-15 12:40:00" : "2020-02-15 12:40:10"]mengakses data frame dengan menggunakan rentang waktuSekarang kita akan melakukan resample data pada data time series CO CO_TS dan menghitung rata-rata kadar CO dalam satuan (ug/m3),
CO_TS.resample('T').mean() Resample time series permenitResample option yang dapat digunakan,
B business day frequencyC custom business day frequency (experimental)
D calendar day frequency
W weekly frequency
M month end frequency
SM semi-month end frequency (15th and end of month)
BM business month end frequency
CBM custom business month end frequency
MS month start frequency
SMS semi-month start frequency (1st and 15th)
BMS business month start frequency
CBMS custom business month start frequency
Q quarter end frequency
BQ business quarter endfrequency
QS quarter start frequency
BQS business quarter start frequency
A year end frequency
BA, BY business year end frequency
AS, YS year start frequency
BAS, BYS business year start frequency
BH business hour frequency
H hourly frequency
T, min minutely frequency
S secondly frequency
L, ms milliseconds
U, us microseconds
N nanoseconds
Rolling Sum & Rolling Mean
Dalam Statistik kita dapat menganalisa running average tertentu untuk mengevaluasi trend data yang sangat berguna untuk smoothing data fluktuatif untuk rentang yang sempit, data dikelompokan pada sejumlah subset yang merupakan hasil rataan, sehingga didapatkan data yang smooth dan dapat dengan mudah melihat trend data.
Pandas memiliki feature rolling_mean dan rolling_sum yang dapat digunakan untuk analisis data time series sehingga menghasilkan data yang smooth terutama untuk data fluktuatif untuk rentang yang sempit.
Sekarang kita buat kolom baru dengan nama rolling_mean yang merupakan hasil kalkulasi rolling mean untuk kadar CO (ug/m3),
CO_TS['rolling_mean'] = CO_TS.rolling(5).mean()CO_TS[["ug/m3", "rolling_mean"]]rolling mean untuk data time series COBisa dilihat bahwa hasil rolling_mean merupakan rata-rata dari kolom kadar CO ug/m3 untuk tiap 5 period data, 4 baris data pertama bernilai NaN karena hasil rolling number akan terlihat untuk tiap 5 data.
Forward atau Backfilling ketika berhadapan dengan missing value
Pandas menyediakan function .fillna() yang dapat digunakan untuk keperluan seperti backfilling missing data dengan menambahkan parameter method=’backfill’ . Method yang dapat disupport ‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None, default None .
CO_TS["rolling_mean_backfilled"] = CO_TS["rolling_mean"].fillna(method='backfill')CO_TS[["ug/m3", "rolling_mean", "rolling_mean_backfilled"]]backfilling rolling_mean pada time series CObisa dilihat kita melakukan backfilling untuk data rolling_mean.
namun ada baiknya kita mengevaluasi teknik yang kita pergunakan, misalnya penggunaan backfilling untuk missing value pada data. Hal ini dapat mempengaruhi orisinalitas data dan bisa saja menghasilkan hasil analisi dan interpretasi yang berbeda.
Time Series Visualization
Pandas menyediakan tool untuk visualisasi data dengan sangat mudah, terutama untuk data time series,
misalnya kita ingin melakukan plotting data kadar CO terhadap waktu,
CO_TS[['ug/m3']].plot()plot time series kadar CO (ug/m3)Selanjutnya kita akan melakukan multiple plot untuk kolom ug/m3 dan kolom rolling_mean , sebelumnya kita atur ulang rolling periode nya menjadi per 20 detik, setelah itu kita plot kedua kolom,
CO_TS['rolling_mean'] = CO_TS.rolling(20).mean()CO_TS[["rolling_mean", 'ug/m3']].plot()multiple plot untuk kolom `ug/m3` dan `rolling_mean`Secara default pandas .plot() melakukan plotting dengan jenis line plot, jenis plot lainya sebagai berikut,
‘bar’ or ‘barh’ for bar plots‘hist’ for histogram‘box’ for boxplot‘kde’ or ‘density’ for density plots‘area’ for area plots‘scatter’ for scatter plots‘hexbin’ for hexagonal bin plots‘pie’ for pie plotsuntuk melakukan plotting data dengan jenis lain, dapat dilakukan dengan cara berikut,
CO_TS[["rolling_mean", 'ug/m3']].plot(kind='bar')bar plot time series kadar CO (ug/m3)parameter kind="" digunakan untuk mengatur jenis visualisasi yang ingin digunakan.
Sekian untuk bahasan kali ini, semoga bermanfaat.
Selajutnya akan dibahas Joining dan Merging Data Frame menggunakan Pandas.
Terima Kasih.
Sumber :
- //jakevdp.github.io/PythonDataScienceHandbook/03.11-working-with-time-series.html
- //pandas.pydata.org/docs/user_guide/timeseries.html
- //pandas.pydata.org/docs/user_guide/timeseries.html
- //towardsdatascience.com/basic-time-series-manipulation-with-pandas-4432afee64ea
- //stackoverflow.com/questions/17001389/pandas-resample-documentation
- //pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
- //pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html