Data Engineer Challenge with Python[DQLab Project]

Sandi Wanda Harlan
7 min readMar 10, 2021

--

Mentor : CT Corp Digital

Source : https://analyticsindiamag.com/wp-content/uploads/2017/11/why-data-engineer-trending-01.jpg

Yap, kali ini saya akan membahas project “Data Engineer Challenge with Python. Project ini merupakan kerja sama antara DQLab Academy dengan CT Corp.

CT Corp adalah konglomerat konsumen terbesar dan berkembang pesat di Indonesia dengan bisnis utama di perbankan, jasa keuangan, media, gaya hidup, hiburan, sumber daya alam, dan F&B. CT Corp telah mendirikan perusahaan yang kuat di pasar konsumen seperti: Bank Mega, Bank Mega Syariah, Mega Life, DetikNetwork, TRANSMEDIA (Trans TV, Trans 7, TV CNN Indonesia, CNNIndonesia.com, CNBC TV, (CNBCIndonesia.com), Trans Fashion, Transmart (Carrefour), and F&B (Baskin Robins, Coffee Bean, Wendy’s).

Project ini terdiri atas 2 (dua) bagian, yaitu:

  1. Web Scraping, yang bertujuan untuk mengambil data dari website dalam bentuk data HTML
  2. Function and Regular Expression, yang bertujuan untuk membuat sebuah function dan penggunaan Regular Expression dalam bahasa pemrograman Python.

Web Scraping

Sebagai seorang Data Engineer, Kita diminta untuk menggali informasi dari https://id.wikipedia.org/wiki/Demografi_Indonesia menggunakan bahasa pemrograman Python.

Buatlah suatu script Python untuk menyimpan tabel “Jumlah Penduduk menurut Provinsi” dari web tersebut dengan format CSV.

File CSV menggunakan format double-apostrophe quoting (“) dan disimpan dengan nama “Indonesia_Demography_by_Province.csv”

Kolom yang perlu Anda ambil adalah sebagai berikut.

  • Kode BPS
  • Nama
  • Ibu Kota
  • Populasi
  • Luas km
  • Pulau

Answer :

Web Scraping adalah salah satu metode yang bisa kita gunakan dalam mengumpulkan data dari internet. Scraping kita lakukan seandainya ingin melakukan ekstraksi informasi dari sebuah situs web secara langsung dengan menggunakan protokol http.

Web Scraping bisa menjadi solusi dalam mendapatkan informasi dari sebuah situs web jika situs tersebut tidak menyediakan API untuk pengambilan informasi. Berikut langkah-langkah yang dapat dilakukan dalam Web Scraping.

Library yang kita butuh kan :

  1. Pandas, digunakan untuk mengekstrak data menjadi dalam bentuk tabel atau data frame, sehingga data tersebut dapat digunakan untuk proses analisis.
  2. requests, digunakan untuk mengirim berbagai request HTTP
  3. BeautifulSoup, merupakan library paling penting dalam web scraping digunakan untuk melakukan ekstraksi file dengan format XML atau HTML
#import library yang dibutuhkan
import pandas as pd
import requests
from bs4 import BeautifulSoup

Langkah selanjutnya, Request ke Website. Kita akan mengambil data tabel demografi di https://id.wikipedia.org/wiki/Demografi_Indonesia , yang tampilan web nya seperti dibawah ini.

Tampilah web https://id.wikipedia.org/wiki/Demografi_Indonesia

Lakukan request ke website dengan request.get(), kemudian gunakan BeautfulSoup untuk web scraping dan simpan di variabel “soup”.

#buatlah request ke website
url = requests.get('https://id.wikipedia.org/wiki/Demografi_Indonesia').text
soup = BeautifulSoup(url, 'lxml')

Jika kita memanggil “soup”, tampilan nya seperti di bawah ini

Kemudian Ambil tabel dengan class ‘wikitable sortable’ dengan menggunakan soup.find() dan simpan di variabel “tabel_wiki”.

#ambil table dengan class 'wikitable sortable'
tabel_wiki = soup.find('table', {'class':'wikitable sortable'})

Jika kita memanggil “tabel_wiki”, tampilan nya seperti di bawah ini:

td merupakan kepanjangan dari table data. Gunakan findAll() untuk mencari data yang merupakan isi dari tabel atau jika di MS.excel seperti cell. Kemudian simpan dalam variabel “tabel_bersih”.

#cari data dengan tag 'td'
tabel_bersih = tabel_wiki.findAll('td')

Jika kita memanggil “tabel_bersih”, tampilan nya seperti di bawah ini.

Next, buat list kosong dengan nama-nama Header seperti yang di butuhkan soal yaitu Kode BPS, Nama, Ibu Kota, Populasi, Luas km dan Pulau.

#buatlah lists kosong
kodebps = []
nama = []
ibukota = []
populasi = []
luas = []
pulau = []

Untuk memasukkan data HTML ke dalam list. langkah awal adalah menggunakan fungsi enumerate() untuk iterasi. Fungsi enumerate() mengembalikan objek iterable yang tiap itemnya berpasangan dengan indeks. Selanjutnya gunakan pengulangan for untuk mengisi list kosong dengan data yang ada di “tabel_bersih”.

Dalam pengulangan “for” tersebut, gunakan if untuk mengisi masing-masing kolom dengan data yang di butuhkan.

Coba perhatikan Data dari web nya yang berisi 9 kolom dan coba “tabel_bersih”,

index 0, berisi kode BPS data pertama (11)
index 1, berisi lambang provinsi data pertama (link lambang provinsi Aceh)
index 2, berisi nama provinsi data pertama (Aceh)
index 3, berisi kode ISO data pertama (ID-AC)
index 4, berisi nama ibukota data pertama (Banda Aceh)
index 5, berisi jumlah populasi data pertama (4.494.410)
index 6, berisi luas wilayah data pertama (56.500,51)
index 7, berisi status khusus data pertama (Daerah Istimewa dan Khusus)
index 8, berisi nama pulau data pertama (Sumatera)

index 9, berisi kode BPS data kedua (12)
………. dan seterusnya

Dari “tabel_bersih” , dapat disimpulkan terdapat data dengan variabel yang sama di setiap pengulangan index kelipatan 9.

Selanjutnya, isi data list kosong yang disebutkan sebelumnya dengan menggunakan fungsi apend() lalu gunakan get.text() untuk mengambil hanya informasi text.

#memasukkan data ke dalam list berdasarkan pola HTMLenum= enumerate(tabel_bersih)
pl = len(tabel_bersih)
for i, item in enum:
if i in range(0, pl, 9):
kode_bps.append(item.get_text())
if i in range(2, pl, 9):
nama.append(item.get_text())
if i in range(4, pl, 9):
ibu_kota.append(item.get_text())
if i in range(5, pl, 9):
populasi.append(item.get_text())
if i in range(6, pl, 9):
luas_km.append(item.get_text())
if i in range(8, pl, 9):
pulau.append(item.get_text()[:-1])

Tahap terakhir dari web scraping ini adalah membuat data frame dan menyimpan ke dalam CSV. Gunakan pd.DataFrame() untuk membuat dataframe.

#buatlah DatFrame dan masukkan ke CSV
df = pd.DataFrame()
df['Kode BPS'] = kodebps
df['Nama'] = nama
df['Ibu Kota'] = ibukota
df['Populasi'] = populasi
df['Luas km'] = luaskm
df['Pulau'] = pulau

Cek tampilan data frame dengan df.head()

Simpan dataframe ke CSV dengan df.to_csv().

df.to_csv('Indonesia_Demography_by_Province.csv')

Tampilan file Indonesia_Demography_by_Province.csv

Function and Regular Expression

Sebagai seorang Data Engineer, Anda diminta untuk membuat suatu fungsi yang bernama “email_check” untuk menyaring beberapa email menggunakan regular expression dalam bahasa pemrograman Python. Fungsi ini akan menerima suatu parameter yang bernama “input” yang mana merupakan email dan output-nya akan berupa “Pass” atau “Not Pass”. Fungsinya harus memenuhi pola berikut :

Answer :

Dalam kasus ini kita akan menggunakan library re atau regular Expression. Regular expression (regex) adalah deretan karakter yang digunakan untuk pencarian string atau teks dengan menggunakan pola (pattern). Jadi Kita akan membuat sebuah pola sedemikian sehingga input email dari 9 row data diatas sesuai dengan output-nya (Pass/Not Pass). Dalam kasus ini daya tidak menjelaskan regex dari awal karena dapat membuat artikel ini lebih panjang. Untuk mengetahui Regex dari dasar, silahkan googling atau cari di sumber lain yang lebih lengkap dan untuk mengetes apakah pola yang kita buat sudah benar atau tidak, kita dapat menggunakan regexr.com.

Dalam regex ada yang namanya Meta Character yang berarti karakter khusus yang menjadi acuan terbentuk nya pola. Berikut Meta Character.

Import Library Regex.

#import library yang dibutuhkan
import re

Mari kita analisa.

Email pertama, ‘my-name@someemail.com’ output nya “Not Pass”. Dari 9 email yang ditampilkan, hanya email pertama ini yang menggunakan tanda strip/minus “-”. Kita ambil kesimpulan sementara email dengan yang mengandung karakter “-” akan menghasilkan output “Not Pass”

Pola nya yaitu

(?=^((?!-).)*$)

(?!…..) Menentukan posisi menggunakan negasi pola.
(?!-). Menentukan posisi dimana semua karakter cocok kecuali “-”.
((?!-).)* Pola tersebut boleh mengalami perulangan atau tidak sama sekali.
^((?!-).)*$ Tambahkan ^ dan $ untuk memulai dan mengakhiri pola.
(?=^((?!-).)*$) Tambahkan (?=…) untuk menentukan posisi awal.

Yap, setelah kita dapatkan pola pertama, mari kita lihat lagi data email- nya. Perhatikan email ke 8 dan 9, ‘201903myname@someemail.com’ dan ‘201903.myname@someemail.com’. Kedua email ini punya output “Not Pass”. Persamaan email ini adalah sama-sama di awali oleh angka. Dapat kita ambil kesimpulan bahwa email yang di awali oleh angka akan menghasilkan output “Not Pass”. Polanya,

(?=^\D)

^\D berarti cocok dengan karakter apa pun selain angka.

Lanjut perhatikan email ke 5 dan email ke 6 yang mengeluarkan output “Not Pass” ‘my.name.2019@someemail.com’ dan
somename.201903@someemail.com. Kedaua kesamaan dari email tersebut adalah e,ail tersbut mengandung karakter “.” dan diikuti dengan angka. Ternyata email ke 7 ‘my_name.201903@someemail.com’ yang outpunya “Pass” juga memiliki karakter dengan pola “.” diikuti angka. Namun terdapat perbedaan yaitu hanya email ke 7 mengandung karakter “_”.

Maka kita dapat membuat plola dengan logika dimana pola nya tidak cocok untuk email yang mengandung karakter “.” diikuti angka atau cocok dengan email yang mengandung karakter “.” diikuti angka dan mengandung karakter “_”.

Berikut pola nya,

(?=^((?!\.\d).)*$)|(?=.*_)

^((?!\.\d).)*$) Pola yang tidak mengandung karakter “.” diikuti angka.
| merupakan “atau”
(?=.*_) Pola yang mengandung karakter “_”.

Setelah kita dapatkan pola nya, gunakan fungsi looping,

#import library yang dibutuhkan
import re
#function email_check
def email_check(input):
match = re.search('(?=^((?!-).)*$)(?=^\D)((?=^((?!\.\d).)*$)|(?=.*_))',input)
if match:
print('Pass')
else:
print('Not Pass')
#Masukkan daftar email ke dalam list
emails = ['my-name@someemail.com', 'myname@someemail.com','my.name@someemail.com',
'my.name2019@someemail.com', 'my.name.2019@someemail.com',
'somename.201903@someemail.com','my_name.201903@someemail.com',
'201903myname@someemail.com', '201903.myname@someemail.com']
#Looping untuk pengecekan Pass atau Not Pass
for email in emails :
email_check(email)

Output :

Certificate :

https://academy.dqlab.id
https://devtrik.com/python/web-scraping-dengan-python-dan-beautifulsoup/
https://code.tutsplus.com/id/tutorials/scraping-webpages-in-python-with-beautiful-soup-the-basics--cms-28211
https://www.tutorialspoint.com/python/python_reg_expressions.htm
https://www.webhozz.com/code/python-regex/

--

--

Sandi Wanda Harlan

Credit Analyst || Data Enthusiast || Statistician || Still Learning