File size: 5,977 Bytes
b48f9b8
 
 
 
 
 
 
 
 
e4e04a8
b48f9b8
0ba77fc
b48f9b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3e5d933
b48f9b8
 
 
0ba77fc
0e18814
b48f9b8
0ba77fc
 
 
 
 
b48f9b8
 
0ba77fc
 
b48f9b8
c1dad72
 
0ba77fc
c1dad72
 
 
0ba77fc
c1dad72
b48f9b8
 
 
 
 
 
 
 
 
0ba77fc
 
 
 
 
 
 
b48f9b8
 
 
0ba77fc
 
 
 
 
 
 
 
 
1bd9250
 
0ba77fc
1bd9250
 
2b0a296
 
 
 
0ba77fc
 
1bd9250
 
 
 
d587d17
7882ad8
2b0a296
d587d17
2b0a296
b48f9b8
 
 
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import os
import sys
from random import randint
import time
import uuid
import argparse
sys.path.append(os.path.abspath("../supv"))
from matumizi.util import *
from mcclf import *
import streamlit as st


def  genVisitHistory(numUsers, convRate, label):
    for i in range(numUsers):
        userID = genID(12)
        userSess = []
        userSess.append(userID)

        conv = randint(0, 100)
        if (conv < convRate):
            #converted
            if (label):
                if (randint(0,100) < 90):
                    userSess.append("T")
                else:
                    userSess.append("F")


            numSession = randint(2, 20)
            for j in range(numSession):
                sess = randint(0, 100)
                if (sess <= 15):
                    elapsed = "H"
                elif (sess > 15 and sess <= 40):
                    elapsed = "M"
                else:
                    elapsed = "L"

                sess = randint(0, 100)
                if (sess <= 15):
                    duration = "L"
                elif (sess > 15 and sess <= 40):
                    duration = "M"
                else:
                    duration = "H"

                sessSummary = elapsed + duration
                userSess.append(sessSummary)


        else:
            #not converted
            if (label):
                if (randint(0,100) < 90):
                    userSess.append("F")
                else:
                    userSess.append("T")

            numSession = randint(2, 12)
            for j in range(numSession):
                sess = randint(0, 100)
                if (sess <= 20):
                    elapsed = "L"
                elif (sess > 20 and sess <= 45):
                    elapsed = "M"
                else:
                    elapsed = "H"

                sess = randint(0, 100)
                if (sess <= 20):
                    duration = "H"
                elif (sess > 20 and sess <= 45):
                    duration = "M"
                else:
                    duration = "L"

                sessSummary = elapsed + duration
                userSess.append(sessSummary)

        st.write(",".join(userSess))


def main():
    st.set_page_config(page_title="Customer Conversion Prediction", page_icon=":guardsman:", layout="wide")
    st.title("Customer Conversion Prediction")

    # # Add sidebar
    # st.sidebar.title("Navigation")
    # app_mode = st.sidebar.selectbox("Choose the app mode",
    #     ["Instructions", "Generate User Visit History", "Train Model", "Predict Conversion"])

    # Add sidebar
    st.sidebar.title("Navigation")
    app_mode = st.sidebar.selectbox("Choose the App Mode",
        ["Instructions", "Generate User Visit History", "Predict Conversion"])

    if app_mode == "Instructions":
        st.write("Welcome to the Markov Chain Classifier app!")
        # st.write("This app allows you to generate user visit history, train a Markov Chain Classifier model, and predict conversion.")
        st.write("This app allows you to generate user visit history, train a Markov Chain Classifier model, and predict conversion.")
        st.write("To get started, use the sidebar to navigate to the desired functionality.")
        st.write("1. **Generate User Visit History**: Select the number of users and conversion rate, and click the 'Generate' button to generate user visit history.")
        # st.write("2. **Train Model**: Upload an ML config file using the file uploader, and click the 'Train' button to train the Markov Chain Classifier model.")
        st.write("3. **Predict Conversion**: Upload an ML config file using the file uploader, and click the 'Predict' button to make predictions with the trained model.")

    elif app_mode == "Generate User Visit History":
        st.subheader("Generate User Visit History")
        num_users = st.number_input("Number of users", min_value=1, max_value=10000, value=100, step=1)
        conv_rate = st.slider("Conversion rate", min_value=0, max_value=100, value=10, step=1)
        add_label = st.checkbox("Add label", value=False)
        if st.button("Generate"):
            genVisitHistory(num_users, conv_rate, add_label)

    # elif app_mode == "Train Model":
    #     st.subheader("Train Model")
    #     mlf_path = st.file_uploader("Upload ML config file")
    #     if st.button("Train"):
    #         if mlf_path is not None:
    #             model = MarkovChainClassifier(mlf_path)
    #             model.train()

    elif app_mode == "Predict Conversion":
        st.subheader("Predict Conversion")
        # Upload ML config file using Streamlit's file_uploader function
        mlf_file = st.file_uploader("Upload ML config file", type=["properties"])

        # Check if ML config file was uploaded
        if mlf_file is not None:
            # Save the uploaded file to a local file
            with open("mcclf_cc.properties", "wb") as f:
                f.write(mlf_file.read())

            # Create an instance of MarkovChainClassifier with the uploaded ML config file
            model = MarkovChainClassifier("cc.mod")

            # # Load the model from cc.mod
            # model = MarkovChainClassifier.load_model("cc.mod")

            # Get user input for userID
            user_id = st.text_input("Enter User ID")
            
            # Check if the "Predict" button was clicked
            if st.button("Predict"):
                # Load the saved model
                model.load_model("cc.mod")
                
                # Call the predict method of the MarkovChainClassifier instance
                pred = model.predict()
                if pred == 'T':
                    st.write(f"UserID: {user_id}, Prediction: Visitor is likely to convert into a customer.")
                else:
                    st.write(f"UserID: {user_id}, Prediction: Visitor is unlikely to convert into a customer.")

if __name__ == "__main__":
    main()