abhishekrs4's picture
updated fastapi app script
6e19446
import os
import logging
from typing import Union
import mlflow
import numpy as np
from fastapi import FastAPI
from pydantic import BaseModel
from config import settings
try:
path_mlflow_model = "./model_for_production/"
sklearn_pipeline = mlflow.sklearn.load_model(path_mlflow_model)
except:
path_mlflow_model = "/data/model_for_production/"
sklearn_pipeline = mlflow.sklearn.load_model(path_mlflow_model)
app = FastAPI()
logging.basicConfig(level=logging.INFO)
class WaterPotabilityDataItem(BaseModel):
ph: Union[float, None] = np.nan
Hardness: Union[float, None] = np.nan
Solids: Union[float, None] = np.nan
Chloramines: Union[float, None] = np.nan
Sulfate: Union[float, None] = np.nan
Conductivity: Union[float, None] = np.nan
Organic_carbon: Union[float, None] = np.nan
Trihalomethanes: Union[float, None] = np.nan
Turbidity: Union[float, None] = np.nan
def predict_pipeline(data_sample):
"""
---------
Arguments
---------
data_sample : np.array
a numpy array of shape (num_samples, num_feats)
-------
Returns
-------
pred_sample : np.array
a numpy array of shape (num_samples) with predictions
"""
pred_sample = sklearn_pipeline.predict(data_sample)
return pred_sample
@app.get("/info")
def get_app_info():
"""
-------
Returns
-------
dict_info : dict
a dictionary with info to be sent as a response to get request
"""
dict_info = {"app_name": settings.app_name, "version": settings.version}
return dict_info
@app.post("/predict")
def predict(wpd_item: WaterPotabilityDataItem):
"""
---------
Arguments
---------
wpd_item : object
an object of type WaterPotabilityDataItem
-------
Returns
-------
pred_dict : dict
a dictionary of prediction to be sent as a response to post request
"""
wpd_arr = np.array(
[
wpd_item.ph,
wpd_item.Hardness,
wpd_item.Solids,
wpd_item.Chloramines,
wpd_item.Sulfate,
wpd_item.Conductivity,
wpd_item.Organic_carbon,
wpd_item.Trihalomethanes,
wpd_item.Turbidity,
]
).reshape(1, -1)
logging.info("data sample: %s", wpd_arr)
pred_sample = predict_pipeline(wpd_arr)
logging.info("Potability prediction: %s", pred_sample)
pred_dict = {"Potability": int(pred_sample)}
return pred_dict