income_FastAPI / main.py
Faith-theAnalyst's picture
Modify files
b53e519
from fastapi import FastAPI,HTTPException
from typing import Literal,List
import uvicorn
from pydantic import BaseModel
import pandas as pd
import os
import pickle
# setup
SRC = os.path.abspath('./Assets')
# Load the pipeline using pickle
pipeline_path = os.path.join(SRC, 'pipeline.pkl')
with open(pipeline_path, 'rb') as file:
pipeline = pickle.load(file)
# Load the encoder using pickle
model_path = os.path.join(SRC, 'rfc_model.pkl')
with open(model_path, 'rb') as file:
model = pickle.load(file)
app = FastAPI(
title= 'Income Classification FastAPI',
description='A FastAPI service to classify individuals based on income level using a trained machine learning model.',
version= '1.0.0'
)
class IncomePredictionInput(BaseModel):
age: int
gender: str
education: str
worker_class: str
marital_status: str
race: str
is_hispanic: str
employment_commitment: str
employment_stat: int
wage_per_hour: int
working_week_per_year: int
industry_code: int
industry_code_main: str
occupation_code: int
occupation_code_main: str
total_employed: int
household_summary: str
vet_benefit: int
tax_status: str
gains: int
losses: int
stocks_status: int
citizenship: str
importance_of_record: float
class IncomePredictionOutput(BaseModel):
income_prediction: str
prediction_probability: float
# get
@app.get('/')
def home():
return {
'message': 'Income Classification FastAPI',
'description': 'FastAPI service to classify individuals based on income level.',
'instruction': 'Click here (/docs) to access API documentation and test endpoints.'
}
# post
@app.post('/classify', response_model=IncomePredictionOutput)
def income_classification(income: IncomePredictionInput):
try:
# Convert input data to DataFrame
input_df = pd.DataFrame([dict(income)])
# Preprocess the input data through the pipeline
input_df_transformed = pipeline.transform(input_df)
# Make predictions
prediction = model.predict(input_df_transformed)
probability = model.predict_proba(input_df_transformed).max(axis=1)[0]
prediction_result = "Above Limit" if prediction[0] == 1 else "Below Limit"
return {"income_prediction": prediction_result, "prediction_probability": probability}
except Exception as e:
error_detail = str(e)
raise HTTPException(status_code=500, detail=f"Error during classification: {error_detail}")
if __name__ == '__main__':
uvicorn.run('main:app', reload=True)