|
from fastapi import FastAPI, HTTPException |
|
from fastapi.middleware.cors import CORSMiddleware |
|
from pydantic import BaseModel |
|
import pandas as pd |
|
import pickle |
|
|
|
app = FastAPI() |
|
|
|
app.add_middleware( |
|
CORSMiddleware, |
|
allow_origins=["*"], |
|
allow_credentials=True, |
|
allow_methods=["*"], |
|
allow_headers=["*"], |
|
) |
|
|
|
|
|
df_1 = pd.read_csv("first_telc.csv") |
|
|
|
|
|
|
|
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")) |
|
|
|
|
|
|
|
@app.post("/predict") |
|
async def predict_churn(data: InputData): |
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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']]) |
|
|
|
|
|
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 |
|
|