import gradio as gr import numpy as np import pickle import os import sqlite3 def create_database(): # Connecting to the SQLite database conn = sqlite3.connect('churndatabase.db') cursor = conn.cursor() # Create customer_churn table cursor.execute(""" CREATE TABLE customer_churn ( customer_id INT PRIMARY KEY, gender VARCHAR(10), age INT, marital_status VARCHAR(10), dependents INT, contract_type VARCHAR(10), internet_service VARCHAR(20), phone_service VARCHAR(3), multiple_lines VARCHAR(3), online_security VARCHAR(3), online_backup VARCHAR(3), device_protection VARCHAR(3), tech_support VARCHAR(3), streaming_tv VARCHAR(3), streaming_movies VARCHAR(3), monthly_charges NUMBER(8, 2), total_charges NUMBER(10, 2), churn_status VARCHAR(3) ) """) # Create customer_churn_full table cursor.execute(""" CREATE TABLE customer_churn_full ( customer_id INT PRIMARY KEY, gender VARCHAR(10), age INT, marital_status VARCHAR(10), dependents INT, contract_type VARCHAR(10), internet_service VARCHAR(20), phone_service VARCHAR(3), multiple_lines VARCHAR(3), online_security VARCHAR(3), online_backup VARCHAR(3), device_protection VARCHAR(3), tech_support VARCHAR(3), streaming_tv VARCHAR(3), streaming_movies VARCHAR(3), monthly_charges NUMBER(8, 2), total_charges NUMBER(10, 2), churn_status VARCHAR(3), call_duration_minutes INT, latitude NUMBER(9, 6), longitude NUMBER(9, 6) ) """) # Insert data into customer_churn table cursor.execute(""" INSERT INTO customer_churn SELECT TRUNC(RANDOM() * 1000000) AS customer_id, CASE WHEN RANDOM() < 0.5 THEN 'Male' ELSE 'Female' END AS gender, TRUNC(RANDOM() * 60 + 18) AS age, CASE WHEN RANDOM() < 0.5 THEN 'Married' ELSE 'Single' END AS marital_status, TRUNC(RANDOM() * 5) AS dependents, CASE WHEN RANDOM() < 0.5 THEN 'Monthly' ELSE 'Yearly' END AS contract_type, CASE WHEN RANDOM() < 0.5 THEN 'DSL' ELSE 'Fiber Optic' END AS internet_service, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS phone_service, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS multiple_lines, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS online_security, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS online_backup, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS device_protection, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS tech_support, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS streaming_tv, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS streaming_movies, ROUND(RANDOM() * 100, 2) AS monthly_charges, ROUND(RANDOM() * 1000, 2) AS total_charges, CASE WHEN RANDOM() < 0.2 THEN 'Yes' ELSE 'No' END AS churn_status FROM (SELECT 1) CROSS JOIN (SELECT 1) LIMIT 500 """) # Insert data into customer_churn_full table cursor.execute(""" INSERT INTO customer_churn_full SELECT TRUNC(RANDOM() * 1000000) AS customer_id, CASE WHEN RANDOM() < 0.5 THEN 'Male' ELSE 'Female' END AS gender, TRUNC(RANDOM() * 60 + 18) AS age, CASE WHEN RANDOM() < 0.5 THEN 'Married' ELSE 'Single' END AS marital_status, TRUNC(RANDOM() * 5) AS dependents, CASE WHEN RANDOM() < 0.5 THEN 'Monthly' ELSE 'Yearly' END AS contract_type, CASE WHEN RANDOM() < 0.5 THEN 'DSL' ELSE 'Fiber Optic' END AS internet_service, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS phone_service, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS multiple_lines, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS online_security, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS online_backup, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS device_protection, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS tech_support, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS streaming_tv, CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS streaming_movies, ROUND(RANDOM() * 100, 2) AS monthly_charges, ROUND(RANDOM() * 1000, 2) AS total_charges, CASE WHEN RANDOM() < 0.2 THEN 'Yes' ELSE 'No' END AS churn_status, TRUNC(RANDOM() * 1200) AS call_duration_minutes, ROUND(RANDOM() * 180 - 90, 6) AS latitude, ROUND(RANDOM() * 360 - 180, 6) AS longitude FROM (SELECT 1) CROSS JOIN (SELECT 1) LIMIT 500 """) conn.commit() conn.close() create_database() #Loading ML Components DIRPATH = os.path.dirname(os.path.realpath(__file__)) ml_join= os.path.join(DIRPATH,'ml_components.pkl') with open(ml_join,"rb") as f: loaded_model_components = pickle.load(f) # Extracting ML components model = loaded_model_components['model'] encoder = loaded_model_components['encoder'] scaler = loaded_model_components['scaler'] #To predict churn def predict_churn(gender, SeniorCitizen, Partner, Dependents, PhoneService, MultipleLines, InternetService, OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport, StreamingTV, StreamingMovies, Contract, PaperlessBilling, PaymentMethod, tenure, MonthlyCharges, TotalCharges): #Encoding categorical features encoded_data = encoder.transform([[gender, SeniorCitizen, Partner, Dependents, PhoneService, MultipleLines, InternetService, OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport, StreamingTV, StreamingMovies, Contract, PaperlessBilling, PaymentMethod]]) num_data = np.array([[tenure, MonthlyCharges, TotalCharges]]) scaled_num_data = scaler.transform(num_data) combined_data = np.hstack((encoded_data, scaled_num_data)) #Making predictions using fitted model model_output = model.predict_proba(combined_data) prob_churn = float(model_output[0][1]) return {'Churn Probability': prob_churn} with gr.Blocks(css=""" background-color: #6db05d; padding: 2rem; border: 2px solid #e86347; } .gradio-input { border: 1px solid #ccc000; padding: 0.5rem; border-radius: 0.5rem; font-size: 1rem; } .gradio-label { font-weight: bold; margin-bottom: 0.5rem; } .gradio-markdown h1 { font-size: 4rem; font-family: 'Georgia', serif; margin-top: 0; margin-bottom: 0.5rem; color: white; background-color: #1E90FF; padding: 1rem; border-radius: 0.5rem; text-align: center; } .gradio-markdown h2 { font-size: 2rem; font-family: 'DejaVu Sans Mono', monospace; text-align: center; margin-top: 0; margin-bottom: 0.5rem; color: white; background-color: #4169E1; padding: 0.5rem 1rem; border-radius: 0.5rem; } .gradio-accordion { background-color: #6db05d; border-radius: 0.75rem; padding: 1rem; margin-bottom: 1rem; text-align: left; } """) as test: gr.Markdown("# CHURN PREDICTION") gr.Markdown("## Using machine learning and Oracle SQL") gr.Markdown("### By Hitesh Beeraka and Yash Singhvi") with gr.Row(): with gr.Column(scale=2): with gr.Accordion(label="Personal Information", open=False): gender = gr.Radio(choices=['Male', 'Female'], label='Gender', interactive=True) SeniorCitizen = gr.Radio(choices=['Yes', 'No'], label='SeniorCitizen', interactive=True) Partner = gr.Radio(choices=['Yes', 'No'], label='Partner', interactive=True) Dependents = gr.Radio(choices=['Yes', 'No'], label='Dependents', interactive=True) with gr.Column(scale=2): with gr.Accordion(label="Phone and Internet Services", open=False): PhoneService = gr.Radio(choices=['Yes', 'No'], label='PhoneService', interactive=True) MultipleLines = gr.Radio(choices=['Yes', 'No'], label='MultipleLines', interactive=True) InternetService = gr.Radio(choices=['Fiber optic', 'No', 'DSL'], label='InternetService', interactive=True) with gr.Row(): with gr.Column(scale=2): with gr.Accordion(label="Security and Support Services", open=False): OnlineSecurity = gr.Radio(choices=['Yes', 'No'], label='OnlineSecurity', interactive=True) OnlineBackup = gr.Radio(choices=['Yes', 'No'], label='OnlineBackup', interactive=True) DeviceProtection = gr.Radio(choices=['Yes', 'No'], label='DeviceProtection', interactive=True) TechSupport = gr.Radio(choices=['Yes', 'No'], label='TechSupport', interactive=True) with gr.Column(scale=2): with gr.Accordion(label="Entertainment Services", open=False): StreamingTV = gr.Radio(choices=['Yes', 'No'], label='StreamingTV', interactive=True) StreamingMovies = gr.Radio(choices=['Yes', 'No'], label='StreamingMovies', interactive=True) with gr.Row(): with gr.Column(scale=2): with gr.Accordion(label="Contract and Billing Information", open=False): Contract = gr.Radio(choices=['Month-to-month', 'One year', 'Two year'], label='Contract', interactive=True) PaperlessBilling = gr.Radio(choices=['Yes', 'No'], label='PaperlessBilling', interactive=True) PaymentMethod = gr.Radio(choices=['Electronic check', 'Mailed check', 'Credit card (automatic)', 'Bank transfer (automatic)'], label='PaymentMethod', interactive=True) with gr.Column(scale=2): with gr.Accordion(label="Charges and Tenure", open=False): tenure = gr.Number(label='Tenure', interactive=True) MonthlyCharges = gr.Number(label='MonthlyCharges', interactive=True) TotalCharges = gr.Number(label='TotalCharges', interactive=True) output = gr.Label(label="Churn Probability") submit_btn = gr.Button("Predict") submit_btn.click( fn=predict_churn, inputs=[gender, SeniorCitizen, Partner, Dependents, PhoneService, MultipleLines, InternetService, OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport, StreamingTV, StreamingMovies, Contract, PaperlessBilling, PaymentMethod, tenure, MonthlyCharges, TotalCharges], outputs=output ) test.launch(inbrowser=True, show_error=True,share=True)