-
Menginstall Anaconda3 / Jupyter notebook
-
Menginstal Library Berikut Pada Anaconda Prompt
1.Click Start(Gambar Windows Pada Keyboard)
2.Ketik "Anaconda Prompt"
3.Open Anaconda Prompt
1.Buka Spotlight (Cmd+Space)
2.Ketik "Navigator"
3.Open Navigator
Reference : Dokumentasi Anaconda
- Pandas
conda install -c anaconda pandas
- Numpy
conda install -c anaconda numpy
- Tabula
conda install -c conda-forge tabula-py
Pada Sharing Session kali ini kita akan membahas tentan Crawling Data dengan sumber table dari pdf kedalam Format Csv
import pandas
import tabula
import glob
import os
Pada Sharing Session kali ini kita menggunakan beberapa Library python yaitu
Pandas
Untuk Penanganan Datatabula
Untuk Crawling Data dari pdfglob
Untuk Mengambil File dari Direktorios
Untuk Menjalankan Perintah operating system pada python
Pada tahapan pertama yang dilakukan adalah inisiasi variabel page yang ingin dicetak dan pembuatan direktori untuk menyimpan hasil output
namaprovinsi = "bali"
pagestart = 1
pageend = 25
if not os.path.exists('E:\Magang/new/'+namaprovinsi):
os.makedirs('E:\Magang/new/'+namaprovinsi)
Setelah Direktori dibuat tahap selanjutnya adalah melakukan convert dari pdf ke csv page per page
pada case ini output dari file csv per page disimpan didalam direktori E:\Magang/new/bali/
for x in range(pageend-pagestart+1):
df = tabula.read_pdf("E:\Magang/new/bali.pdf", encoding='utf-8', spreadsheet=True, pages=pagestart+x)
df.to_csv('E:\Magang/new/'+namaprovinsi+"/page"+str(pagestart+x)+'.csv', encoding='utf-8',index = False)
print("Export page -----> "+str(pagestart+x))
print("export ke csv selesai")
Untuk membaca pdf menggunakan syntaq
tabula.read_pdf('path',spreadsheet=True,pages='pages_ingin_dikonversi')
- path : merupakan lokasi file
- spreadsheet = true : untuk membuat row pertama menjadi nama kolom
- pages : merupakan halaman pada pdf yang ingin dibaca
Untuk dokumentasi lebih lanjut dapat menuju link berikut
File Csv Per Page akan tersimpan di direktori E:\Magang/new/bali/
,Maka Langkah Selanjutnya adalah menggabungkan
file csv tersebut menjadi 1.
Disini kita perlu menyimpan terlebih dahulu semua nama csv yang ada dalam direketori dengan menggunakan library glob
path = r'E:\Magang/new/'+namaprovinsi
all_files = glob.glob(path + "/*.csv")
Selanjutnya kita membuka file csv tersebut dan menyimpannya dalam sebuah array. yang lalu akan disatukan menggunakan library pada pandas yaitu concat
li = []
for filename in all_files:
df = pandas.read_csv(filename, index_col=None, header=0)
li.append(df)
frame = pandas.concat(li, axis=0)
Berikut adalah output table yang disatukan
frame
Setelah terconvert nama column akan berantakan dan tidak urut, maka kira merename dan menata ulang column menggunakan pandas
frame = frame.rename(columns={"K O D E":"id_kelurahan","NAMA PROVINSI /\rKABUPATEN / KOTA":"kabupaten","LUAS\rWILAYAH\r(Km2)":"kecamatan","JUMLAH\rPENDUDUK\r(Jiwa)":"kelurahan","K E T E R A N G A N":"desa",})
kolomoutput = ['id_kelurahan', 'kabupaten', 'kecamatan','kelurahan','desa']
frame = frame.reindex(columns=kolomoutput)
Ouput akan seperti berikut
Karena Masih ada id_kelurahan yang masih null, maka kita perlu melakukan filter pada menggunakan pandas
frame = frame[frame['id_kelurahan'].str.len() > 0]
Dan selanjutnya adalah tahap terakhir yaitu export ke csv
frame.to_csv('E:\Magang/bali.csv', index=False,sep = ",")
output akan seperti berikut
Seringkali raw data yang diterima seorang Data Scientist tidak dapat langsung digunakan untuk modelling, untuk tipe data seperti ini maka diperlukan tahap pre-processing; salah satunya adalah data cleansing. Berikut ini contoh input dan output cleansing dan formating data Pulau Bali
Berikut ini untuk script cleansing menggunakan python :
import pandas as pd
import numpy as np
Keterangan :
import pandas as pd
: mengimport library pandas as pd terlebih dahulu (pandas untuk membersihkan data mentah ke bentuk data yang dapat diolah)import numpy as np
: mengimport library numpy as pd terlebih dahulu (numpy untuk mengubah python ke pemodelan ilmiah)
provinsi = "Bali"
Untuk menyimpan nama kolom pada provinsi
df = pd.read_csv("E:\Magang/Bali.csv",sep=',')
Keterangan :
pd.read_csv
: untuk membaca file dengan format CSV dan mengkonversinya menjadi pandas Dataframesep='
: parameter sep=',' sesuai separator pada file- contoh separator :
df.head()
Keterangan :
df['kabupaten'] = df['kabupaten'].fillna(method='ffill')
df['kecamatan'] = df['kecamatan'].fillna(method='ffill')
Keterangan :
-
fillna untuk mengganti setiap NaN dengan nilai non -NaN pertama pada kolom yang sama di atasnya.
-
Output :
Dokumentasi Terkait method Fillna di pandas bisa dilihat di link berikut Library Fillna Pandas
df = df[df['id_kelurahan'].str.len() >10]
Keterangan :
df['desa'] = df['desa'].str.replace('\r\d+', '')
df['kelurahan'] = df['kelurahan'].str.replace('\r\d+', '')
df['kecamatan'] = df['kecamatan'].str.replace('\r\d+', '')
df['kabupaten'] = df['kabupaten'].str.replace('\r\d+', '')
Keterangan :
-
str.replace ('\r\d+', '')
untuk mengganti '\r' dan '\d+' dengan karakter lain menjadi ''(dimana \d+ adalah regex untuk nomor integer) -
Output :
df['provinsi'] = provinsi
Keterangan :
df['keterangan'] = np.where(df['kelurahan'].isnull(), 'desa', 'kelurahan')
Keterangan :
-
np.where
atau numpy.where adalah suatu kondisi mendapatkan entri dalam array yang memenuhi kondisi -
isnull()
adalah argumen ekspresi yang diperlukan adalah varian yang berisi ekpresi numerik atau ekspresi string. -
Output :
df = df.rename(columns={"id_kelurahan":"id_dukcapil","kabupaten":"kabupaten_kota"})
Keterangan :
df['id_prov'] = df['id_dukcapil'].str.split('.').str[:1]
df['id_kab'] = df['id_dukcapil'].str.split('.').str[:2]
df['id_kec'] = df['id_dukcapil'].str.split('.').str[:3]
df['id_kel'] = df['id_dukcapil'].str.split('.').str[:4]
Keterangan :
-
str.split(.)
untuk memisahkan string di sekitar separator atau pembatas; disini separator berupa tanda "." -
str[:n]
untuk mengekstrak seluruh sekuensi string dari awal sampai ke-n -
Output :
df['id_prov'] = df['id_prov'].str.join('')
df['id_kab'] = df['id_kab'].str.join('')
df['id_kec'] = df['id_kec'].str.join('')
df['id_kel'] = df['id_kel'].str.join('')
Keterangan :
-
str.join()
untuk mengembalikan string di mana elemen urutan telah bergabung dengan pemisah atau separator str; disini kami menggunakan pembatas ('') -
Output :
df['kelurahan_desa']=np.where(df['kelurahan'].isnull(), df['desa'], df['kelurahan'])
keterangan :
-
np.where(kondisi,benar,salah)
-
artinya jika kolom kelurahan berisi nilai null artinya "true" maka kolom kelurahan berisi data yang ada di kolom desa, tetapi jika "false" atau data tidak berisi null maka kolom kelurahan berisi data yang ada di kolom kelurahan.
-
Output :
del df['kelurahan']
del df['desa']
Keterangan :
-
perintah del df []
untuk menghapus kolom; disini perintah tersebut untuk menghapus kolom kelurahan dan desa -
Output :
columnsTitles = ['id_dukcapil', 'id_prov', 'id_kab','id_kec','id_kel','provinsi','kabupaten_kota','kecamatan','kelurahan_desa','keterangan']
Keterangan :
ColumnsTitles
berfungsi untuk menyimpan nama kolom yang mau diambil sesuai kebutuhan kita.
df = df.reindex(columns=columnsTitles)
keterangan :
-
df.reindex()
berfungsi untuk proses membuat ulang index pada tabel berdasarkan data yang terdapat dalam tabel -
Output :
df.to_csv('E:\Magang/sprint/outputprov_'+provinsi+'.csv', index=False)
Keterangan :
Fillna adalah fungsi pada library pandas untuk mengisi baris yang null dengan nilai lain
Tabel diatas akan diolah dengan fillna dengan code berikut :
df['kabupaten'] = df['kabupaten'].fillna(0) #fillna Menggunakan 0
df['kecamatan'] = df['kecamatan'].fillna(method='ffill') #fillna Menggunakan Method 'ffill'
df['kelurahan'] = df['kelurahan'].fillna(value=77, limit=3) #fillna Menggunakan Values
Sehingga Outputnya Adalah Seperti Berikut :
Keterangan :
Pada fungsi fillna mempunyai beberapa metode yaitu :
- pada kolom kabupaten menggunakan method 0 sehingga membuat Tabel yang Null/Nan Menjadi 0
- pada kolom kecamatan menggunakan method 'ffill'sehingga membuat baris yang Null/Nan mengikuti baris diatasnya yang tidak Null/Nan
- Pada Kolom Kelurahan menggunakan method values,pada method values membutuhkan 2 input yaitu: value Berfungsi untuk memberikan nilai sesuai yang diinputkan limit Berfungsi untuk memberikan batas sampai berapa kali input diberikan pada baris Null/Nan