-
Notifications
You must be signed in to change notification settings - Fork 0
/
streamlit_app.py
143 lines (102 loc) · 4.91 KB
/
streamlit_app.py
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
# --------------------Importing libraries--------------------
import numpy as np
import pandas as pd
import streamlit as st
from datetime import datetime
# --------------------Importing utils.py--------------------
from utils import IvrProcessor
# --------------------Page configuration--------------------
st.set_page_config(
page_title='IVR Unconnected Phone Numbers',
layout="centered",
initial_sidebar_state="auto"
)
hide_streamlit_style = """
<style>
header {visibility: hidden;}
footer {visibility: hidden;}
#root > div:nth-child(1) > div > div > div > div > section > div {padding-top: 0rem; padding-bottom: 4rem;}
</style>
"""
st.markdown(hide_streamlit_style, unsafe_allow_html=True)
# --------------------Start main page--------------------
st.image("gifs/cable_disconnected.gif", use_column_width='always')
st.title('IVR Unconnected Phone Numbers')
st.markdown(
'''
This app removes already participated phone numbers from IVR raw results and churn out the ones who haven't to be re-used in the next round of IVR.
'''
)
# Initialize session state variables if not already present
if 'uploaded_files' not in st.session_state:
st.session_state['uploaded_files'] = None
if 'process_complete' not in st.session_state:
st.session_state['process_complete'] = False
# Setting up the file uploader widget
uploaded_files = st.file_uploader("Upload IVR Files (.csv format)",
accept_multiple_files=True,
type=['csv', 'xlsx'],
help='You can upload multiple csv files at once')
# Update the session state with the uploaded file
if uploaded_files is not None:
st.session_state['uploaded_files'] = uploaded_files
else:
st.session_state['uploaded_files'] = False
st.session_state['process_complete'] = False
if st.session_state['uploaded_files']:
# Display the count of uploaded files
st.write(f"Number of files uploaded: {len(uploaded_files)}")
if st.button('Process'):
# Process the files
with st.spinner("Processing the files..."):
# Initialize class
ip = IvrProcessor()
unconnected_phonenums = []
total_pickup = 0
total_cr = 0
# Extract unconnected phone numbers only
for uploaded_file in uploaded_files:
ivr_file = ip.read_file(uploaded_file)
unconnected_phonenum = ip.extract_unconnected_phonenum(ivr_file)
unconnected_phonenums.append(unconnected_phonenum)
pickup_count = ip.calculate_total_pickup(ivr_file)
total_pickup += pickup_count
cr_count = ip.calculate_total_cr(ivr_file)
total_cr += cr_count
# Store total pickup & total CR value in session state
st.session_state['total_pickup'] = total_pickup
st.session_state['total_cr'] = total_cr
all_unconnected_phonenum = pd.concat(unconnected_phonenums, ignore_index=True).drop_duplicates()
# Randomize the phone numbers sequence
all_unconnected_phonenum = all_unconnected_phonenum.sample(len(all_unconnected_phonenum))
# Store the output DF in session state
st.session_state['all_unconnected_phonenum'] = all_unconnected_phonenum
st.success("Files have been processed successfully ✨")
st.write(f"Total Pickup: {st.session_state['total_pickup']:,}")
st.write(f"Total CR: {st.session_state['total_cr']:,}")
st.write(f"Total unconnected phone numbers: {len(st.session_state['all_unconnected_phonenum']):,}")
# Display a snippet of the cleaned data randomly
st.markdown("### Data Preview")
st.dataframe(st.session_state['all_unconnected_phonenum'].sample(6))
st.session_state['process_complete'] = True # Set process complete flag
# Warning if 'Process' is clicked before file upload
if not st.session_state['uploaded_files'] and st.button("Process"):
st.warning("Please upload your IVR raw files first.")
@st.experimental_fragment
def download_file(data, file_name):
st.download_button(
label = "Download file",
data = data,
file_name = file_name,
mime = 'text/csv',
key = 'download'
)
# Show 'Download' button if the file has been processed
if st.session_state['uploaded_files'] and st.session_state['process_complete']:
# Generate current date for file versioning
formatted_date = datetime.now().strftime("%d%m%Y")
# Default file name with current date
default_filename = f'IVR_unconnected_phonenum_v{formatted_date}.csv'
# Convert to csv
data_as_csv = st.session_state['all_unconnected_phonenum'].to_csv(index=False).encode('utf-8')
download_file(data_as_csv, default_filename)