86 lines
2.9 KiB
Markdown
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.
|