Data Engineer Challenge with Python¶

Aris Bahtiar¶

2022-11-07¶


Apa saja yang dibahas dalam project ini?¶

Project ini berupa tes untuk melihat kemampuan kamu dalam mulai berkarir menjadi Data Engineer. Tes ini terdiri atas 2 (dua) bagian, yaitu:

1.Web Scraping, yang dirancang untuk memperlihatkan kemampuan member dalam mengambil data dari website dalam bentuk data HTML 2.Function and Regular Expression, yang dirancang untuk memperlihatkan pengetahuan member terkait dasar-dasar pembuatan sebuah function dan penggunaan Regular Expression dalam bahasa pemrograman Python.

Web Scraping¶

Sebagai seorang Data Engineer, Anda 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.

Nama provinsi Luas (km2) Populasi (2010) Populasi (2020) Dataframe yang akan kamu buat diassign dengan nama variabel df.

In [4]:
#import library yang dibutuhkan
import pandas as pd
import requests
from bs4 import BeautifulSoup

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

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

#cari data dengan tag 'td'
links = my_table.findAll('td')

#buatlah lists kosong 
nama = []
luas_km = []
populasi10 = []
populasi20 = []

#memasukkan data ke dalam list berdasarkan pola HTML
for i, link in enumerate(links):
    if i in range(0, len(links), 4):
        nama.append(link.get_text()[:-1])
    if i in range(1, len(links), 4):
        luas_km.append(link.get_text()[:-1])
    if i in range(2, len(links), 4):
        populasi10.append(link.get_text()[:-1])
    if i in range(3, len(links), 4):
        populasi20.append(link.get_text()[:-1])

#buatlah DataFrame dan masukkan ke CSV
df = pd.DataFrame()
df['Nama Provinsi'] = nama
df['Luas km'] = luas_km
df['Populasi 2010'] = populasi10
df['Populasi 2020'] = populasi20
df.to_csv('Indonesia_Demography_by_Province.csv', index=False, encoding='utf-8', quoting=1)
print(df)
                    Nama Provinsi     Luas km Populasi 2010 Populasi 2020
0                            Aceh   56.500,51     4.494.410     5.274.871
1                   Sumatra Utara   72.427,81    12.982.204    14.799.361
2                   Sumatra Barat   42.224,65     4.846.909     5.534.472
3                            Riau   87.844,23     5.538.367     6.394.087
4                           Jambi   45.348,49     3.092.265     3.548.228
5                 Sumatra Selatan   91.592,43     7.450.394     8.467.432
6                        Bengkulu   19.795,15     1.715.518     2.010.670
7                         Lampung   37.735,15     7.608.405     9.007.848
8       Kepulauan Bangka Belitung   16.424,14     1.223.296     1.455.678
9                  Kepulauan Riau    8.084,01     1.679.163     2.064.564
10  Daerah Khusus Ibukota Jakarta      740,29     9.607.787    10.562.088
11                     Jawa Barat   36.925,05    43.053.732    48.274.162
12                    Jawa Tengah   32.799,71    32.382.657    36.516.035
13     Daerah Istimewa Yogyakarta    3.133,15     3.457.491     3.668.719
14                     Jawa Timur   46.689,64    37.476.757    40.665.696
15                         Banten    9.018,64    10.632.166    11.904.562
16                           Bali    5.449,37     3.890.757     4.317.404
17            Nusa Tenggara Barat   19.708,79     4.500.212     5.320.092
18            Nusa Tenggara Timur   46.137,87     4.683.827     5.325.566
19               Kalimantan Barat  120.114,32     4.395.983     5.414.390
20              Kalimantan Tengah  153.564,50     2.212.089     2.669.969
21             Kalimantan Selatan   37.530,52     3.626.616     4.073.584
22               Kalimantan Timur  194.849,08     3.553.143     3.766.039
23               Kalimantan Utara   72.567,49       738.163       701.814
24                 Sulawesi Utara   13.930,73     2.270.596     2.621.923
25                Sulawesi Tengah   68.089,83     2.635.009     2.985.734
26               Sulawesi Selatan   46.116,45     8.034.776     9.073.509
27              Sulawesi Tenggara   36.757,45     2.232.586     2.624.875
28                      Gorontalo   12.165,44     1.040.164     1.171.681
29                 Sulawesi Barat   16.787,19     1.158.651     1.419.229
30                         Maluku   47.350,42     1.533.506     1.848.923
31                   Maluku Utara   39.959,99     1.038.087     1.282.937
32                    Papua Barat  114.566,40       760.422     1.134.068
33                          Papua  309.934,40     2.833.381     4.303.707

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 :

Pola Pass / Not Pass my-name@someemail.com

Not Pass

myname@someemail.com

Pass

my.name@someemail.com

Pass

my.name2019@someemail.com

Pass

my.name.2019@someemail.com

Not Pass

somename.201903@someemail.com

Not Pass

my_name.201903@someemail.com

Pass

201903myname@someemail.com

Not Pass

201903.myname@someemail.com

Not Pass

In [5]:
#import library yang dibutuhkan
import re

#function email_check
def email_check(input):
  match = re.search('(?=^((?!-).)*$)(?=[^0-9])((?=^((?!\.\d).)*$)|(?=.*_))', input)
if email_check:
    print('Pass')
else:
    print('Not Pass')
#Masukkan data 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, gunakan variabel email untuk mengiterasi emails
for email in emails:
  email_check(email)
Pass