Hite1 commited on
Commit
03e39f5
·
verified ·
1 Parent(s): 1af38b5

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +255 -0
app.py ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ import pickle
4
+ import os
5
+ import sqlite3
6
+
7
+
8
+ def create_database():
9
+ # Connecting to the SQLite database
10
+ conn = sqlite3.connect('churndatabase.db')
11
+ cursor = conn.cursor()
12
+
13
+ # Create customer_churn table
14
+ cursor.execute("""
15
+ CREATE TABLE customer_churn (
16
+ customer_id INT PRIMARY KEY,
17
+ gender VARCHAR(10),
18
+ age INT,
19
+ marital_status VARCHAR(10),
20
+ dependents INT,
21
+ contract_type VARCHAR(10),
22
+ internet_service VARCHAR(20),
23
+ phone_service VARCHAR(3),
24
+ multiple_lines VARCHAR(3),
25
+ online_security VARCHAR(3),
26
+ online_backup VARCHAR(3),
27
+ device_protection VARCHAR(3),
28
+ tech_support VARCHAR(3),
29
+ streaming_tv VARCHAR(3),
30
+ streaming_movies VARCHAR(3),
31
+ monthly_charges NUMBER(8, 2),
32
+ total_charges NUMBER(10, 2),
33
+ churn_status VARCHAR(3)
34
+ )
35
+ """)
36
+
37
+ # Create customer_churn_full table
38
+ cursor.execute("""
39
+ CREATE TABLE customer_churn_full (
40
+ customer_id INT PRIMARY KEY,
41
+ gender VARCHAR(10),
42
+ age INT,
43
+ marital_status VARCHAR(10),
44
+ dependents INT,
45
+ contract_type VARCHAR(10),
46
+ internet_service VARCHAR(20),
47
+ phone_service VARCHAR(3),
48
+ multiple_lines VARCHAR(3),
49
+ online_security VARCHAR(3),
50
+ online_backup VARCHAR(3),
51
+ device_protection VARCHAR(3),
52
+ tech_support VARCHAR(3),
53
+ streaming_tv VARCHAR(3),
54
+ streaming_movies VARCHAR(3),
55
+ monthly_charges NUMBER(8, 2),
56
+ total_charges NUMBER(10, 2),
57
+ churn_status VARCHAR(3),
58
+ call_duration_minutes INT,
59
+ latitude NUMBER(9, 6),
60
+ longitude NUMBER(9, 6)
61
+ )
62
+ """)
63
+
64
+ # Insert data into customer_churn table
65
+ cursor.execute("""
66
+ INSERT INTO customer_churn
67
+ SELECT
68
+ TRUNC(RANDOM() * 1000000) AS customer_id,
69
+ CASE WHEN RANDOM() < 0.5 THEN 'Male' ELSE 'Female' END AS gender,
70
+ TRUNC(RANDOM() * 60 + 18) AS age,
71
+ CASE WHEN RANDOM() < 0.5 THEN 'Married' ELSE 'Single' END AS marital_status,
72
+ TRUNC(RANDOM() * 5) AS dependents,
73
+ CASE WHEN RANDOM() < 0.5 THEN 'Monthly' ELSE 'Yearly' END AS contract_type,
74
+ CASE WHEN RANDOM() < 0.5 THEN 'DSL' ELSE 'Fiber Optic' END AS internet_service,
75
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS phone_service,
76
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS multiple_lines,
77
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS online_security,
78
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS online_backup,
79
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS device_protection,
80
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS tech_support,
81
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS streaming_tv,
82
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS streaming_movies,
83
+ ROUND(RANDOM() * 100, 2) AS monthly_charges,
84
+ ROUND(RANDOM() * 1000, 2) AS total_charges,
85
+ CASE WHEN RANDOM() < 0.2 THEN 'Yes' ELSE 'No' END AS churn_status
86
+ FROM
87
+ (SELECT 1)
88
+ CROSS JOIN
89
+ (SELECT 1)
90
+ LIMIT
91
+ 500
92
+ """)
93
+
94
+ # Insert data into customer_churn_full table
95
+ cursor.execute("""
96
+ INSERT INTO customer_churn_full
97
+ SELECT
98
+ TRUNC(RANDOM() * 1000000) AS customer_id,
99
+ CASE WHEN RANDOM() < 0.5 THEN 'Male' ELSE 'Female' END AS gender,
100
+ TRUNC(RANDOM() * 60 + 18) AS age,
101
+ CASE WHEN RANDOM() < 0.5 THEN 'Married' ELSE 'Single' END AS marital_status,
102
+ TRUNC(RANDOM() * 5) AS dependents,
103
+ CASE WHEN RANDOM() < 0.5 THEN 'Monthly' ELSE 'Yearly' END AS contract_type,
104
+ CASE WHEN RANDOM() < 0.5 THEN 'DSL' ELSE 'Fiber Optic' END AS internet_service,
105
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS phone_service,
106
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS multiple_lines,
107
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS online_security,
108
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS online_backup,
109
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS device_protection,
110
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS tech_support,
111
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS streaming_tv,
112
+ CASE WHEN RANDOM() < 0.5 THEN 'Yes' ELSE 'No' END AS streaming_movies,
113
+ ROUND(RANDOM() * 100, 2) AS monthly_charges,
114
+ ROUND(RANDOM() * 1000, 2) AS total_charges,
115
+ CASE WHEN RANDOM() < 0.2 THEN 'Yes' ELSE 'No' END AS churn_status,
116
+ TRUNC(RANDOM() * 1200) AS call_duration_minutes,
117
+ ROUND(RANDOM() * 180 - 90, 6) AS latitude,
118
+ ROUND(RANDOM() * 360 - 180, 6) AS longitude
119
+ FROM
120
+ (SELECT 1)
121
+ CROSS JOIN
122
+ (SELECT 1)
123
+ LIMIT
124
+ 500
125
+ """)
126
+
127
+ conn.commit()
128
+ conn.close()
129
+
130
+ create_database()
131
+
132
+ #Loading ML Components
133
+ DIRPATH = os.path.dirname(os.path.realpath(__file__))
134
+ ml_join= os.path.join(DIRPATH,'ml_components.pkl')
135
+ with open(ml_join,"rb") as f:
136
+ loaded_model_components = pickle.load(f)
137
+
138
+ # Extracting ML components
139
+ model = loaded_model_components['model']
140
+ encoder = loaded_model_components['encoder']
141
+ scaler = loaded_model_components['scaler']
142
+
143
+ #To predict churn
144
+ def predict_churn(gender, SeniorCitizen, Partner, Dependents, PhoneService, MultipleLines,
145
+ InternetService, OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport,
146
+ StreamingTV, StreamingMovies, Contract, PaperlessBilling, PaymentMethod,
147
+ tenure, MonthlyCharges, TotalCharges):
148
+
149
+ #Encoding categorical features
150
+ encoded_data = encoder.transform([[gender, SeniorCitizen, Partner, Dependents, PhoneService, MultipleLines,
151
+ InternetService, OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport,
152
+ StreamingTV, StreamingMovies, Contract, PaperlessBilling, PaymentMethod]])
153
+
154
+ num_data = np.array([[tenure, MonthlyCharges, TotalCharges]])
155
+ scaled_num_data = scaler.transform(num_data)
156
+
157
+ combined_data = np.hstack((encoded_data, scaled_num_data))
158
+
159
+ #Making predictions using fitted model
160
+ model_output = model.predict_proba(combined_data)
161
+ prob_churn = float(model_output[0][1])
162
+ return {'Churn Probability': prob_churn}
163
+
164
+ with gr.Blocks(css="""
165
+ background-color: #6db05d;
166
+ padding: 2rem;
167
+ border: 2px solid #e86347;
168
+ }
169
+ .gradio-input {
170
+ border: 1px solid #ccc000;
171
+ padding: 0.5rem;
172
+ border-radius: 0.5rem;
173
+ font-size: 1rem;
174
+ }
175
+ .gradio-label {
176
+ font-weight: bold;
177
+ margin-bottom: 0.5rem;
178
+ }
179
+ .gradio-markdown h1 {
180
+ font-size: 4rem;
181
+ font-family: 'Georgia', serif;
182
+ margin-top: 0;
183
+ margin-bottom: 0.5rem;
184
+ color: white;
185
+ background-color: #1E90FF;
186
+ padding: 1rem;
187
+ border-radius: 0.5rem;
188
+ text-align: center;
189
+ }
190
+ .gradio-markdown h2 {
191
+ font-size: 2rem;
192
+ font-family: 'DejaVu Sans Mono', monospace;
193
+ text-align: center;
194
+ margin-top: 0;
195
+ margin-bottom: 0.5rem;
196
+ color: white;
197
+ background-color: #4169E1;
198
+ padding: 0.5rem 1rem;
199
+ border-radius: 0.5rem;
200
+ }
201
+ .gradio-accordion {
202
+ background-color: #6db05d;
203
+ border-radius: 0.75rem;
204
+ padding: 1rem;
205
+ margin-bottom: 1rem;
206
+ text-align: left;
207
+ }
208
+ """) as test:
209
+
210
+ gr.Markdown("# CHURN PREDICTION")
211
+ gr.Markdown("## Using machine learning and Oracle SQL")
212
+ gr.Markdown("### By Hitesh Beeraka and Yash Singhvi")
213
+ with gr.Row():
214
+ with gr.Column(scale=2):
215
+ with gr.Accordion(label="Personal Information", open=False):
216
+ gender = gr.Radio(choices=['Male', 'Female'], label='Gender', interactive=True)
217
+ SeniorCitizen = gr.Radio(choices=['Yes', 'No'], label='SeniorCitizen', interactive=True)
218
+ Partner = gr.Radio(choices=['Yes', 'No'], label='Partner', interactive=True)
219
+ Dependents = gr.Radio(choices=['Yes', 'No'], label='Dependents', interactive=True)
220
+ with gr.Column(scale=2):
221
+ with gr.Accordion(label="Phone and Internet Services", open=False):
222
+ PhoneService = gr.Radio(choices=['Yes', 'No'], label='PhoneService', interactive=True)
223
+ MultipleLines = gr.Radio(choices=['Yes', 'No'], label='MultipleLines', interactive=True)
224
+ InternetService = gr.Radio(choices=['Fiber optic', 'No', 'DSL'], label='InternetService', interactive=True)
225
+ with gr.Row():
226
+ with gr.Column(scale=2):
227
+ with gr.Accordion(label="Security and Support Services", open=False):
228
+ OnlineSecurity = gr.Radio(choices=['Yes', 'No'], label='OnlineSecurity', interactive=True)
229
+ OnlineBackup = gr.Radio(choices=['Yes', 'No'], label='OnlineBackup', interactive=True)
230
+ DeviceProtection = gr.Radio(choices=['Yes', 'No'], label='DeviceProtection', interactive=True)
231
+ TechSupport = gr.Radio(choices=['Yes', 'No'], label='TechSupport', interactive=True)
232
+ with gr.Column(scale=2):
233
+ with gr.Accordion(label="Entertainment Services", open=False):
234
+ StreamingTV = gr.Radio(choices=['Yes', 'No'], label='StreamingTV', interactive=True)
235
+ StreamingMovies = gr.Radio(choices=['Yes', 'No'], label='StreamingMovies', interactive=True)
236
+ with gr.Row():
237
+ with gr.Column(scale=2):
238
+ with gr.Accordion(label="Contract and Billing Information", open=False):
239
+ Contract = gr.Radio(choices=['Month-to-month', 'One year', 'Two year'], label='Contract', interactive=True)
240
+ PaperlessBilling = gr.Radio(choices=['Yes', 'No'], label='PaperlessBilling', interactive=True)
241
+ PaymentMethod = gr.Radio(choices=['Electronic check', 'Mailed check', 'Credit card (automatic)', 'Bank transfer (automatic)'], label='PaymentMethod', interactive=True)
242
+ with gr.Column(scale=2):
243
+ with gr.Accordion(label="Charges and Tenure", open=False):
244
+ tenure = gr.Number(label='Tenure', interactive=True)
245
+ MonthlyCharges = gr.Number(label='MonthlyCharges', interactive=True)
246
+ TotalCharges = gr.Number(label='TotalCharges', interactive=True)
247
+
248
+ output = gr.Label(label="Churn Probability")
249
+ submit_btn = gr.Button("Predict")
250
+ submit_btn.click(
251
+ fn=predict_churn,
252
+ inputs=[gender, SeniorCitizen, Partner, Dependents, PhoneService, MultipleLines, InternetService, OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport, StreamingTV, StreamingMovies, Contract, PaperlessBilling, PaymentMethod, tenure, MonthlyCharges, TotalCharges],
253
+ outputs=output
254
+ )
255
+ test.launch(inbrowser=True, show_error=True,share=True)