Mempercepat query jutaan basis data menggunakan agregasi
Ketika penulis sedang mengolah data record yang hanya terdiri dari ribuan data, maka cara seperti masking di data frame terkadang dilakukan menggunakan looping, namun tidak jika data yang digunakan sudah mencapai ratusan ribu bahkan jutaan record. Bisa butuh waktu bermenit-menit untuk melakukan looping, sehingga hal ini harus dihindari untuk mencegah bottleneck. Fungsi agregasi seperti sum(), mean(), median(), min(), and max() melibatkan sebuah key yang mempecepat proses hanya sekian detik saja. Tentu dasar data frame harus kalian pelajari dulu disini. Perhatikan data frame berikut
import numpy as np import pandas as pd df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C','C','C'], 'data': range(8)}, columns=['key', 'data']) df
Agregasi Sum()
Contents
Mari kita hitung jumlah data, misalkan untuk A jumlah datanya adalah 0+3 = 3, sedangkan untuk B = 1+4= 5
df.groupby('key').sum()
hasil
data key A 3 B 5 C 20
Agregasi Count()
Mari kita hitung jumlah kemunculan key (A,B,C,D)
df.groupby('key')[['key']].count()
hasil
key key A 2 B 2 C 4
Agregasi Max() dan Min()
Dapat digunakan untuk mencari nilai maksimal dan minimal
df.groupby('key')[['data']].max()
hasil
data key A 3 B 4 C 7
Agregasi Mean()
Dapat digunakan untuk menghitung nilai rerata
df.groupby('key')[['data']].mean()
hasil
data key A 1.5 B 2.5 C 5.0
Menggabungkan semua operasi Agregasi
Hemm cara diatas sudah cukup untuk mempercepat query, sedangkan kalau dilakukan satu-persatu agak merepotkan, gimana kalau menggabungkan nya menjadi satu? Misalkan count() dan sum(). Maka kita butuh operator lambda seperti berikut
frekuensi_sum = df.groupby('key').agg({'key': lambda x: x.count(), #frekuensi 'data': lambda x: x.sum()}) # sum #lakukan rename frekuensi_sum.rename(columns={'key': 'frekuensi', 'data': 'total'}, inplace=True) frekuensi_sum
hasil
frekuensi total key A 2 3 B 2 5 C 4 20
Lebih cepat lagi bukan? agregasi akan terasa manfaatnya ketika bekerja dengan jutaan record
Mendapatkan Tanggal Terakhir
Bila kalian menjumpai sebuah transaksi yang pastinya melibatkan tanggal, misalkan ingin mendapatkan informasi per pelanggan terakhir melakukan transaksi.
a = ['2020-06-01','2020-06-02','2020-06-30','2020-06-04','2020-12-23','2020-10-20'] key = ['A','A','A','A','B','B'] b = pd.DataFrame({'key':key,'tanggal':a}) #ubah menjadi dataframe
Sengaja tidak diurutkan, misalkan A melakukan transaksi pada 2020-06-30 dan B pada 2020-12-23. Nah operasi diatas melibatkan format date time, maka kolom tanggal harus diubah dulu menjadi date time kalian bisa baca disini mengenai date time.
b['tanggal'] = pd.to_datetime(b['tanggal'], format='%Y-%m-%d')
Selanjutkan menggunakan agregasi max() (atau transaksi terakhir mempunyai nilai tertinggi)
b.groupby('key')[['tanggal']].max()
hasil
tanggal key A 2020-06-30 B 2020-12-23
Kalian bisa melihat hasilnya lebih cepat, nah mempercepat query jutaan basis data menggunakan agregasi diatas bisa kamu lakukan secara lebih baik lagi sesuai kebutuhan. Namun kalau sudah mengolah data sampai ratusan juta record, penulis sarankan menggunakan dask