import uvicorn
import pandas as pd
from pydantic import BaseModel
from typing import List, Union
from fastapi import FastAPI
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 PredictionFeatures(BaseModel):
brand: CarBrand
mileage: int
engine_power: int
fuel: str
paint_color: str
car_type: str
private_parking_available: bool
has_gps: bool
has_air_conditioning: bool
automatic_car: bool
has_getaround_connect: bool
has_speed_regulator: bool
winter_tires: bool
@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(predictionFeatures: PredictionFeatures):
columns = [
'brand', 'mileage', 'engine_power', 'fuel', 'paint_color',
'car_type', 'private_parking_available', 'has_gps',
'has_air_conditioning', 'automatic_car', 'has_getaround_connect',
'has_speed_regulator', 'winter_tires'
]
car_data_dict = {col: [getattr(predictionFeatures, col)] for col in columns}
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)