Cara menggunakan calendar.day_name python 3

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 pandas as pd 
import datetime
import numpy as np
dti = pd.to_datetime(['1/1/2018', \
np.datetime64('2018-01-01'), \
datetime.datetime(2018, 1, 1)])
dti
Pandas 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,
dti = pd.date_range('2018-01-01', periods=3, freq='H')dti
generate tanggal berurutan dengan frekuensi tetap
  • Set local datetime dan konversi timezone,
dti = dti.tz_localize('UTC')dti

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')idx
generate date_range , freq= ‘H’, periods = 5

Buat pandas Series, dengan index idx (datetime index)

ts = pd.Series(range(len(idx)), index=idx)ts
generate Series dengan index idx

Resampling time series data dengan frekuensi 2H (2 jam) setelah itu dicari rata-rata datanya,

ts.resample('2H').mean()
hasil resampling 2H

pandas dengan mudah dapat melakukan resampling time series data dan melakukan kalkulasi statistik mean() untuk tiap item resampling.

  • Kemampuan untuk operasi aritmetik date & time,
friday = pd.Timestamp('2018-01-05')friday.day_name()

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(),

monday = friday + pd.offsets.BDay()monday.day_name()
aritmetic operation pada data time series

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 Notebook

Selanjutnya membuat file notebook baru, dengan menekan dropdown New dilanjutkan dengan memilih python3

membuat file notebook baru

Sehingga pada page home jupyter terbentuk file notebook yang barusan dika create,

File notebook yang berhasil dicreate

Pada file notebook yang sudah dibuat, kita terlebih dahulu import library yang dibutuhkan,

import pandas as pd 
import 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 CO

selanjutnya kita periksa data type tiap kolom pada data frame dengan fungsi .info(),

CO_TS.info()
datatype untuk tiap kolom pada data frame time series CO

Terlihat 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 Time

Selanjutnya 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 == 10

Kita juga dapat langsung memanggil data dengan datetime secara parsial,

CO_TS["2020-02-15 12:40"]
mengakses data frame dengan datetime parsial

Atau 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 waktu

Sekarang 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 permenit

Resample option yang dapat digunakan,

B         business day frequency
C 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 CO

Bisa 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 CO

bisa 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 plots

untuk 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 :

  1. https://jakevdp.github.io/PythonDataScienceHandbook/03.11-working-with-time-series.html
  2. https://pandas.pydata.org/docs/user_guide/timeseries.html
  3. https://pandas.pydata.org/docs/user_guide/timeseries.html
  4. https://towardsdatascience.com/basic-time-series-manipulation-with-pandas-4432afee64ea
  5. https://stackoverflow.com/questions/17001389/pandas-resample-documentation
  6. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
  7. https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html