Mempercepat query jutaan basis data menggunakan agregasi

By | January 14, 2021
215 Views

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

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

 

Leave a Reply

Your email address will not be published.




Enter Captcha Here :