Extract, Transform, Load
Pipeline
Project Data Engineer
by Zulfa Nurfajar
CASE STUDIES
SOLUTIONS
CONTACT
01
02
03
2
List of Contents
3
CASE STUDIES
Case Studies
4
Problem Context
Tim Marketing
Tim mempunyai data produk elektronik dalam bentuk file CSV. Data tersebut memiliki atribut seperti yang terlihat pada gambar di bawah ini. Namun, data ini memiliki sejumlah masalah yang dapat menghambat analisis.
Salah satu masalahnya adalah adanya nilai missing pada beberapa atribut penting, seperti ketersediaan produk dan kondisi barang, yang seharusnya memberikan konteks lebih mendalam.
Selain itu, terdapat inkonsistensi format data, khususnya pada nilai harga, yang menyulitkan proses pengolahan data. Kemudian, kurangnya informasi tambahan seperti diskon atau promosi.
Masalah ini menunjukkan perlunya proses pembersihan data dan transformasi data.
5
Problem Context
Tim Sales
Tim Sales memiliki data penjualan barang yang disimpan di dalam database PostgreSQL yang di-host menggunakan Docker. Berdasarkan gambar di bawah ini, data memiliki sejumlah masalah utama yang perlu diatasi.
Pertama, terdapat banyak nilai yang hilang (missing values) pada kolom penting, seperti jumlah penjualan dan rating. Kehilangan nilai-nilai ini dapat mempersulit analisis dan pengambilan keputusan berbasis data.
Selain itu, format data dalam database sering kali tidak konsisten. Contohnya kolom numerik, seperti harga atau kuantitas, juga mengandung karakter non-angka sehingga memerlukan proses pembersihan data dan transformasi data.
6
Problem Context
Tim Data Scientist
Tim membutuhkan data produk Torch untuk keperluan riset dan pengembangan strategi pemasaran, Data ini diharapkan mencakup informasi seperti harga produk, rating, diskon, penjualan, dan sebagainya.
Namun, data semacam ini tidak disediakan langsung dalam format yang siap digunakan, sehingga proses pengumpulan data harus dilakukan melalui metode Web Scraping dari platform e-commerce seperti Lazada dan Tokopedia.
Metode Web Scraping ini memungkinkan pengumpulan data dari halaman produk secara langsung, termasuk harga, rating, jumlah penjualan, dan informasi lainnya yang tersedia di situs web tersebut. Namun, struktur data pada situs-situs tersebut seringkali kompleks dan tidak seragam, yang menyulitkan proses analisis data.
Oleh sebab itu, data yang dikumpulkan melalui Web Scraping memerlukan pembersihan data dan transformasi data.
7
Zulfa Nurfajar
SOLUTIONS
8
Extract Data
Designing ETL Pipelines
Data Engineer Solution:
Extract Data
Transform Data
Load Data
9
Extract Data
Extract Data dari file CSV
Tahap ekstraksi dimulai dengan pengambilan data marketing yang tersimpan dalam file CSV bernama ElectronicsProductsPricingData.csv. Untuk mengambil data ini, digunakan class bernama ExtractMarketingData yang dibuat dengan framework Luigi. Class ini memastikan data diekstraksi dengan rapi dan disimpan dalam folder lain. Berikut script python yang digunakan pada proses ekstraksi data marketing.
class ExtractMarketingData(luigi.Task):
def requires(self):
pass # Tidak ada task yang diperlukan
def output(self):
# Menyimpan data yang diekstrak ke file CSV
return luigi.LocalTarget('.../extracted_marketing_data.csv')
def run(self):
# Membaca data dari file CSV
marketing_data = pd.read_csv('ElectronicsProductsPricingData.csv')
# Menyimpan data yang diekstrak ke file CSV
marketing_data.to_csv(self.output().path, index = False)
Dengan metode run() pada class tersebut, data dibaca menggunakan library pandas, yang memungkinkan pengelolaan data secara efisien sebelum disimpan ke file tujuan. Selain itu, pendekatan ini memberikan keunggulan dalam pengelolaan alur kerja.
Karena Luigi memungkinkan integrasi tahap-tahap berikutnya dalam pipeline ETL secara modular. Output yang dihasilkan oleh tahap ekstraksi ini kemudian menjadi input untuk proses transformasi data, memastikan aliran kerja yang terstruktur dan konsisten
10
Extract Data
Tahap ekstraksi data sales ini dilakukan dengan mengambil data langsung dari PostgreSQL bernama amazon_sales_data. Untuk proses ini, digunakan class ExtractDatabaseSalesData berbasis Luigi, yang bertugas menjalankan query SQL untuk mengambil semua data dari tabel tersebut.
def db_source_sales_engine():
db_username = 'postgres' # Nama pengguna database
db_password = 'password123' # Kata sandi database
db_host = 'localhost:5433' # Host database
db_name = 'etl_db' # Nama database
# Membuat string koneksi untuk database PostsgreSQL
engine_str = f"postgresql://{db_username}:{db_password}@{db_host}/{db_name}"
engine = create_engine(engine_str) # Membuat koneksi ke database
return engine
Koneksi ke database diatur melalui fungsi db_source_sales_engine(), yang membangun string koneksi dengan parameter seperti nama pengguna, kata sandi, host, dan nama database. Setelah data berhasil diambil menggunakan library pandas, data disimpan dalam file output extracted_sales_data.csv.
Extract Data dari Database
11
Extract Data
Setelah membuat fungsi db_source_sales_engine(), dilanjutkan membuat class ExtractDatabaseSalesData. Class tersebut menggunakan framework Luigi. Dimana alur kerjanya ada requires(), output(), dan run().
class ExtractDatabaseSalesData(luigi.Task):
def requires(self):
pass # Tidak ada task yang diperlukan
def output(self):
# Menyimpan data yang diekstrak ke file CSV
return luigi.LocalTarget('.../raw-data/extracted_sales_data.csv')
def run(self):
# Menghubungkan ke database
engine = db_source_sales_engine()
# Query untuk mengambil data dari tabel amazon_sales_data
query = 'SELECT * FROM amazon_sales_data'
# Mengambil data dari database menggunakan query SQL
db_data = pd.read_sql(query, engine)
# Menyimpan data yang diekstrak ke file CSV
db_data.to_csv(self.output().path, index = False)
Extract Data dari Database
12
Extract Data
Kemudian, kita juga perlu tahu struktur html Lazada:
Extract Data
dari Web Scraping
Dalam melakukan Web Scraping, kita perlu mengetahui struktur html yang akan kita ambil datanya. Dalam project ini, web yang digunakan adalah Tokopedia dan Lazada.
Berikut adalah struktur html Tokopedia:
Ternyata, struktur html Tokopedia dan Lazada berbeda, maka dari itu kita perlu membuat dua class untuk mengambil masing-masing data. Class yang digunakan adalah ExtractTokpedTorchData dan ExtractLazadaTorchData.
Silahkan cek di sini untuk melihat full script python.
13
Transform Data
Transform
Data
Setelah mendapatkan data yang diperlukan untuk masing-masing tim. Kita perlu mengecek apakah data tersebut mempunyai missing values atau duplicate values. Berdasarkan hasil dari script python validate_data.py, hasil ini menunjukkan bahwa semua data yang diekstrak mempunyai missing values, duplicate values, dan juga format yang berbeda-beda.
Oleh sebab itu, kita perlu melakukan transformasi data supaya data dapat digunakan dan dianalisis. Karena setiap data mempunyai struktur yang berbeda, saya menggunakan class yang berbeda-beda untuk setiap data nya. Untuk data sales saya menggunakan class TransformSalesData, kemudian untuk data marketing menggunakan class TransformMarketingData, terakhir untuk data scraping menggunakan class TransformTorchData.
Setiap class mempunyai function yang berbeda-beda tergantung dari kebutuhan datanya. Namun, setiap class tersebut tetap menggunakan framework Luigi supaya memudahkan alur pengerjaan dan tidak terjadi adanya redundant data.
Silahkan cek di sini untuk melihat full script python.
14
Load Data
Load
Data
Akhirnya ke bagian terakhir proses ETL, yaitu load data. Proses ini yang akan memuat data yang sudah diubah (transform data) ke tujuan baru atau database masing-masing tim. Sehingga saat tim membutuhkan data untuk dianalisis, tim dapat mengaksesnya melalui database tanpa perlu melakukan transformasi.
Proses ini sangat efisien dan efektif, memungkinkan pengambilan keputusan yang lebih cerdas dan tepat. Untuk melakukan load data ini memerlukan koneksi ke database PostgreSQL.
Silahkan cek di sini untuk melihat full script python.
# Membuat koneksi ke database PostgreSQL
def postgres_engine():
db_username = 'postgres' # Nama pengguna database
db_password = 'qwerty123' # Kata sandi database
db_host = 'localhost:5432' # Host database
db_name = 'de_project_pacmann' # Nama database
# Membuat string koneksi untuk database PostgreSQL
engine_str = f"postgresql://{db_username}:{db_password}@{db_host}/{db_name}"
engine = create_engine(engine_str) # Membuat engine database
return engine # Mengembalikan engine database
Kemudian setelah membuat koneksi PostgreSQL, saatnya melakukan upload data ke database tersebut. Proses ini menggunakan class LoadData.
15
Load Data
Load
Data
Data Marketing Clean:
Data Sales Clean:
Data Torch Clean:
Tokopedia
Lazada
16
Load Data
Load
Data
Jika kita ingin menjalankan pipeline yang sudah dibuat setiap waktu tertentu atau terjadwal, maka solusinya adalah menggunakan crontab. Crontab adalah salah satu tools yang disediakan OS berbasis UNIX untuk menjalankan task yang membutuhkan schedule.
Untuk membuat schedule menggunakan cron, kita perlu mengubah python script menjadi shell script. Lalu, buka WSL dan masukkan command crontab-e pada terminal WSL.
Setelah itu, isi crontab editor menggunakan format penjadwalan crontab. Berikut format penjadwalan yang saya lakukan.
Arti dari format penjadwalan tersebut adalah file run_etl.sh akan melakukan backup data setiap 2 menit sekali setiap hari nya. Dan hasil nya akan tersimpan dalam sebuah logfile.
# m h dom mon dow command
2 * * * * run_etl.sh
Together, we make data work.
Zulfa Nurfajar
Bandung, Indonesia
Tel. +62 851 5783 1150
17
Zulfa Nurfajar
CONTACT