Pandas Deteksi Gap II

Kode Lima Detik

import pandas as pd

df = pd.read_csv('data_urut_dengan_kode.csv')

df['id_angka'] = df['id'].str.extract('(\d+)').astype('int64')
df['id_huruf'] = df['id'].str.extract('([a-zA-Z]+)')
kode = df['id_huruf'].unique()

for k in kode:
    print(k)
    data = df[df['id_huruf'].str.contains(k)]
    seq = [i for i in range(data['id_angka'].min(), data['id_angka'].max() + 1)]
    seq_df = pd.DataFrame(seq, columns=['no'])
    display(seq_df[~seq_df['no'].isin(data['id_angka'])])

Latar Belakang

Tulisan sebelumnya mungkin terlalu bagus untuk jadi kenyataan. Jarang kita temukan sebuah kode transaksi yang hanya menggunakan angka berurutan, seringnya angka tersebut dikombinasikan dengan kata yang menandakan jenis transaksi, seperti BELI, JUAL dan lainnya.

Pada tulisan ini kita akan mengeksplorasi data, kemudian mendapatkan nomor transaksi yang hilang meski kode transaksi tersebut menggunakan kombinasi kata, karakter non alphanumeric dan angka.


Langkah Kerja

Eksplorasi Data

Bagian ini adalah agak panjang dan membutuhkan beberapa percobaan. Tapi jangan takut, seiring dengan bertambah pengalaman dan makin mudahnya informasi, kita akan makin cepat melewati proses ini. Lagipula proses ini menyenangkan, selain karena proses belajarnya, juga seringkali kita mendapat temuan yang menarik pada data yang ada di depan kita.

Data dan notebook (gap_detection_id_with_code.ipynb) dapat diakses di sini.

Load library dan data

import pandas as pd

df = pd.read_csv('data_urut_dengan_kode.csv')

Kolom id adalah nomor transaksi yang akan kita uji. Selain berisi kombinasi kata, karakter dan angka, kolom tersebut juga tidak urut.

Gambaran Umum

Untuk mendapatkan gambaran umum mengenai kolom id kita dapat menggunakan fungsi unique dari pandas.

df['id'].unique()

Sepertinya pola yang digunakan adalah KATA-ANGKA. Perlu kita pastikan kata dan karakter apa saja yang digunakan, misal apakah ada selain tanda minus (-).

Ekstraksi Kata

df['id_huruf'] = df['id'].str.extract('([a-zA-Z]+)')

Kita membuat sebuah kolom bantu bernama id_huruf yang berisi hasil ekstraksi karakter alfabet dari kolom id. Setelahnya kita dapat mengetahui kata apa saja yang ada dalam kolom id_huruf.

df['id_huruf'].unique()

Ada tiga kata yaitu BELI, RETUR dan JUAL.

Ekstraksi Karakter Non Alphanumeric

Setelah yakin hanya terdapat tiga kata, kita pastikan apakah pola kolom id hanya KATA-ANGKA dengan mengambil karakter non alphanumeric yg ada.

df['id_karakter'] = df['id'].str.extract('(\W+)')

Menggunakan fungsi unique kita pastikan ada berapa karakter yang digunakan.

df['id_karakter'].unique()

Hanya terdapat satu karakter, sehingga kita dapat yakin bahwa kolom id menggunakan pola KATA-ANGKA.

Ekstraksi Angka

Langkah terakhir untuk melengkapi pola KATA-ANGKA adalah mengambil hanya angka dari kolom id.

df['id_angka'] = df['id'].str.extract('(\d+)').astype('int64')

Membuat Prototipe

Setelah lengkap pola yang digunakan, kita dapat membuat prototipe pada salah satu kata, misal RETUR.

Ambil Hanya RETUR

data = df[df['id_huruf'].str.contains('RETUR')]

Langkah tambahan yang berguna untuk meyakinkan kita adalah dengan melihat nilai tertinggi dan terendah dari kolom id_angka menggunakan fungsi describe.

data['id_angka'].describe()

Buat Daftar Berisi Angka Urut Sesuai Angka Min dan Max

seq = [i for i in range(data['id_angka'].min(), data['id_angka'].max() + 1)]
seq_df = pd.DataFrame(seq, columns=['no'])

Bandingkan seq_df dengan Data RETUR

seq_df[~seq_df['no'].isin(data['id_angka'])]

Kode di atas kurang lebih dinarasikan sebagai ini. “Dari data seq_df ambil kolom no yang ada dalam kolom id_angka pada data RETUR. Kemudian ambil data seq_df yang bukan itu”.

Fungsi isin dan negasi (tanda ~) sangat memudahkan proses ini.

Uji Apakah Angka Tersebut Tidak Ada dalam Data Transaksi

data[(data['id_angka'] > 22) & (data['id_angka'] < 26)]
data[(data['id_angka'] > 420) & (data['id_angka'] < 426)]

Nomor transaksi tersebut (RETUR-24, RETUR-422 dan RETUR-424) memang tidak ditemukan pada data.

Kode Lengkap

Jika hasil prototiping sudah meyakinkan, kita dapat membuat sebuah script untuk menguji semua data. Dalam kasus kita hanya terdapat 3 kata yang digunakan, mudah saja jika kita ingin mengulangi langkah pada bagian prototipe, namun jika data yang kita hadapi memiliki >5 saja kita sudah lelah melakukan copas. Karenanya kita perlu membuat sebuah kode yang akan menguji berapapun banyaknya kata yang ditemukan.

kode = df['id_huruf'].unique()
for k in kode:
    print(k)
    data = df[df['id_huruf'].str.contains(k)]
    seq = [i for i in range(data['id_angka'].min(), data['id_angka'].max() + 1)]
    seq_df = pd.DataFrame(seq, columns=['no'])
    display(seq_df[~seq_df['no'].isin(data['id_angka'])])

Kita menggunakan fungsi display dari Jupyter agar dataframe dapat ditampilkan dalam iterasi. Karena jika menggunakan fungsi print tampilan menjadi kurang menarik dan sulit dicerna.


Cover Image by Rupert Kittinger-Sereinig from Pixabay

One Reply to “Pandas Deteksi Gap II”

Leave a Reply

Your email address will not be published.