import uvicorn
import pandas as pd
from typing import Union
from fastapi import FastAPI, Query
import joblib
from enum import Enum
from fastapi.responses import HTMLResponse
description = """
Welcome to the GetAround Car Value Prediction API. This app provides an endpoint to predict car values based on various features! Try it out 🕹️
## Machine Learning
This section includes a Machine Learning endpoint that predicts car values based on various features. Here is the endpoint:
* `/predict`: **POST** request that accepts a list of car features and returns a predicted car value.
Check out the documentation below 👇 for more information on each endpoint.
"""
tags_metadata = [
{
"name": "Machine Learning",
"description": "Endpoint for predicting car values based on provided features."
}
]
app = FastAPI(
title="🚗 GetAround Car Value Prediction API",
description=description,
version="0.1",
contact={
"name": "Antoine VERDON",
"email": "antoineverdon.pro@gmail.com",
},
openapi_tags=tags_metadata
)
class CarBrand(str, Enum):
citroen = "Citroën"
peugeot = "Peugeot"
pgo = "PGO"
renault = "Renault"
audi = "Audi"
bmw = "BMW"
other = "other"
mercedes = "Mercedes"
opel = "Opel"
volkswagen = "Volkswagen"
ferrari = "Ferrari"
maserati = "Maserati"
mitsubishi = "Mitsubishi"
nissan = "Nissan"
seat = "SEAT"
subaru = "Subaru"
toyota = "Toyota"
class FuelType(str, Enum):
diesel = "diesel"
petrol = "petrol"
hybrid_petrol = "hybrid_petrol"
electro = "electro"
class PaintColor(str, Enum):
black = "black"
grey = "grey"
white = "white"
red = "red"
silver = "silver"
blue = "blue"
orange = "orange"
beige = "beige"
brown = "brown"
green = "green"
class CarType(str, Enum):
convertible = "convertible"
coupe = "coupe"
estate = "estate"
hatchback = "hatchback"
sedan = "sedan"
subcompact = "subcompact"
suv = "suv"
van = "van"
@app.get("/", response_class=HTMLResponse, tags=["Introduction Endpoints"])
async def index():
return (
"Hello world! This `/` is the most simple and default endpoint. "
"If you want to learn more, check out documentation of the API at "
"/docs or "
"external docs."
)
@app.post("/predict", tags=["Machine Learning"])
async def predict(
brand: CarBrand,
mileage: int = Query(...),
engine_power: int = Query(...),
fuel: FuelType = Query(...),
paint_color: PaintColor = Query(...),
car_type: CarType = Query(...),
private_parking_available: bool = Query(...),
has_gps: bool = Query(...),
has_air_conditioning: bool = Query(...),
automatic_car: bool = Query(...),
has_getaround_connect: bool = Query(...),
has_speed_regulator: bool = Query(...),
winter_tires: bool = Query(...)
):
car_data_dict = {
'model_key': [brand],
'mileage': [mileage],
'engine_power': [engine_power],
'fuel': [fuel],
'paint_color': [paint_color],
'car_type': [car_type],
'private_parking_available': [private_parking_available],
'has_gps': [has_gps],
'has_air_conditioning': [has_air_conditioning],
'automatic_car': [automatic_car],
'has_getaround_connect': [has_getaround_connect],
'has_speed_regulator': [has_speed_regulator],
'winter_tires': [winter_tires]
}
car_data = pd.DataFrame(car_data_dict)
model = joblib.load('best_model_XGBoost.pkl')
prediction = model.predict(car_data)
response = {"prediction": prediction.tolist()[0]}
return response
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=4000)