| 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 |
|
|