File size: 5,605 Bytes
f31f205
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import pandas as pd
import streamlit as st
import numpy as np
from matplotlib import pyplot as plt
import pickle
import sklearn
import joblib
from PIL import Image
import base64
from transformers import pipeline
import datetime
from huggingface_hub import hf_hub_download

REPO_ID = "AlbieCofie/predict-customer-churn"
access_token = st.secrets["HF_TOKEN"]

cat_imputer = joblib.load(
    hf_hub_download(repo_id=REPO_ID, filename="categorical_imputer.joblib", token=access_token, repo_type="model")
)

encoder = joblib.load(
    hf_hub_download(repo_id=REPO_ID, filename="encoder.joblib", token=access_token, repo_type="model")
)

num_imputer = joblib.load(
    hf_hub_download(repo_id=REPO_ID, filename="numerical_imputer.joblib", token=access_token, repo_type="model")
)

scaler = joblib.load(
    hf_hub_download(repo_id=REPO_ID, filename="scaler.joblib", token=access_token, repo_type="model")
)

model = joblib.load(
    hf_hub_download(repo_id=REPO_ID, filename="Final_model.joblib", token=access_token, repo_type="model")
)

# Add a title and subtitle
st.write("<center><h1>Sales Prediction App</h1></center>", unsafe_allow_html=True)

# Set up the layout
col1, col2, col3 = st.columns([1, 3, 3])


#st.image("https://www.example.com/logo.png", width=200)
# Add a subtitle or description
st.write("This app uses machine learning to predict sales based on certain input parameters. Simply enter the required information and click 'Predict' to get a sales prediction!")

st.subheader("Enter the details to predict sales")

# Add some text
#st.write("Enter some data for Prediction.")

 # Create the input fields
input_data = {}
col1,col2 = st.columns(2)
with col1:
    input_data["gender"] = st.radio('Select your gender', ('male', 'female'))
    input_data["SeniorCitizen"] = st.radio("Are you a Seniorcitizen; No=0 and Yes=1", ('0', '1'))
    input_data["Partner"] = st.radio('Do you have Partner', ('Yes', 'No'))
    input_data["Dependents"] = st.selectbox('Do you have any Dependents?', ('No', 'Yes'))
    input_data["tenure"] = st.number_input('Lenght of tenure (no. of months with Telco)', min_value=0, max_value=90, value=1, step=1)
    input_data["PhoneService"] = st.radio('Do you have PhoneService? ', ('No', 'Yes'))
    input_data["MultipleLines"] = st.radio('Do you have MultipleLines', ('No', 'Yes'))
    input_data["InternetService"] = st.radio('Do you have InternetService', ('DSL', 'Fiber optic', 'No'))
    input_data["OnlineSecurity"] = st.radio('Do you have OnlineSecurity?', ('No', 'Yes'))         

with col2:
    input_data["OnlineBackup"] = st.radio('Do you have OnlineBackup?', ('No', 'Yes'))
    input_data["DeviceProtection"] = st.radio('Do you have DeviceProtection?', ('No', 'Yes'))
    input_data["TechSupport"] = st.radio('Do you have TechSupport?', ('No', 'Yes'))
    input_data["StreamingTV"] = st.radio('Do you have StreamingTV?', ('No', 'Yes'))
    input_data["StreamingMovies"] = st.radio('Do you have StreamingMovies?', ('No', 'Yes'))
    input_data["Contract"] = st.selectbox('which Contract do you use?', ('Month-to-month', 'One year', 'Two year'))
    input_data["PaperlessBilling"] = st.radio('Do you prefer PaperlessBilling?', ('Yes', 'No'))
    input_data["PaymentMethod"] = st.selectbox('Which PaymentMethod do you prefer?', ('Electronic check', 'Mailed check', 'Bank transfer (automatic)',
                                        'Credit card (automatic)'))
    input_data["MonthlyCharges"] = st.number_input("Enter monthly charges (the range should between 0-120)")
    input_data["TotalCharges"] = st.number_input("Enter total charges (the range should between 0-10.000)")  


# Define CSS style for the download button
# Define the custom CSS
predict_button_css = """
    <style>
    .predict-button {
        background-color: #C4C4C4;
        color: gray;
        padding: 0.75rem 2rem;
        border-radius: 0.5rem;
        border: none;
        font-size: 1.1rem;
        font-weight: bold;
        text-align: center;
        margin-top: 2rem;
    }
    </style>
"""

# Display the custom CSS
st.markdown(predict_button_css, unsafe_allow_html=True)


  # Create a button to make a prediction

if st.button("Predict", key="predict_button", help="Click to make a prediction."):
    # Convert the input data to a pandas DataFrame
        input_df = pd.DataFrame([input_data])


# Selecting categorical and numerical columns separately
        cat_columns = [col for col in input_df.columns if input_df[col].dtype == 'object']
        num_columns = [col for col in input_df.columns if input_df[col].dtype != 'object']


# Apply the imputers
        input_df_imputed_cat = cat_imputer.transform(input_df[cat_columns])
        input_df_imputed_num = num_imputer.transform(input_df[num_columns])


 # Encode the categorical columns
        input_encoded_df = pd.DataFrame(encoder.transform(input_df_imputed_cat).toarray(),
                                   columns=encoder.get_feature_names(cat_columns))

# Scale the numerical columns
        input_df_scaled = scaler.transform(input_df_imputed_num)
        input_scaled_df = pd.DataFrame(input_df_scaled , columns = num_columns)

#joining the cat encoded and num scaled
        final_df = pd.concat([input_encoded_df, input_scaled_df], axis=1)

# Make a prediction
        prediction = model.predict(final_df)[0]
        prediction_label = "Beware!!! This customer is likely to Churn" if prediction.item() == "Yes" else "This customer is Not likely churn"
        prediction_label


# Display the prediction
        st.write(f"The predicted sales are: {prediction_label}.")
        st.table(input_df)