Halo Pythonista.. Dalam mengolah data terkadang kita memiliki data yang berupa time series. Dalam pengolahan data time series ini kita bisa menggunakan beberapa operasi seperti selection, wrangling dan agregation. Sebelum kita menggunakan Pandas, akan membantu pemahaman jika kita mengenal Python datetime. Modul datetime menyediakan 3 tipe data: date, time dan datetime. Tipe data date, berisi tanggal, bulan dan tahun. Tipe data time, berisi jam, menit dan detik. Sedangkan tipe datetime berise kedua date dan time. Di sisi lain, Pandas memiliki objek Timestamp yang mewakili date dan time. Pertama, kita akan coba eksplorasi date time di Python lalu kemudian ke Pandas.
>>> import datetime >>> date = datetime.date(year=2013, month=6, day=7) >>> time = datetime.time(hour=12, minute=30, second=19, microsecond=463198) >>> dt = datetime.datetime(year=2013, month=6, day=7, hour=12, minute=30, second=19, microsecond=463198) >>> print(“date is “, date) >>> print(“time is”, time) >>> print(“datetime is”, dt) date is 2013-06-07 time is 12:30:19.463198 datetime is 2013-06-07 12:30:19.463198
>>> td = datetime.timedelta(weeks=2, days=5, hours=10, minutes=20, seconds=6.73, milliseconds=99, microseconds=8) >>> print(td) 19 days, 10:20:06.829008
>>> print(‘new date is’, date + td) >>> print(‘new datetime is’, dt + td) new date is 2013-06-26 new datetime is 2013-06-26 22:50:26.292206
>>> time + td TypeError: unsupported operand type(s) for +: ‘datetime.time’ and ‘datetime.timedelta’
>>> pd.Timestamp(year=2012, month=12, day=21, hour=5, minute=10, second=8, microsecond=99) Timestamp(‘2012-12-21 05:10:08.000099’) >>> pd.Timestamp(‘2016/1/10’) Timestamp(‘2016-01-10 00:00:00’) >>> pd.Timestamp(‘2014-5/10’) Timestamp(‘2014-05-10 00:00:00’) >>> pd.Timestamp(‘Jan 3, 2019 20:45.56’) Timestamp(‘2019-01-03 20:45:33’) >>> pd.Timestamp(‘2016-01-05T05:34:43.123456789’) Timestamp(‘2016-01-05 05:34:43.123456789’) It’s also possible to pass in a single integer or float to the Timestamp constructor
>>> pd.Timestamp(500) Timestamp(‘1970-01-01 00:00:00.000000500′) >>> pd.Timestamp(5000, unit=’D’) Timestamp(‘1983-09-10 00:00:00’) Pandas provides the to_datetime function that works fairly similarly to the
>>> pd.to_datetime(‘2015-5-13’) Timestamp(‘2015-05-13 00:00:00’) >>> pd.to_datetime(‘2015-13-5’, dayfirst=True) Timestamp(‘2015-05-13 00:00:00’) >>> pd.to_datetime(‘Start Date: Sep 30, 2017 Start Time: 1:30 pm’, format=’Start Date: %b %d, %Y Start Time: %I:%M %p’) Timestamp(‘2017-09-30 13:30:00′) >>> pd.to_datetime(100, unit=’D’, origin=’2013-1-1′) Timestamp(‘2013-04-11 00:00:00’)
>>> s = pd.Series([10, 100, 1000, 10000]) >>> pd.to_datetime(s, unit=’D’) 0 1970-01-11 1 1970-04-11 2 1972-09-27 3 1997-05-19 dtype: datetime64[ns] >>> s = pd.Series([’12-5-2015′, ’14-1-2013′, ’20/12/2017′, ’40/23/2017′]) >>> pd.to_datetime(s, dayfirst=True, errors=’coerce’) 0 2015-05-12 1 2013-01-14 2 2017-12-20 Pada materi kali ini, kita akan coba menggunakan sebuah dataset harga saham yang bisa diunduh disini : microsoft_stock.csv Untuk memudahkan analisis data time series ini, ada beberapa argumen yang perlu kita tambahkan, seperti berikut: microsoft = pd.read_csv(‘microsoft_stock.csv’, index_col=’Date’, parse_dates=True) parse_dates pada syntaks diatas digunakan untuk mengubah date berupa objek menjadi format date yang sesuai sehingga kolom tersebut bisa dibaca. Output dari pembacaan data di atas adalah: Selection and FilteringKita bisa melakukan indexing hanya di waktu tertentu. seperti berikut: Dalam case stock data, cara diatas menampilkan keseluruhan data saham di tahun 2021. Kita bisa melakukan filtering hanya menampilkan di bulan tertentu atau di range tertentu, seperti berikut: Jika kita menginginkan untuk menampilkan ‘beginning’ dan ‘end’, Pandas memiliki atribut .first() dan .last(). Sebagai contoh, kita ingin menampilkan harga saham di tahun 2021 pada minggu pertama : Jika kita ingin menampilan harga saham minggu terakhir di tahun 2021, seperti berikut: Time GroupingDalam data time series, kita juga bisa melakukan grouping untuk menampilkan data berdasarkan waktu tertentu dan agregasi tertentu. Sebagai contoh, kita ingin menampilkan data saham microsoft di tahun 2021 dalam 1 pekan dengan kondisi harga yang ditampilkan pada ‘Open’ adalah yang pertama, ‘High’ adalah nilai maksimum, ‘Low’ adalah nilai minimum, ‘Close’ harga terakhir dan agregat ‘sum’ untuk Volume. Dengan menggunakan syntaks seperti berikut: microsoft[‘2021′].groupby(pd.Grouper(freq=’1W’)).agg({‘Open’:’first’, ‘High’:’max’, ‘Low’:’min’, ‘Close’: ‘last’, ‘Volume’:’sum’}) Jika ingin mengubah-ubah waktu yang kita inginkan, maka lakukan perubahan pada bagian freq=’ ‘ . Output dari syntaks di atas adalah: Shifting for Lagged DataLagged data adalah data yang nilainya muncul dari nilai sebelumnya. Untuk melakukan shifting data, Pandas memiliki atribut .shift(). Misalkan kita ingin melihat harga saham di penutupan hari sebelumnya. Dengan menggunakan syntaks seperti berikut: microsoft.assign(prior_close=lambda x: x.Close.shift(), after_hours_change_in_price=lambda x: x.Open – x.prior_close,abs_change=lambda x: x.after_hours_change_in_price.abs() ).nlargest(5, ‘abs_change’) Differenced DataKita telah mencoba membuat lagged data dengan menggunakan atribut shift(). Tetapi terkadang, kita tertarik untuk melihat bagaimana perubahan harga setiap harinya. Pandas memiliki atribut .diff() dengan formula seperti berikut: Kita bisa menggunakan atribut .diff() untuk melihat perubahan harga saham microsoft setiap harinya. ResamplingTerkadang data yang begitu detail tidak kondusif untuk kita analisis. Misalkan kita punya seluruh data tiap menit harga saham microsoft di tahun 2021. Kemudian kita lakukan visualisasi, maka terkadang visual yang kita buat tidak memberikan makna apapun, sebagai ilustrasi seperti berikut: Untuk menampilkan visual dengan frekuensi tertentu, kita perlu melakukan resampling data dengan menggunakan resample(), sebagai contoh: stock_data_per_minute.resample(‘1D’).agg(‘open’: ‘first’, ‘high’: ‘max’, ‘low’: ‘min’,’close’: ‘last’, ‘volume’: ‘sum’ }) Syntaks dan output di atas hanya sebagai contoh tidak berhubungan dengan data microsoft. Misalkan kita ingin melakukan resampling rata-rata triwulan harga saham micosoft harian, seperti berikut: Time MergingDalam data time series, kita bisa melakukan merging. kita dapat menggunakan pd.merge_asof() untuk mencocokkan di sekitar key daripada pada key yang sama. Di sisi lain, jika kita mau mencocokkan key yang sama dan menggunakan key tanpa kecocokan, kita dapat menggunakan pd.merge_ordered().Sebagai contoh antara data fb dan Apple: (dataset tidak disertakan, ini hanya sebagai contoh) >>> fb_prices.index.second.unique() Int64Index([0], dtype=’int64′, name=’date’) >>> aapl_prices.index.second.unique() Int64Index([ 0, 52, 36, 34, 55, 35, 7, 12, 59, 17, 5, 20, 26, 23, 54, 49, 19, 53, 11, 22, 13, 21, 10, 46, 42, 38, 33, 18, 16, 9, 56, 39, 2, 50, 31, 58, 48, 24, 29, 6, 47, 51, 40, 3, 15, 14, 25, 4, 43, 8, 32, 27, 30, 45, 1, 44, 57, 41, 37, 28], dtype=’int64′, name=’date’) pd.merge_asof(fb_prices, aapl_prices,left_index=True, right_index=True, direction=’nearest’, tolerance=pd.Timedelta(30, unit=’s’)).head() pd.merge_ordered(fb_prices.reset_index(), aapl_prices.reset_index()).set_index(‘date’).head() |