Spaces:
Sleeping
Sleeping
from fastapi import FastAPI, HTTPException | |
from fastapi.middleware.cors import CORSMiddleware | |
from pydantic import BaseModel | |
import pandas as pd | |
import pickle # Import the pickle module | |
app = FastAPI() | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], # You can replace "*" with your frontend's URL | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
df_1 = pd.read_csv("first_telc.csv") | |
# Define the input data model | |
class InputData(BaseModel): | |
SeniorCitizen: int | |
MonthlyCharges: float | |
TotalCharges: float | |
gender: str | |
Partner: str | |
Dependents: str | |
PhoneService: str | |
MultipleLines: str | |
InternetService: str | |
OnlineSecurity: str | |
OnlineBackup: str | |
DeviceProtection: str | |
TechSupport: str | |
StreamingTV: str | |
StreamingMovies: str | |
Contract: str | |
PaperlessBilling: str | |
PaymentMethod: str | |
tenure: int | |
model = pickle.load(open("model.sav", "rb")) | |
# Endpoint to make predictions | |
async def predict_churn(data: InputData): | |
# Transform the input data into a DataFrame | |
data_list = [[data.SeniorCitizen, data.MonthlyCharges, data.TotalCharges, data.gender, data.Partner, | |
data.Dependents, data.PhoneService, data.MultipleLines, data.InternetService, | |
data.OnlineSecurity, data.OnlineBackup, data.DeviceProtection, data.TechSupport, | |
data.StreamingTV, data.StreamingMovies, data.Contract, data.PaperlessBilling, | |
data.PaymentMethod, data.tenure]] | |
new_df = pd.DataFrame(data_list, columns=['SeniorCitizen', 'MonthlyCharges', 'TotalCharges', 'gender', | |
'Partner', 'Dependents', 'PhoneService', 'MultipleLines', | |
'InternetService', | |
'OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport', | |
'StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling', | |
'PaymentMethod', 'tenure']) | |
df_2 = pd.concat([df_1, new_df], ignore_index=True) | |
# Group the tenure in bins of 12 months | |
labels = ["{0} - {1}".format(i, i + 11) for i in range(1, 72, 12)] | |
df_2['tenure_group'] = pd.cut(df_2.tenure.astype(int), range(1, 80, 12), right=False, labels=labels) | |
# Drop column 'tenure' | |
df_2.drop(columns=['tenure'], axis=1, inplace=True) | |
new_df_dummies = pd.get_dummies(df_2[['gender', 'SeniorCitizen', 'Partner', 'Dependents', 'PhoneService', | |
'MultipleLines', 'InternetService', 'OnlineSecurity', 'OnlineBackup', | |
'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies', | |
'Contract', 'PaperlessBilling', 'PaymentMethod', 'tenure_group']]) | |
# Make predictions | |
prediction = model.predict(new_df_dummies.tail(1)) | |
probability = model.predict_proba(new_df_dummies.tail(1))[:, 1] | |
if prediction == 1: | |
result = {"output_1": "This customer is likely to be churned!!", "output_2": f"Confidence: {probability * 100}"} | |
else: | |
result = {"output_1": "This customer is likely to continue!!", "output_2": f"Confidence: {probability * 100}"} | |
return result | |