TA/web_JMW/flask_api/README.md

86 lines
2.9 KiB
Markdown

# Flask API Rekomendasi Mobil
API sederhana untuk rekomendasi mobil berdasarkan budget user. API mencari dataset dari urutan berikut:
```txt
CAR_DATASET_PATH
storage/app/dataset_final.csv
database/dataset_final.csv
database/dataset_final.xls
storage/app/dataset_mobil.csv
```
Jika file final kamu bernama `dataset_final.csv`, letakkan di `storage/app/dataset_final.csv` atau `database/dataset_final.csv`.
## Menjalankan API
```bash
cd flask_api
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python app.py
```
API berjalan di:
```txt
http://127.0.0.1:5000
```
## Cek Status
```bash
curl http://127.0.0.1:5000/health
```
## Rekomendasi Sederhana
```bash
curl -X POST http://127.0.0.1:5000/recommend ^
-H "Content-Type: application/json" ^
-d "{\"budget\":200000000,\"limit\":10}"
```
## Rekomendasi Kompleks
Endpoint yang sama juga mendukung preferensi, filter ketat, strategi budget, dan bobot skor:
```bash
curl -X POST http://127.0.0.1:5000/recommend ^
-H "Content-Type: application/json" ^
-d "{\"budget\":200000000,\"limit\":5,\"strategi\":\"premium\",\"preferensi\":{\"kategori\":\"suv\",\"transmisi\":\"automatic\",\"bahan_bakar\":\"bensin\",\"mesin_cc\":1500},\"filter\":{\"tahun_min\":2015},\"bobot\":{\"budget\":0.35,\"preference\":0.35,\"year\":0.2,\"engine\":0.1}}"
```
Field request:
- `budget`: wajib, maksimal budget user.
- `limit`: jumlah rekomendasi, maksimal 50.
- `strategi`: `hemat`, `seimbang`, atau `premium`.
- Gunakan `strategi: "harga_pas"` atau `strategi: "spesifik"` jika ingin hasil paling dekat dengan nominal budget yang dimasukkan.
- `preferensi`: nilai yang disukai, misalnya `merk`, `kategori`, `transmisi`, `bahan_bakar`, `cluster`, atau `mesin_cc`.
- `filter`: syarat wajib, misalnya `tahun_min`, `tahun_max`, `mesin_min`, `mesin_max`, `kategori`, `transmisi`, `bahan_bakar`, `merk`, `cluster`, atau `toleransi_harga_percent`.
- `bobot`: pengaturan bobot skor untuk `budget`, `preference`, `year`, `engine`, dan `cluster`.
- `include_above_budget`: `true` jika ingin tetap menampilkan mobil sedikit di atas budget.
- `max_over_budget_percent`: batas persen di atas budget jika `include_above_budget` aktif.
Response berisi daftar mobil dengan `score`, `score_detail`, `selisih_budget`, `model_cluster`, dan `alasan` agar frontend bisa menjelaskan kenapa mobil tersebut direkomendasikan.
## Integrasi Laravel
Laravel membaca URL Flask dari:
```env
CAR_RECOMMENDATION_API_URL=http://127.0.0.1:5000
CAR_RECOMMENDATION_API_TIMEOUT=3
```
Alur integrasi:
1. User mengisi budget di halaman `/mobil-bekas`.
2. `CategoryController` memanggil `App\Services\CarRecommendationService`.
3. Service mengirim request ke Flask `/recommend`.
4. Flask melatih K-Means dari dataset dengan fitur `harga`, `tahun`, dan `mesin_cc`.
5. Hasil Python dicocokkan kembali ke data `categories` Laravel untuk ditampilkan di card mobil.
6. Jika Flask tidak aktif, Laravel otomatis memakai fallback rekomendasi lokal.