1 of 17

Extract, Transform, Load

Pipeline

Project Data Engineer

by Zulfa Nurfajar

2 of 17

CASE STUDIES

SOLUTIONS

CONTACT

01

02

03

2

List of Contents

3 of 17

3

CASE STUDIES

Case Studies

4 of 17

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 of 17

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 of 17

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 of 17

7

Zulfa Nurfajar

SOLUTIONS

8 of 17

8

Extract Data

Designing ETL Pipelines

Data Engineer Solution:

  • Membuat ETL Pipeline Design:
    • Extract
      • CSV data
      • Docker
      • Web scraping
    • Transform
      • Cleaning data
      • Change data type
    • Load
      • Database PostgreSQL
      • Scheduling
  • Tools: Python, Pandas, Luigi, Database, SQL, Docker, Crontab

Extract Data

Transform Data

Load Data

9 of 17

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 of 17

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 of 17

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 of 17

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 of 17

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 of 17

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 of 17

15

Load Data

Load

Data

Data Marketing Clean:

Data Sales Clean:

Data Torch Clean:

Tokopedia

Lazada

16 of 17

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

17 of 17

Together, we make data work.

Zulfa Nurfajar

Bandung, Indonesia

Tel. +62 851 5783 1150

zulfaa.nurfajar@gmail.com

linkedin.com/in/zulfanurfajar/

17

Zulfa Nurfajar

CONTACT