income_FastAPI / main.py
Faith-theAnalyst's picture
Add application file
82bd30a
raw
history blame
2.83 kB
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('./SRC/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)