Pada proyek akhir ini, peserta diminta untuk membangun dan mengimplementasikan pipeline ETL (Extract, Transform, Load) sebagai solusi otomasi pengolahan data. Pipeline ini dirancang untuk mengekstraksi data produk fashion secara langsung dari situs web Fashion Studio Dicoding, kemudian melakukan proses pembersihan dan transformasi data agar sesuai dengan kebutuhan analisis, serta memuat data akhir ke dalam tiga media penyimpanan yang berbeda, yaitu: Flat-file CSV untuk penyimpanan lokal, basis data PostgreSQL untuk pengelolaan terstruktur, dan Google Spreadsheet untuk kebutuhan kolaborasi dan akses cloud.
Proyek ini bertujuan untuk memberikan pemahaman menyeluruh tentang proses ETL serta praktik implementasinya dalam skenario nyata yang berkaitan dengan data web.
Mengambil data HTML produk fashion dari website menggunakan requests dan BeautifulSoup.
Membersihkan dan mengubah data:
- Kolom
Pricedikonversi menjadi float dalam mata uang Rupiah (kurs: Rp16.000). - Kolom
Ratingdiubah menjadi float, menghilangkan nilai seperti "Invalid Rating" atau "4.8 / 5". - Kolom
Colorsdikonversi ke integer (contoh: "3 Colors" →3). - Kolom
Sizedisederhanakan menjadi ukuran saja (tanpa teks "Size: "). - Kolom
Genderdisederhanakan menjadi jenis kelamin saja (tanpa teks "Gender: "). - Menambahkan kolom baru bernama
timestampyang menginformasikan waktu tahapan ekstraksi (web scraping).
- Menyimpan hasil transformasi ke file CSV lokal.
- Menyimpan ke PostgreSQL database.
- Menyimpan ke Google Spreadsheet (dengan integrasi Google Sheets API).
├── screenshoot
│ ├── PostgreSql.png
│ ├── spreadsheet.png
│ └── TerimalVscode.png
├── tests
│ ├── test_extract.py
│ ├── test_transform.py
│ └── test_load.py
├── utils
│ ├── extract.py
│ ├── transform.py
│ └── load.py
├── main.py
├── requirements.txt
├── submission.txt
├── products.csv
└── README.md
- Python 3.9.13
- BeautifulSoup
- Pandas
- SQLAlchemy
- Google Sheets API
- PostgreSQL
- Pytest, Pytest-Cov
- File CSV:
fashion_data.csv - PostgreSQL: Database
fashion_db, Tabelfashion_products - Google Spreadsheet: Link Spreadsheet
Memulai proses ekstraksi data...
Scraping halaman: https://fashion-studio.dicoding.dev/
.....
Scraping halaman: https://fashion-studio.dicoding.dev/page50
Ekstraksi selesai. Jumlah data: 1000
=======Informasi Data Sebelum Transformasi:=======
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Title 1000 non-null object
1 Price 1000 non-null object
2 Rating 1000 non-null object
3 Colors 1000 non-null object
4 Size 1000 non-null object
5 Gender 1000 non-null object
6 Timestamp 1000 non-null datetime64[ns]
dtypes: datetime64[ns](1), object(6)
memory usage: 54.8+ KB
None
=======Data Head Sebelum Transformasi:=======
Title Price Rating Colors Size Gender Timestamp
0 Unknown Product $100.00 Invalid Rating 5 M Men 2025-05-12 21:55:46.510667
1 T-shirt 2 $102.15 ⭐ 3.9 3 M Women 2025-05-12 21:55:46.510667
2 Hoodie 3 $496.88 ⭐ 4.8 3 L Unisex 2025-05-12 21:55:46.510667
3 Pants 4 $467.31 ⭐ 3.3 3 XL Men 2025-05-12 21:55:46.510667
4 Outerwear 5 $321.59 ⭐ 3.5 3 XXL Women 2025-05-12 21:55:46.510667
Memulai proses transformasi data...
Transformasi selesai. Jumlah data setelah dibersihkan: 867
=======Informasi Data Setelah Transformasi:=======
<class 'pandas.core.frame.DataFrame'>
Index: 867 entries, 1 to 999
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Title 867 non-null object
1 Price 867 non-null float64
2 Rating 867 non-null float64
3 Colors 867 non-null int64
4 Size 867 non-null object
5 Gender 867 non-null object
6 Timestamp 867 non-null object
dtypes: float64(2), int64(1), object(4)
memory usage: 54.2+ KB
None
=======Data Head Setelah Transformasi:=======
Title Price Rating Colors Size Gender Timestamp
1 T-shirt 2 1634400.0 3.9 3 M Women 2025-05-12T21:55:46.510667
2 Hoodie 3 7950080.0 4.8 3 L Unisex 2025-05-12T21:55:46.510667
3 Pants 4 7476960.0 3.3 3 XL Men 2025-05-12T21:55:46.510667
4 Outerwear 5 5145440.0 3.5 3 XXL Women 2025-05-12T21:55:46.510667
5 Jacket 6 2453920.0 3.3 3 S Unisex 2025-05-12T21:55:46.511666
Memulai proses load data ke storage (CSV, PostgreSQL, Google Sheets)...
[Flatfile-.CSV] Data berhasil disimpan ke fashion_data.csv
[PostgreSQL] Data berhasil disimpan ke tabel fashion_products.
[Google Sheets] Data berhasil disimpan ke Spreadsheets(Pemrosesan Data Fashion).
Proses ETL selesai dengan sukses.
Test coverage untuk folder tests/pengujian berada pada 95%.
File statements missing excluded coverage
--------------------------------------------------------------------
tests\test_extract.py 104 1 0 99%
tests\test_load.py 63 0 0 100%
tests\test_transform.py 27 0 0 100%
utils\extract.py 67 13 0 81%
utils\load.py 32 0 0 100%
utils\transform.py 17 0 0 100%
--------------------------------------------------------------------
Total 310 14 0 95%
-----------------------------------------------------
coverage.py v7.8.0, created at 2025-05-12 22:01 +0700
- Clone repositori ini atau unduh sebagai ZIP:
git clone https://github.com/maxwellmassie/submission-prada.git
- Membuat Virtual Environment:
python -m venv .env
- Mengaktifkan Virtual Environment:
- Windows:
.env\Scripts\activate
- Windows:
- Menginstall Dependencies:
pip install -r requirements.txt
- Konfigurasi PostgreSQL pada
utils/load.py: Sesuaikan konfigurasi database PostgreSQL Anda:db_name: str = 'fashion_db' user: str = 'xxxxxxxx' password: str = 'xxxxxxxxx'
-
Jalankan Proses ETL:
python main.py
-
Menjalankan Unit Test:
python -m pytest tests
-
Menjalankan Test Coverage:
python -m pytest tests -v --cov --cov-report=html
Terima kasih telah membaca dokumentasi ini🙏
Salam hangat, Maxwell Massie