Docker_api / src /main.py
Gyimah3's picture
Upload 3 files
dd8bf84
from fastapi import FastAPI
import pickle, uvicorn, os
from pydantic import BaseModel
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.compose import make_column_selector as selector
from sklearn.metrics import accuracy_score
# Config & Setup
## Variables of environment
DIRPATH = os.path.dirname(__file__)
ASSETSDIRPATH = os.path.join(DIRPATH, "asset")
ml_component_pkl = os.path.join(ASSETSDIRPATH, "ml_component.pkl")
print(
f" {'*'*10} Config {'*'*10}\n INFO: DIRPATH = {DIRPATH} \n INFO: ASSETSDIRPATH = {ASSETSDIRPATH} "
)
# API Basic config
app = FastAPI(
title="Titanic Survivors API",
version="0.0.1",
description="Prediction of Titanic Survivors",
)
## Loading of assets
with open(ml_component_pkl, "rb") as f:
loaded_items = pickle.load(f)
#print("INFO: Loaded assets:", loaded_items)
pipeline_of_my_model = loaded_items["pipeline"]
num_cols = loaded_items['numeric_columns']
cat_cols = loaded_items['categorical_columns']
## BaseModel
class ModelInput(BaseModel):
PeopleInTicket: int
Age: float
FarePerPerson: float
SibSp: int
Pclass: int
Fare: float
Parch: int
TicketNumber: float
Embarked: str
Sex: str
## Utils
# def processing_FE(
# dataset, scaler, encoder,imputer, FE=pipeline_of_my_model
# ): # FE : ColumnTransfromer, Pipeline
# "Cleaning, Processing and Feature Engineering of the input dataset."
# """:dataset pandas.DataFrame"""
# # if imputer is not None:
# # output_dataset = imputer.transform(dataset)
# # else:
# # output_dataset = dataset.copy()
# # output_dataset = scaler.transform(output_dataset)
# # if encoder is not None:
# # output_dataset = encoder.transform(output_dataset)
# if FE is not None:
# output_dataset = FE.fit(output_dataset)
# return output_dataset
def make_prediction(
Pclass, Sex, Age, SibSp,Parch, Fare, Embarked, PeopleInTicket, FarePerPerson,TicketNumber
):
df = pd.DataFrame(
[
[
PeopleInTicket,
Age,
FarePerPerson,
SibSp,
Pclass,
Fare,
Parch,
TicketNumber,
Embarked,
Sex,
]
],
columns=num_cols + cat_cols,
)
print(num_cols + cat_cols)
print( [
PeopleInTicket,
Age,
FarePerPerson,
SibSp,
Pclass,
Fare,
Parch,
TicketNumber,
Embarked,
Sex,
])
X = df
#df[cat_cols] = df[cat_cols].astype("object")
output = pipeline_of_my_model.predict(X).tolist()
return output
## Endpoints
@app.post("/Titanic")
async def predict(input: ModelInput):
"""__descr__
--details---
"""
output_pred = make_prediction(
PeopleInTicket =input.PeopleInTicket,
Age =input.Age,
FarePerPerson =input.FarePerPerson,
SibSp =input.SibSp,
Pclass =input.Pclass,
Fare =input.Fare,
Parch =input.Parch,
TicketNumber =input.TicketNumber,
Embarked =input.Embarked,
Sex=input.Sex,
)
# Labelling Model output
if output_pred == 0:
output_pred = "No,the person didn't survive"
else:
output_pred = "Yes,the person survived"
#return output_pred
return {
"prediction": output_pred,
"input": input
}
# Execution
if __name__ == "__main__":
uvicorn.run(
"main:app",
reload=True,
)