cd14 laumiulun commited on
Commit
03260fa
·
0 Parent(s):

Duplicate from loxzdigital/Model-CC-Space

Browse files

Co-authored-by: Andy Lau <laumiulun@users.noreply.huggingface.co>

Files changed (8) hide show
  1. .gitattributes +31 -0
  2. README.md +13 -0
  3. app.py +492 -0
  4. example_3.html +350 -0
  5. figures/ModelCC.png +0 -0
  6. main_app.py +15 -0
  7. models/models.sav +0 -0
  8. requirements.txt +11 -0
.gitattributes ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ftz filter=lfs diff=lfs merge=lfs -text
6
+ *.gz filter=lfs diff=lfs merge=lfs -text
7
+ *.h5 filter=lfs diff=lfs merge=lfs -text
8
+ *.joblib filter=lfs diff=lfs merge=lfs -text
9
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
10
+ *.model filter=lfs diff=lfs merge=lfs -text
11
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
12
+ *.npy filter=lfs diff=lfs merge=lfs -text
13
+ *.npz filter=lfs diff=lfs merge=lfs -text
14
+ *.onnx filter=lfs diff=lfs merge=lfs -text
15
+ *.ot filter=lfs diff=lfs merge=lfs -text
16
+ *.parquet filter=lfs diff=lfs merge=lfs -text
17
+ *.pickle filter=lfs diff=lfs merge=lfs -text
18
+ *.pkl filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pt filter=lfs diff=lfs merge=lfs -text
21
+ *.pth filter=lfs diff=lfs merge=lfs -text
22
+ *.rar filter=lfs diff=lfs merge=lfs -text
23
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
24
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
25
+ *.tflite filter=lfs diff=lfs merge=lfs -text
26
+ *.tgz filter=lfs diff=lfs merge=lfs -text
27
+ *.wasm filter=lfs diff=lfs merge=lfs -text
28
+ *.xz filter=lfs diff=lfs merge=lfs -text
29
+ *.zip filter=lfs diff=lfs merge=lfs -text
30
+ *.zst filter=lfs diff=lfs merge=lfs -text
31
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Model CC Space
3
+ emoji: ✉️
4
+ colorFrom: purple
5
+ colorTo: yellow
6
+ sdk: streamlit
7
+ sdk_version: 1.10.0
8
+ app_file: app.py
9
+ pinned: false
10
+ duplicated_from: loxzdigital/Model-CC-Space
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,492 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from ast import arg
2
+ import streamlit as st
3
+ import pandas as pd
4
+ import PIL
5
+ import re
6
+ from io import StringIO
7
+ import boto3
8
+ from urlextract import URLExtract
9
+ import time
10
+ # from joblib import dump, load
11
+
12
+ import joblib
13
+
14
+ from bokeh.models.widgets import Div
15
+
16
+ import email
17
+ #from ipyfilechooser import FileChooser
18
+
19
+ #from IPython.display import display
20
+ from io import BytesIO
21
+ from bs4 import BeautifulSoup
22
+ import matplotlib.pyplot as plt
23
+ import numpy as np
24
+ import timeit
25
+
26
+
27
+ def table_data():
28
+ # creating table data
29
+ field = [
30
+ 'Data Scientist',
31
+ 'Dataset',
32
+ 'Algorithm',
33
+ 'Framework',
34
+ 'Ensemble',
35
+ 'Domain',
36
+ 'Model Size'
37
+ ]
38
+
39
+ data = [
40
+ 'Chen Song',
41
+ 'Internal + Campaign monitor',
42
+ 'Random Forest',
43
+ 'Sci-kit learn',
44
+ 'Bootstrapping',
45
+ 'Bootstrapping Aggregation',
46
+ '4 KB'
47
+ ]
48
+
49
+ data = {
50
+ 'Field': field,
51
+ 'Data': data
52
+ }
53
+
54
+ df = pd.DataFrame.from_dict(data)
55
+
56
+ return df
57
+
58
+
59
+ def url_button(button_name, url):
60
+ if st.button(button_name):
61
+ js = """window.open('{url}')""".format(url=url) # New tab or window
62
+ html = '<img src onerror="{}">'.format(js)
63
+ div = Div(text=html)
64
+ st.bokeh_chart(div)
65
+
66
+
67
+ def get_industry_code_dict(training_dataset):
68
+ training_dataset['industry_code'] = training_dataset['industry'].astype(
69
+ 'category')
70
+ cat_columns = training_dataset.select_dtypes(['category']).columns
71
+ training_dataset[cat_columns] = training_dataset[cat_columns].apply(
72
+ lambda x: x.cat.codes)
73
+ industry_code_dict = dict(
74
+ zip(training_dataset.industry, training_dataset.industry_code))
75
+ return industry_code_dict
76
+
77
+ def parse_email(uploaded_file):
78
+ parsed_email = []
79
+ efile = open(uploaded_file.name,'r')
80
+ emailstr = ""
81
+ for i, line in enumerate(efile):
82
+ emailstr += line
83
+
84
+ b = email.message_from_string(emailstr)
85
+ for part in b.walk():
86
+ if part.get_content_type():
87
+ body = str(part.get_payload())
88
+ soup = BeautifulSoup(body)
89
+ paragraphs = soup.find_all('body')
90
+ for paragraph in paragraphs:
91
+ parsed_email.append(paragraph.text)
92
+ return parsed_email
93
+
94
+ #def email_upload():
95
+ # print("Please upload your email (In HTML Format)")
96
+ # upload = FileUpload(accept='.html', multiple=True)
97
+ # display(upload)
98
+ # return upload
99
+ # fc = FileChooser()
100
+ # display(fc)
101
+ # return fc
102
+
103
+
104
+ # New - In-Use
105
+ def email_extractor(email_uploaded):
106
+ parse = parse_email(email_uploaded)
107
+
108
+ email_text = ''.join(parse).strip()
109
+
110
+ # extract the email body using string manipulation functions
111
+ email_body_start_index = email_text.find('Bright Apps LLC')
112
+ email_body_end_index = email_text.find('To read more')
113
+ email_body = email_text[email_body_start_index:email_body_end_index].strip()
114
+
115
+ # get rid of non-text elements
116
+ email_body = email_body.replace('\n', '')
117
+ email_body = email_body.replace('\t', '')
118
+ email_body = email_body.replace('\r', '')
119
+ email_body = email_body.replace('</b>', '')
120
+ email_body = email_body.replace('<b>', '')
121
+ email_body = email_body.replace('\xa0', '')
122
+
123
+ # find length of URLs if any
124
+ extractor = URLExtract()
125
+ urls = extractor.find_urls(email_body)
126
+ url_cnt = len(urls)
127
+
128
+ # remove URLs and get character count
129
+ body = re.sub(r'\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*', '', email_body)
130
+ sep = '©'
131
+ body = body.split(sep, 1)[0]
132
+ character_cnt = sum(not chr.isspace() for chr in body)
133
+
134
+ return email_body, character_cnt, url_cnt
135
+
136
+
137
+ # extract email body from parse email
138
+ def email_body_extractor(email_data):
139
+ # email_data = parsed_email.data[0]
140
+ emailstr = email_data.decode("utf-8")
141
+ b = email.message_from_string(emailstr)
142
+ body = ""
143
+
144
+ if b.is_multipart():
145
+ for part in b.walk():
146
+ ctype = part.get_content_type()
147
+ cdispo = str(part.get('Content-Disposition'))
148
+
149
+ # skip any text/plain (txt) attachments
150
+ if ctype == 'text/plain' and 'attachment' not in cdispo:
151
+ body = part.get_payload() # decode
152
+ break
153
+ # not multipart - i.e. plain text, no attachments, keeping fingers crossed
154
+ else:
155
+ body = b.get_payload()
156
+ # Remove escape sequences
157
+ body = body.replace('\n', '')
158
+ body = body.replace('\t', '')
159
+ body = body.replace('\r', '')
160
+ body = body.replace('</b>', '')
161
+ body = body.replace('<b>', '')
162
+
163
+ # Extract urls in the email body and get url counts
164
+ extractor = URLExtract()
165
+ urls = extractor.find_urls(body)
166
+ url_cnt = len(urls)
167
+ # Remove urls
168
+ body = re.sub(
169
+ r'\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*', '', body)
170
+ sep = '©'
171
+ body = body.split(sep, 1)[0]
172
+ character_cnt = sum(not chr.isspace() for chr in body)
173
+
174
+ return body, character_cnt, url_cnt
175
+
176
+
177
+ def add_bg_from_url():
178
+ st.markdown(
179
+ f"""
180
+ <style>
181
+ .stApp {{
182
+ background-image: linear-gradient(#45eff5,#1C8D99);
183
+ background-attachment: fixed;
184
+ background-size: cover
185
+
186
+ }}
187
+ </style>
188
+ """,
189
+ unsafe_allow_html=True
190
+ )
191
+
192
+ add_bg_from_url()
193
+ #linear-gradient(0deg,#010405 0,#061c2c 55%,#0a3144 75%,#0f4d60)
194
+
195
+ st.markdown("# Character Count: Email Industry")
196
+
197
+
198
+ stats_col1, stats_col2, stats_col3, stats_col4 = st.columns([1, 1, 1, 1])
199
+
200
+ with stats_col1:
201
+ st.caption("Production: Ready")
202
+ with stats_col2:
203
+ st.caption("Accuracy: 85%")
204
+ with stats_col3:
205
+ st.caption("Speed: 16.89 ms")
206
+ with stats_col4:
207
+ st.caption("Industry: Email")
208
+
209
+
210
+ with st.sidebar:
211
+
212
+ with st.expander('Model Description', expanded=False):
213
+ img = PIL.Image.open("figures/ModelCC.png")
214
+ st.image(img)
215
+ st.markdown('Finding the correct length for an email campaign to maximize user engagement can be an ambiguous task. The Loxz Character Count Model allows you to predict the correct length of your emails for a particular industry and a particular type of email. Using these inputs and trained on an extensive proprietary data set from the Loxz family digital archive, the models incorporate real-world and synthetic data to find the optimized character counts. We applied the random forest algorithm in this model. Bootstrapping was also ensembled in the algorithm which effectively prevents overfitting by reducing variance. The model achieves an 86% accuracy on the test set. This inference-based ML model will help the campaign engineers start with an acceptable length and zero in on the best character count, maximizing engagement in their campaign.')
216
+
217
+ with st.expander('Model Information', expanded=False):
218
+ hide_table_row_index = """
219
+ <style>
220
+ thead tr th:first-child {display:none}
221
+ tbody th {display:none}
222
+ </style>
223
+ """
224
+ st.markdown(hide_table_row_index, unsafe_allow_html=True)
225
+ st.table(table_data())
226
+
227
+ url_button('Model Homepage', 'https://www.loxz.com/#/models/CTA')
228
+ # url_button('Full Report','https://resources.loxz.com/reports/realtime-ml-character-count-model')
229
+ url_button('Amazon Market Place', 'https://aws.amazon.com/marketplace')
230
+
231
+
232
+ industry_lists = [
233
+ 'Retail',
234
+ 'Software and Technology',
235
+ 'Hospitality',
236
+ 'Academic and Education',
237
+ 'Healthcare',
238
+ 'Energy',
239
+ 'Real Estate',
240
+ 'Entertainment',
241
+ 'Finance and Banking'
242
+ ]
243
+
244
+ campaign_types = [
245
+ 'Promotional',
246
+ 'Transactional',
247
+ 'Webinar',
248
+ 'Survey',
249
+ 'Newsletter',
250
+ 'Engagement',
251
+ 'Usage_and_Consumption',
252
+ 'Review_Request',
253
+ 'Product_Announcement',
254
+ 'Abandoned_Cart'
255
+ ]
256
+
257
+ target_variables = [
258
+ 'conversion_rate',
259
+ 'click_to_open_rate'
260
+ ]
261
+
262
+ uploaded_file = st.file_uploader(
263
+ "Please upload your email (In HTML Format)", type=["html"])
264
+
265
+ if uploaded_file is None:
266
+ # upload_img = PIL.Image.open(uploaded_file)
267
+ upload_img = None
268
+ # else:
269
+ # upload_img = None
270
+
271
+
272
+ industry = st.selectbox(
273
+ 'Please select your industry',
274
+ industry_lists,
275
+ index=6
276
+ )
277
+
278
+ campaign = st.selectbox(
279
+ 'Please select your campaign type',
280
+ campaign_types,
281
+ index=5
282
+ )
283
+
284
+ target = st.selectbox(
285
+ 'Please select your target variable',
286
+ target_variables,
287
+ index=1
288
+ )
289
+
290
+ st.markdown("""---""")
291
+
292
+ #char_reco_preference = st.selectbox(
293
+ # 'Do you want to increase or decrease your character count in the email?',
294
+ # ["Increase", "Decrease"],
295
+ # index=1)
296
+
297
+
298
+ def get_files_from_aws(bucket, prefix):
299
+ """
300
+ get files from aws s3 bucket
301
+
302
+ bucket (STRING): bucket name
303
+ prefix (STRING): file location in s3 bucket
304
+ """
305
+ s3_client = boto3.client('s3',
306
+ aws_access_key_id=st.secrets["aws_id"],
307
+ aws_secret_access_key=st.secrets["aws_key"])
308
+
309
+ file_obj = s3_client.get_object(Bucket=bucket, Key=prefix)
310
+ body = file_obj['Body']
311
+ string = body.read().decode('utf-8')
312
+
313
+ df = pd.read_csv(StringIO(string))
314
+
315
+ return df
316
+
317
+
318
+ # st.info([industry,campaign,target,char_reco_preference])
319
+
320
+
321
+ if st.button('Generate Predictions'):
322
+ start_time = time.time()
323
+ if uploaded_file is None:
324
+ st.error('Please upload a email (HTML format)')
325
+ else:
326
+ placeholder = st.empty()
327
+ placeholder.text('Loading Data')
328
+
329
+ # Starting predictions
330
+ model = joblib.load('models/models.sav')
331
+ # Generate Email Data
332
+ email_data = get_files_from_aws(
333
+ 'emailcampaigntrainingdata', 'trainingdata/email_dataset_training.csv')
334
+ acc_data = get_files_from_aws(
335
+ 'emailcampaigntrainingdata', 'trainingdata/email_dataset_training_raw.csv')
336
+
337
+ email_data_ = email_data[["email_body", "industry", "campaign_type",
338
+ "character_cnt", "url_cnt", "Open_Rate", "Click_Through_Rate"]]
339
+ email_data_ = email_data_.rename(
340
+ {'Open_Rate': 'Click-to-open_Rate', 'Click_Through_Rate': 'Conversion_Rate'})
341
+ df_email_data = email_data_.rename(
342
+ columns={'Open_Rate': 'Click-to-open_Rate', 'Click_Through_Rate': 'Conversion_Rate'})
343
+
344
+ # Dataset:
345
+ training_dataset = get_files_from_aws(
346
+ 'emailcampaigntrainingdata', 'modelCC/training.csv')
347
+ # X_test = get_files_from_aws('emailcampaigntrainingdata','modelCC/Xtest.csv')
348
+ # Y_test = get_files_from_aws('emailcampaigntrainingdata','modelCC/ytest.csv')
349
+
350
+ # print("Getting Data Time: %s seconds" % (time.time() - start_time))
351
+
352
+ industry_code_dict = get_industry_code_dict(email_data)
353
+ #uploaded_file = FileChooser(uploaded_file)
354
+ #bytes_data = uploaded_file.getvalue()
355
+
356
+ email_body, character_cnt, url_cnt = email_extractor(uploaded_file)
357
+
358
+ # Start the prediction
359
+ # Need to solve X test issue
360
+
361
+ # y_pred = model.predict(X_test)
362
+ df_uploaded = pd.DataFrame(
363
+ columns=['character_cnt', "url_cnt", "industry"])
364
+ df_uploaded.loc[0] = [character_cnt, url_cnt, industry]
365
+ df_uploaded["industry_code"] = industry_code_dict.get(industry)
366
+ df_uploaded_test = df_uploaded[[
367
+ "industry_code", "character_cnt", "url_cnt"]]
368
+ predicted_rate = model.predict(df_uploaded_test)[0]
369
+ output_rate = round(predicted_rate, 4)
370
+
371
+ if output_rate < 0:
372
+ print(
373
+ "Sorry, Current model couldn't provide predictions on the target variable you selected.")
374
+ else:
375
+ st.markdown('#### Current Character Count in Your Email is: <span style="color:blue">{}</span>'.format(
376
+ character_cnt), unsafe_allow_html=True)
377
+ # st.info('The model predicts that it achieves a {} of {}%'.format(target, str(round(output_rate*100,2))))
378
+ if target == 'conversion_rate':
379
+ target_vis = 'Click_Through_Rate'
380
+ else:
381
+ target_vis = 'Open_Rate'
382
+
383
+ st.markdown('#### The model predicts that it achieves a <span style="color:blue">{}</span> of <span style="color:blue">{}</span>%'.format(
384
+ target_vis, str(round(output_rate*100, 3))), unsafe_allow_html=True)
385
+ selected_industry_code = industry_code_dict.get(industry)
386
+
387
+ if target == "click_to_open_rate":
388
+ selected_variable = "Open_Rate"
389
+ if target == "conversion_rate":
390
+ selected_variable = "Click_Through_Rate"
391
+
392
+ df_reco = training_dataset[[
393
+ "industry_code", "character_cnt", "url_cnt", selected_variable]]
394
+ df_reco = df_reco[df_reco["industry_code"]
395
+ == selected_industry_code]
396
+ df_reco[selected_variable] = df_reco[selected_variable].apply(
397
+ lambda x: round(x, 3))
398
+ df_reco_sort = df_reco.sort_values(by=[selected_variable])
399
+ df_reco = df_reco.drop_duplicates(subset=selected_variable)
400
+
401
+ #preference = char_reco_preference
402
+ #if preference == "Increase":
403
+ # df_reco_opt = df_reco[(df_reco[selected_variable] > output_rate) & (
404
+ # df_reco["character_cnt"] > character_cnt) & (df_reco["character_cnt"] <= (1.5*character_cnt))]
405
+ # df_reco_opt_rank = df_reco_opt.nlargest(3, [selected_variable])
406
+ # decrease character reco
407
+ #if preference == "Decrease":
408
+ # df_reco_opt = df_reco[(df_reco[selected_variable] > output_rate) & (
409
+ # df_reco["character_cnt"] < character_cnt)]
410
+ # df_reco_opt_rank = df_reco_opt.nlargest(3, [selected_variable])
411
+
412
+
413
+ # split into two dataframes of higher and lower character_cnt (added apr 2023)
414
+ char_cnt_uploaded = character_cnt
415
+
416
+ df_reco_opt1 = df_reco[(df_reco[selected_variable] > output_rate) & (df_reco["character_cnt"] > char_cnt_uploaded) & (df_reco["character_cnt"] <= (1.5*char_cnt_uploaded))]
417
+ df_reco_opt2 = df_reco[(df_reco[selected_variable] > output_rate) & (df_reco["character_cnt"] < char_cnt_uploaded) & (df_reco["character_cnt"] >= (char_cnt_uploaded/2))]
418
+
419
+ # drop duplicates of character_cnt keeping the row with the highest output_rate
420
+ df_reco_opt1 = df_reco_opt1.sort_values(by=[selected_variable], ascending=False).drop_duplicates(subset=["character_cnt"])
421
+ df_reco_opt2 = df_reco_opt2.sort_values(by=[selected_variable], ascending=False).drop_duplicates(subset=["character_cnt"])
422
+
423
+ # get top 2 largest in higher and lower dataframe
424
+ df_reco_opt_rank1 = df_reco_opt1.nlargest(2, [selected_variable])
425
+ df_reco_opt_rank2 = df_reco_opt2.nlargest(2, [selected_variable])
426
+
427
+ df_reco_opt_rank = pd.concat([df_reco_opt_rank1, df_reco_opt_rank2])
428
+ df_reco_opt_rank = df_reco_opt_rank.nlargest(3,[selected_variable])
429
+
430
+ if selected_variable == "Open_Rate":
431
+ selected_variable = "Click-to-Open_Rate"
432
+ if selected_variable == "Click_Through_Rate":
433
+ selected_variable = "Conversion_Rate"
434
+
435
+ st.markdown('#### To get higher, <span style="color:blue">{}</span>, the model recommends the following options:'.format(
436
+ selected_variable), unsafe_allow_html=True)
437
+ if len(df_reco_opt_rank) == 0:
438
+ st.markdown('#### You ve already achieved the highest, <span style="color:blue">{}</span>, with the current character count!'.format(
439
+ selected_variable), unsafe_allow_html=True)
440
+ else:
441
+ #for _, row in df_reco_opt_rank.iterrows():
442
+ # Character_Count = row[1]
443
+ # selected_variable = row[3]
444
+ # print(f"·Number of Characters: {int(Character_Count)}, Target Rate: {round(selected_variable, 3)*100}", "%")
445
+ # st.markdown('Number of Characters: {}, Target Rate: {}'.format(
446
+ # int(Character_Count), round(selected_variable*100, 3)))
447
+
448
+ chars = []
449
+ sel_var_values = []
450
+
451
+ for _, row in df_reco_opt_rank.iterrows():
452
+ Character_Count = row[1]
453
+ selected_variable_number = row[3]
454
+ chars.append(int(Character_Count))
455
+ sel_var_values.append(round(selected_variable_number, 3)*100)
456
+ st.write(f"·Number of Characters: {int(Character_Count)}, Target Rate: {round(round(selected_variable_number, 3)*100, 3)}", "%")
457
+ st.write("\n")
458
+
459
+ if len(chars) > 1:
460
+ #fig = plt.figure()
461
+ #ax = fig.add_axes([0,0,1,1])
462
+ fig, ax = plt.subplots(figsize=(10,4))
463
+ bars = ax.barh(np.arange(len(chars)), sel_var_values, height=0.175, color='#0F4D60')
464
+
465
+ #ax.bar_label(bars)
466
+
467
+ ax.set_yticks(np.arange(len(chars)))
468
+ ax.set_yticklabels(np.array(chars), fontsize=14)
469
+ ax.set_title('Character Counts vs. Target Variable Rates', fontsize=18)
470
+ ax.set_ylabel('Character Counts', fontsize=16)
471
+ ax.set_xlabel('Target Rates %', fontsize=16)
472
+
473
+ for i, bar in enumerate(bars):
474
+ rounded_value = round(sel_var_values[i], 2)
475
+ ax.text(bar.get_width() + 0.3, bar.get_y() + bar.get_height()/2, str(rounded_value) + '%', ha='left', va='center', fontsize=12, fontweight='bold')
476
+
477
+ ax.margins(0.1,0.05)
478
+
479
+ biggest_bar_index = np.argmax(sel_var_values)
480
+ bars[biggest_bar_index].set_color('#00BF93')
481
+
482
+ st.plotly_chart(fig, use_container_width=True)
483
+
484
+ st.write("\n")
485
+ #st.write(np.array(chars))
486
+ chars_out = dict(zip(chars, sel_var_values))
487
+ sorted_chars_out = sorted(chars_out.items(), key=lambda x: x[1], reverse=True)
488
+
489
+
490
+ placeholder.empty()
491
+ #st.write(time.time() - start_time)
492
+
example_3.html ADDED
@@ -0,0 +1,350 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html xmlns="http://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml"><head><title>📢&nbsp;Bright Apps Announcing - Partnership with Advent Services LLC📢</title><!--[if gte mso 9]><xml><o:OfficeDocumentSettings><o:AllowPNG/><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings></xml><![endif]-->
2
+ <meta content="width=device-width" name="viewport">
3
+ <style>
4
+ /* #### Mobile Phones Portrait #### */
5
+ /* #### iPhone 4+ Portrait or Landscape #### */
6
+ @media only screen and (max-width: 480px){
7
+ table[class=contentInner] {width:100% !important;padding:0px;margin:0px;}
8
+ img[class=zpImage]{width:260px !important;max-width: 360px !important;text-align:center;margin:0px;padding:0px}
9
+ body, table, td, p, a, li,div,span, blockquote{-webkit-text-size-adjust:none !important;margin:0px auto;line-height:1.7}
10
+ table[class=zpImageCaption]{text-align:left;}
11
+ table[class=cols]{width:100% !important;max-width:100% !important;text-align:left;}
12
+ table[class=zpcolumns] {text-align:left;margin:0px;}
13
+ table[class=zpcolumn] {text-align:left;margin:0px;}
14
+ table[class=zpAlignPos]{width:100%;text-align:left;margin:0px;}
15
+ td[class=txtsize]{font-size:18px !important;}
16
+ td[class=paddingcomp]{padding:7px 15px !important;}
17
+ td[class=bannerimgpad]{padding:0px !important;}
18
+ span[class=txtsize]{font-size:18px !important;}
19
+ img[size = "B"]{width: 100% !important;max-width:100% !important;margin: 0px !important;padding:0px !important;}
20
+ img[size = "F"]{width: 100% !important;max-width:100% !important;margin: 0px !important;padding:0px !important;}
21
+ img[size = "S"]{width:105px !important; height:auto; margin:0px auto !important;padding:0px !important;}
22
+ img[size = "M"]{width:277.869px !important;height:auto;margin:0px auto !important;padding:0px !important;}
23
+ h1{
24
+ font-size:28px !important;
25
+ line-height:100% !important;
26
+ }
27
+ h2{
28
+ font-size:24px !important;
29
+ line-height:100% !important;
30
+ }
31
+ h3{
32
+ font-size:20px !important;
33
+ line-height:100% !important;
34
+ }
35
+ h4{
36
+ font-size:18px !important;
37
+ line-height:100% !important;
38
+ }
39
+ }
40
+ @media only screen and (max-width: 480px){
41
+ .zpImage{
42
+ height:auto !important;
43
+ width:100% !important;
44
+ }}
45
+ @media only screen and (max-width: 480px){
46
+ .contentInner,.cols,.zpAlignPos{
47
+ width:100% !important;
48
+ max-width:100% !important;
49
+ }}
50
+ @media only screen and (max-width: 480px){
51
+ .paddingcomp{
52
+ padding: 7px 15px !important;
53
+ }
54
+ .bannerimgpad{
55
+ padding:0px !important;
56
+ }
57
+ }
58
+ @media screen and (max-width: 480px)
59
+ {
60
+ .tmplheader,.tmplfooter{width:100% !important;max-width:400px !important;margin:0px auto;text-align:center;}
61
+ }
62
+ a[x-apple-data-detectors] {
63
+ color: inherit !important;
64
+ text-decoration: none !important;
65
+ font-size: inherit !important;
66
+ font-family: inherit !important;
67
+ font-weight: inherit !important;
68
+ line-height: inherit !important;
69
+ }
70
+
71
+ </style>
72
+ <meta content="text/html;charset=UTF-8" http-equiv="Content-Type"></head><body bgcolor="#f7c086" style="margin:0; padding:0;font-family:Arial, Helvetica, sans-serif; font-size:12px; color:#000000;"><center>
73
+ <div class="zppage-container">
74
+ <table bgcolor="#f7c086" border="0" cellpadding="0" cellspacing="0" class="contentOuter" id="contentOuter" style="background-color:#f0f0f0;background-color:#f7c086;font-size:12px;text-align:center;border:0px;padding:0px;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;" width="100%">
75
+ <tbody><tr>
76
+ <td style="border:0px;padding:0px;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;">&nbsp;</td>
77
+ <td align="center" style="border:0px;padding:0px;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;">
78
+ <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" class="contentInner" id="contentInner" style="border-collapse:collapse; border:0px;font-size:12px;background-color:#ffffff;background-color:#ffffff;width:600px;margin:0px auto;border:0px;" width="600">
79
+ <tbody><tr>
80
+ <td height="570" style="border:0px;padding:0px;" valign="top">
81
+ <a name="Top" style="text-decoration:underline;"></a>
82
+ <div baseposition="pos_YFkUyjFlRUSG17KTGU8Ffg" class="zpcontent-wrapper" id="page-container">
83
+ <table border="0" cellpadding="0" cellspacing="0" id="page-container" style="font-size:12px;border:0px;padding:0px;border-collapse:collapse; mso-table-lspace:0pt;mso-table-rspace:0pt;text-decoration:none !important;" width="100%">
84
+ <tbody><tr><td class="txtsize" id="elm_B7St3sQYTBaRyIWaLklY8g" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
85
+
86
+ <table bgcolor="transparent" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border:0px;padding:0px;width:100%;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;word-break:break-word;background-color:transparent;">
87
+ <tbody><tr>
88
+ <td class="txtsize" style="border:0px;padding:0px 0px;border-top:none none none ;border-bottom:none none none;">
89
+ <div class="zpelement-wrapper image" componentbgcolor="transparent" coupcmp id="elm_B7St3sQYTBaRyIWaLklY8g" prodcmp style=";word-wrap:break-word;overflow:hidden;padding:0px;background-color:transparent;" trace_width="600">
90
+ <div componentbgcolor="transparent" componentborder="none" componentbottombordersize="none" componentbottomborderstyle="none" componenttopbordersize="none" componenttopborderstyle="none">
91
+ <table align="left" border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="font-size:12px;text-align:left;width:100%;padding:0px;border:0px;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;word-break:break-word;width:100%;text-align:left;">
92
+ <tbody><tr><td class="paddingcomp" style="border:0px;padding:7px 15px;text-align:center;padding-top:7px;padding-bottom:7px;padding-right:15px;padding-left:15px;">
93
+ <img align="left" alt="https://campaign-image.com/zohocampaigns/526841000000350006_zc_v55_constant_logo.png" class="zpImage" height="auto" hspace="0" size="F" src="https://campaign-image.com/zohocampaigns/526841000002370008_9_logo.png" style="width:570px;height:autopx;border:0px;text-align:left;" vspace="0" width="570">
94
+ </td></tr>
95
+ <tr><td class="txtsize" style="border:0px;padding:0px;text-align:left;margin:0pt auto;" width="570">
96
+ <div class="zpImageCaption" style="text-align:center;margin:0pt auto;padding:0px;"></div>
97
+ </td></tr></tbody></table>
98
+ </div>
99
+ </div>
100
+ </td></tr></tbody></table>
101
+ </td></tr>
102
+ <tr><td class="txtsize" id="elm_PNsPADYZQ_m-XN5Qbzjs8g" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
103
+
104
+ <div class="zpelement-wrapper" id="elm_PNsPADYZQ_m-XN5Qbzjs8g" style=";word-wrap:break-word;overflow:hidden;padding-right:0px;background-color:;">
105
+ <table border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="font-size:12px;padding:0px;border:0px;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;word-break:break-word;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" width="100%">
106
+
107
+ <tbody><tr><td class="paddingcomp" style="border:0px;padding:7px 15px;line-height:19pt;border-top:0px none ; border-bottom:0px none ;padding-top:7px;padding-bottom:7px;padding-right:15px;padding-left:15px;">
108
+ <div style><h1 align="center" style="margin: 0;padding: 0px;font-family:Arial, Helvetica, sans-serif; color:#000000;color:#000000; font-weight:normal;font-family:Arial,verdana,Helvetica, sans-serif; color:#000000;font-size: 28px;"><font style="font-size: 12pt;"><i style><b style>Building solutions that work smarter and faster for your business.</b></i></font></h1><div align="center" style="text-align: center;"><font style="font-size: 12pt;"><i style><b style>If you can dream it, we can build it!</b></i></font></div></div>
109
+ </td></tr>
110
+ </tbody></table>
111
+ </div>
112
+ </td></tr>
113
+ <tr><td class="txtsize" id="elm_1569198117354" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
114
+
115
+ <div class="zpelement-wrapper" id="elm_1569198117354" style=";word-wrap:break-word;overflow:hidden;padding-right:0px;background-color:#ffffff;">
116
+ <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="font-size:12px;padding:0px;border:0px;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;word-break:break-word;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" width="100%">
117
+
118
+ <tbody><tr><td class="paddingcomp" style="border:0px;padding:7px 15px;line-height:19pt;border-top:0px none ; border-bottom:0px none ;padding-top:7px;padding-bottom:7px;padding-right:15px;padding-left:15px;">
119
+ <div componentbgcolor="#ffffff" style="background-color: rgb(255, 255, 255);"><font color="#da5a00" style="font-size: 20pt;">Bright Apps LLC announced as technical partners to Advent Services LLC</font></div>
120
+ </td></tr>
121
+ </tbody></table>
122
+ </div>
123
+ </td></tr>
124
+ <tr><td class="txtsize" id="elm_1602190777721" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
125
+
126
+ <div class="zpelement-wrapper" id="elm_1602190777721" style=";word-wrap:break-word;overflow:hidden;padding-right:0px;background-color:;">
127
+ <table border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="font-size:12px;padding:0px;border:0px;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;word-break:break-word;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" width="100%">
128
+
129
+ <tbody><tr><td class="paddingcomp" style="border:0px;padding:7px 15px;line-height:19pt;border-top:0px none ; border-bottom:0px none ;padding-top:7px;padding-bottom:7px;padding-right:15px;padding-left:15px;">
130
+ <div style><font style="font-size: 12pt;"><b>WALNUT CREEK, CA &ndash; October 30, 2020</b> &ndash; Naval Information Warfare Center (NIWC) Atlantic has awarded Advent Services LLC a Prime Contract under NIWC Atlantic&rsquo;s 8(a) Incubator indefinite delivery/indefinite quantity (IDIQ) multiple-award contract (MAC) to provide Programmatic, Engineering and Logistics Support Services.</font><div><font style="font-size: 12pt;"><br></font></div><div><font style="font-size: 12pt;">Under the 8(a) Incubator IDIQ MAC tasking, Advent Services will provide NIWC Atlantic with full system lifecycle support including research, development, test, evaluation, production, and fielding of sustainable, secure, survivable, and interoperable Command, Control, Communications, Computers, Combat Systems, Intelligence, Surveillance, Reconnaissance (C5ISR), Enterprise Information Services (EIS) and Space capabilities. Additionally, Program Management support, Financial Management support, and DoD Acquisition Life Cycle expertise and experience.&nbsp;</font><div><font style="font-size: 12pt;"><br></font></div><div><font style="font-size: 12pt;">Advent Services has chosen Bright Apps LLC as the premiere partner to help in supporting their work with NIWC Atlantic.</font></div></div><div><font style="font-size: 12pt;"><br></font></div><div><font style="font-size: 12pt;">To read <a alt="more" href="https://brightappsllc.com/bright-apps-llc-announced-as-technical-partners-to-advent-services-llc/" style="text-decoration:underline;" target="_blank" title="more" zcurl_name="l_1"><font color="#0001ee" style="color:#0001ee;">more</font></a></font></div></div>
131
+ </td></tr>
132
+ </tbody></table>
133
+ </div>
134
+ </td></tr>
135
+ <tr><td class="txtsize" id="elm_1580343306016" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
136
+
137
+
138
+ <div class="zpelement-wrapper divider" id="elm_1580343306016" style=";word-wrap:break-word;overflow:hidden;background-color:;">
139
+ <table bgcolor border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="padding:0px;border:0px;border-collapse:collapse; mso-table-lspace:0pt;font-size:5px; mso-table-rspace:0pt;word-break:break-word;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color:;" width="100%">
140
+ <tbody><tr><td class="txtsize" style="border:0px;padding:18px 7px 18px 7px;border-collapse:collapse;">
141
+ <div class="divider" componentborder="#ff9900" style="margin:0px;padding:0px;text-align:center;"><table align="center" border="0" border-color="#ff9900" cellpadding="0" cellspacing="0" class="dvdrtbl" style="border-collapse:collapse;border:0px;font-size: 0px;width:100%;margin:auto;"> <tbody><tr><td align="center" height="0" style="border:0px;padding:7px;border-top: 2px solid rgb(255, 153, 0); border-bottom: none rgb(255, 153, 0); border-left: none rgb(255, 153, 0); border-right: none rgb(255, 153, 0); font-size: 0px; margin: 0px; padding: 0px; width: 100%;" width="100%"> </td> </tr></tbody></table></div>
142
+ </td></tr></tbody></table>
143
+ </div>
144
+ </td></tr>
145
+ <tr><td class="txtsize" id="elm_1567486251620" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+ <div class="zpelement-wrapper spacebar" id="elm_1567486251620" style=";word-wrap:break-word;overflow:hidden;background-color:transparent;">
179
+
180
+ <table bgcolor="transparent" border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="padding:0px;border:0px;border-collapse:collapse; mso-table-lspace:0pt;font-size:5px; mso-table-rspace:0pt;word-break:break-word;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;height:10px;" width="100%">
181
+
182
+ <tbody><tr><td style="padding:0px;border:0px;font-size:5px;height:10px;border-top:none none none;border-bottom:none none none;">
183
+
184
+ &nbsp;&nbsp;&nbsp;
185
+
186
+ </td></tr>
187
+
188
+ </tbody></table>
189
+
190
+ </div>
191
+
192
+ </td></tr>
193
+ <tr><td class="txtsize" id="elm_1567486588387" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
194
+
195
+ <table bgcolor="rgb(255, 255, 255)" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border:0px;padding:0px;width:100%;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;word-break:break-word;background-color:rgb(255, 255, 255);">
196
+ <tbody><tr>
197
+ <td class="txtsize" style="padding:0px;border:0px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;border-top:1px solid rgba(0, 0, 0, 0) ;border-bottom:1px solid rgba(0, 0, 0, 0);">
198
+ <div class="zpelement-wrapper video" style="overflow:hidden;word-wrap:break-word;">
199
+ <table align="left" border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="font-size:12px;padding:0px;border:0px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;width:100%;text-align:left;">
200
+ <tbody><tr><td class="paddingcomp" style="border:0px;padding:7px 15px;text-align:center;padding-top:7px;padding-bottom:7px;padding-right:15px;padding-left:15px;">
201
+ <a class href="https://youtu.be/CEPyYUNwH-Q" name playbutton="1" service="youtube" style="text-decoration:underline;border:0px solid;" tag_name="BrightAppsLLC" target="_blank" video_tag="true" videotype="New" wistiatitle wistiaurl zcurl_name="l_2">
202
+ <img align="left" alt="BrightAppsLLC" class="zpImage" height="auto" size="F" src="https://campaign-image.com/zohocampaigns/526841000002370008_brightappsllc.png" style="width:570px;height:autopx;border:0px;text-align:center;" width="570">
203
+ </a>
204
+ </td></tr></tbody></table>
205
+ <div class="zpImageCaption" style="text-align:center;padding:0px;"></div>
206
+ </div>
207
+
208
+ </td></tr></tbody></table>
209
+ </td></tr>
210
+ <tr><td class="txtsize" id="elm_1567486638901" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+ <table bgcolor="transparent" cellpadding="0" cellspacing="0" height="48" style="font-size:12px;border:0px;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;border:none;" width="100%">
236
+ <tbody><tr><td class="paddingcomp" style="border:0px;padding:7px 15px;border-top:none none none;border-bottom:none none none;padding-top:7px;padding-bottom:7px;padding-right:15px;padding-left:15px;">
237
+ <div class="zpelement-wrapper buttonElem" id="elm_1567486638901" style="overflow:hidden;word-wrap:break-word;">
238
+ <div class="zpAlignPos" style="text-align:center;">
239
+ <table align="center" cellpadding="0" cellspacing="0" style="font-size:12px;border:none;padding:0px;border:0px;margin:0px auto;border-collapse:separate; mso-table-lspace:0pt; mso-table-rspace:0pt;">
240
+ <tbody><tr>
241
+ <td align="center" class="txtsize" style="border:0px;padding:0px;color:#ffffff;font-family:Arial;font-weight:bold;text-align:center;border-radius:90px;text-align:center;cursor:pointer;">
242
+ <!--[if mso]>
243
+ <v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="mailto:info@brightappsllc.com?subject=Request for a Free Bright Apps QCloud Demo" style="border-radius:90px;height:48px;v-text-anchor:middle;width:181px" arcsize="90%" strokecolor="#ffffff" strokeweight ="0px" fillcolor="#ff8914">
244
+ <v:stroke dashstyle="solid" />
245
+ <w:anchorlock/>
246
+ <center style="color:#ffffff;font-family:Arial;font-size:11pt;font-weight:bold;">For More Information</center>
247
+ </v:roundrect>
248
+ <![endif]-->
249
+ <a align="center" href="mailto:info@brightappsllc.com?subject=Request for a Free Bright Apps QCloud Demo" style="padding:0px 0px;background-color:#ff8914;width:181px;line-height:48px;font-size:11pt;font-family:Arial;color:#ffffff;cursor:pointer;text-decoration:none;border-radius:90px;border:0px solid #ffffff;display:inline-block;mso-hide:all;text-align:center;">
250
+ <span style="color:#ffffff;line-height:48px">
251
+ For More Information
252
+ </span>
253
+ </a>
254
+ </td>
255
+ </tr>
256
+ </tbody></table>
257
+ </div>
258
+ </div>
259
+ </td></tr></tbody></table>
260
+ </td></tr>
261
+ <tr><td class="txtsize" id="elm_1514380725790" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+ <div class="zpelement-wrapper spacebar" id="elm_1514380725790" style=";word-wrap:break-word;overflow:hidden;background-color:#ff9900;">
295
+
296
+ <table bgcolor="#ff9900" border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="padding:0px;border:0px;border-collapse:collapse; mso-table-lspace:0pt;font-size:5px; mso-table-rspace:0pt;word-break:break-word;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;height:5px;" width="100%">
297
+
298
+ <tbody><tr><td style="padding:0px;border:0px;font-size:5px;height:5px;border-top:none none none;border-bottom:none none none;">
299
+
300
+ &nbsp;&nbsp;&nbsp;
301
+
302
+ </td></tr>
303
+
304
+ </tbody></table>
305
+
306
+ </div>
307
+
308
+ </td></tr>
309
+ <tr><td class="txtsize" id="elm_1567487224662" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+ <div class="zpelement-wrapper wdgts" id="elm_1567487224662" style="overflow:hidden;word-wrap:break-word;">
321
+ <table bgcolor border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="padding:0px;border:0px;border-collapse:collapse; mso-table-lspace:0pt;font-size:5px; mso-table-rspace:0pt;word-break:break-word;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%; background-color:;" width="100%">
322
+ <tbody><tr><td style="padding:7px 15px;border:0px;font-size:5px;border-top:0px none ;border-bottom:0px none ;">
323
+ <table align="center" border="0" cellpadding="0" cellspacing="0" style="border-collapse:collapse;font-size:12px;min-width: 100%;border: none;" width="100%"><tbody><tr><td align="center" style="border: none;padding: 0px;margin: 0px;" valign="top"> <table align="center" border="0" cellpadding="0" cellspacing="0" icontext="true" index="1" name="zcsclwdgts_alnmnt" style="font-size:12px;border-collapse: collapse;border: none;margin:auto;"><tbody><tr><td align="left" style="border: none;padding: 0px;margin: 0px;" valign="top"> <table align="center" border="0" cellpadding="0" cellspacing="0" name="zcsclwdgtscontainer" style="border-collapse:collapse;font-size:12px;border: none;"><tbody><tr><td align="left" style="border:none;padding:0px;margin:0px;" valign="top"><table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;"><tbody><tr><td style="padding-right: 9px;padding-bottom: 9px;border:none;padding: 0px;margin: 0px;" valign="top"> <table border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: separate;border: none;"><tbody><tr><td align="left" style="padding:7px;padding-top: 0px;padding-right: 9px;padding-bottom: 0px;padding-left: 9px;border:none;" valign="middle"> <table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;" width><tbody><tr><td align="center" name="sclwdgtimges" style="border: none;padding: 0px;margin: 0px;padding-bottom: 6px;" valign="middle"> <a href="https://www.facebook.com/brightappsllc/" style="text-decoration:underline;display: block;font-size: 1px;" target="_blank" zcurl_name="l_4"><img alt="Facebook" src="https://campaign-image.com/zohocampaigns/526841000002370008_zcsclwgtfb1.png" style="border: 0px;margin: 0px;outline: none; text-decoration: none;" vspace="10"></a> </td></tr><tr><td align="center" name="sclwdgtcaptns" style="border:none;padding: 0px;margin: 0px;" valign="middle"><a href="https://www.facebook.com/brightappsllc/" style="display: block;font-size: 1px;font-weight: normal;line-height: normal;text-align: center;text-decoration: none;" target="_blank" zcurl_name="l_5"><p fntname="Arial" fntsze="8" style="font-family:Arial,verdana;font-size:12px; color:#000000;padding:0px;margin: 0;line-height: normal; font-family: Arial, Helvetica, sans-serif; color: rgb(27, 107, 189); font-size: 8pt;">Facebook</p></a> </td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td align="left" style="border:none;padding:0px;margin:0px;" valign="top"><table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;"><tbody><tr><td style="padding-right: 9px;padding-bottom: 9px;border:none;padding: 0px;margin: 0px;" valign="top"> <table border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: separate;border: none;"><tbody><tr><td align="left" style="padding:7px;padding-top: 0px;padding-right: 9px;padding-bottom: 0px;padding-left: 9px;border:none;" valign="middle"> <table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;" width><tbody><tr><td align="center" name="sclwdgtimges" style="border: none;padding: 0px;margin: 0px;padding-bottom: 6px;" valign="middle"> <a href="https://twitter.com/brightappsllc" style="text-decoration:underline;display: block;font-size: 1px;" target="_blank" zcurl_name="l_6"><img alt="Twitter" src="https://campaign-image.com/zohocampaigns/526841000002370008_zcsclwgttwt1.png" style="border: 0px;margin: 0px;outline: none; text-decoration: none;" vspace="10"></a> </td></tr><tr><td align="center" name="sclwdgtcaptns" style="border:none;padding: 0px;margin: 0px;" valign="middle"><a href="https://twitter.com/brightappsllc" style="display: block;font-size: 1px;font-weight: normal;line-height: normal;text-align: center;text-decoration: none;" target="_blank" zcurl_name="l_7"><p fntname="Arial" fntsze="8" style="font-family:Arial,verdana;font-size:12px; color:#000000;padding:0px;margin: 0;line-height: normal; font-family: Arial, Helvetica, sans-serif; color: rgb(27, 107, 189); font-size: 8pt;">Twitter</p></a> </td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td align="left" style="border:none;padding:0px;margin:0px;" valign="top"><table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;"><tbody><tr><td style="padding-right: 9px;padding-bottom: 9px;border:none;padding: 0px;margin: 0px;" valign="top"> <table border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: separate;border: none;"><tbody><tr><td align="left" style="padding:7px;padding-top: 0px;padding-right: 9px;padding-bottom: 0px;padding-left: 9px;border:none;" valign="middle"> <table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;" width><tbody><tr><td align="center" name="sclwdgtimges" style="border: none;padding: 0px;margin: 0px;padding-bottom: 6px;" valign="middle"> <a href="https://www.linkedin.com/Brightappsllc" style="text-decoration:underline;display: block;font-size: 1px;" target="_blank" zcurl_name="l_8"><img alt="LinkedIn" src="https://campaign-image.com/zohocampaigns/526841000002370008_zcsclwgtlin1.png" style="border: 0px;margin: 0px;outline: none; text-decoration: none;" vspace="10"></a> </td></tr><tr><td align="center" name="sclwdgtcaptns" style="border:none;padding: 0px;margin: 0px;" valign="middle"><a href="https://www.linkedin.com/Brightappsllc" style="display: block;font-size: 1px;font-weight: normal;line-height: normal;text-align: center;text-decoration: none;" target="_blank" zcurl_name="l_9"><p fntname="Arial" fntsze="8" style="font-family:Arial,verdana;font-size:12px; color:#000000;padding:0px;margin: 0;line-height: normal; font-family: Arial, Helvetica, sans-serif; color: rgb(27, 107, 189); font-size: 8pt;">LinkedIn</p></a> </td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td align="left" style="border:none;padding:0px;margin:0px;" valign="top"><table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;"><tbody><tr><td style="padding-right: 9px;padding-bottom: 9px;border:none;padding: 0px;margin: 0px;" valign="top"> <table border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: separate;border: none;"><tbody><tr><td align="left" style="padding:7px;padding-top: 0px;padding-right: 9px;padding-bottom: 0px;padding-left: 9px;border:none;" valign="middle"> <table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;" width><tbody><tr><td align="center" name="sclwdgtimges" style="border: none;padding: 0px;margin: 0px;padding-bottom: 6px;" valign="middle"> <a href="https://www.youtube.com/channel/UCdrA1YUr0E9w3sXmKSjVeOg/featured?view_as=subscriber" style="text-decoration:underline;display: block;font-size: 1px;" target="_blank" zcurl_name="l_10"><img alt="YouTube" src="https://campaign-image.com/zohocampaigns/526841000002370008_zcsclwgtyt1.png" style="border: 0px;margin: 0px;outline: none; text-decoration: none;" vspace="10"></a> </td></tr><tr><td align="center" name="sclwdgtcaptns" style="border:none;padding: 0px;margin: 0px;" valign="middle"><a href="https://www.youtube.com/channel/UCdrA1YUr0E9w3sXmKSjVeOg/featured?view_as=subscriber" style="display: block;font-size: 1px;font-weight: normal;line-height: normal;text-align: center;text-decoration: none;" target="_blank" zcurl_name="l_11"><p fntname="Arial" fntsze="8" style="font-family:Arial,verdana;font-size:12px; color:#000000;padding:0px;margin: 0;line-height: normal; font-family: Arial, Helvetica, sans-serif; color: rgb(27, 107, 189); font-size: 8pt;">YouTube</p></a> </td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td align="left" style="border:none;padding:0px;margin:0px;" valign="top"><table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;"><tbody><tr><td style="padding-right: 9px;padding-bottom: 9px;border:none;padding: 0px;margin: 0px;" valign="top"> <table border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: separate;border: none;"><tbody><tr><td align="left" style="padding:7px;padding-top: 0px;padding-right: 9px;padding-bottom: 0px;padding-left: 9px;border:none;" valign="middle"> <table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;" width><tbody><tr><td align="center" name="sclwdgtimges" style="border: none;padding: 0px;margin: 0px;padding-bottom: 6px;" valign="middle"> <a href="https://www.instagram.com/brightappsllc/" style="text-decoration:underline;display: block;font-size: 1px;" target="_blank" zcurl_name="l_12"><img alt="Instagram" src="https://campaign-image.com/zohocampaigns/526841000002370008_zcsclwgtinsta1.png" style="border: 0px;margin: 0px;outline: none; text-decoration: none;" vspace="10"></a> </td></tr><tr><td align="center" name="sclwdgtcaptns" style="border:none;padding: 0px;margin: 0px;" valign="middle"><a href="https://www.instagram.com/brightappsllc/" style="display: block;font-size: 1px;font-weight: normal;line-height: normal;text-align: center;text-decoration: none;" target="_blank" zcurl_name="l_13"><p fntname="Arial" fntsze="8" style="font-family:Arial,verdana;font-size:12px; color:#000000;padding:0px;margin: 0;line-height: normal; font-family: Arial, Helvetica, sans-serif; color: rgb(27, 107, 189); font-size: 8pt;">Instagram</p></a> </td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td align="left" style="border:none;padding:0px;margin:0px;" valign="top"><table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;"><tbody><tr><td style="padding-right: 9px;padding-bottom: 9px;border:none;padding: 0px;margin: 0px;" valign="top"> <table border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: separate;border: none;"><tbody><tr><td align="left" style="padding:7px;padding-top: 0px;padding-right: 9px;padding-bottom: 0px;padding-left: 9px;border:none;" valign="middle"> <table align="left" border="0" cellpadding="0" cellspacing="0" style="font-size:12px;border-collapse: collapse;border: none;" width><tbody><tr><td align="center" name="sclwdgtimges" style="border: none;padding: 0px;margin: 0px;padding-bottom: 6px;" valign="middle"> <a href="mailto:Info@brightappsllc.com" style="text-decoration:underline;display: block;font-size: 1px;" target="_blank"><img alt="Email" src="https://campaign-image.com/zohocampaigns/526841000002370008_zcsclwgtmail1.png" style="border: 0px;margin: 0px;outline: none; text-decoration: none;" vspace="10"></a> </td></tr><tr><td align="center" name="sclwdgtcaptns" style="border:none;padding: 0px;margin: 0px;" valign="middle"><a href="mailto:Info@brightappsllc.com" style="display: block;font-size: 1px;font-weight: normal;line-height: normal;text-align: center;text-decoration: none;" target="_blank"><p fntname="Arial" fntsze="8" style="font-family:Arial,verdana;font-size:12px; color:#000000;padding:0px;margin: 0;line-height: normal; font-family: Arial, Helvetica, sans-serif; color: rgb(27, 107, 189); font-size: 8pt;">Email</p></a> </td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table>
324
+ </td></tr>
325
+ </tbody></table>
326
+ </div>
327
+ </td></tr>
328
+ <tr><td class="txtsize" id="elm_1580343325901" style="border:0px;padding:0px 0px;border-collapse:collapse;" valign="top">
329
+
330
+
331
+ <div class="zpelement-wrapper divider" id="elm_1580343325901" style=";word-wrap:break-word;overflow:hidden;background-color:;">
332
+ <table bgcolor border="0" cellpadding="0" cellspacing="0" class="zpAlignPos" style="padding:0px;border:0px;border-collapse:collapse; mso-table-lspace:0pt;font-size:5px; mso-table-rspace:0pt;word-break:break-word;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color:;" width="100%">
333
+ <tbody><tr><td class="txtsize" style="border:0px;padding:18px 7px 18px 7px;border-collapse:collapse;">
334
+ <div class="divider" componentborder="#ff9900" style="margin:0px;padding:0px;text-align:center;"><table align="center" border="0" border-color="#ff9900" cellpadding="0" cellspacing="0" class="dvdrtbl" style="border-collapse:collapse;border:0px;font-size: 0px;width:70%;margin:auto;"> <tbody><tr><td align="center" height="0" style="border:0px;padding:7px;border-top: 5px dashed rgb(255, 153, 0); border-bottom: none rgb(255, 153, 0); border-left: none rgb(255, 153, 0); border-right: none rgb(255, 153, 0); font-size: 0px; margin: 0px; padding: 0px; width: 100%;" width="100%"> </td> </tr></tbody></table></div>
335
+ </td></tr></tbody></table>
336
+ </div>
337
+ </td></tr>
338
+ </tbody></table>
339
+ </div>
340
+
341
+ </td>
342
+ </tr>
343
+ </tbody></table>
344
+ </td>
345
+ <td style="border:0px;padding:0px;border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;">&nbsp;</td>
346
+ </tr>
347
+ </tbody></table>
348
+ </div>
349
+ </center>
350
+ </body></html>
figures/ModelCC.png ADDED
main_app.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+ st.set_page_config(layout="wide")
4
+
5
+ st.markdown(
6
+ """
7
+ <style>
8
+ body {
9
+ background-image: linear-gradient(#2e7bcf,#2e7bcf);
10
+ color: white;
11
+ }
12
+ </style>
13
+ """,
14
+ unsafe_allow_html=True,
15
+ )
models/models.sav ADDED
Binary file (3.22 kB). View file
 
requirements.txt ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ bokeh==2.4.1
2
+ joblib
3
+ boto3
4
+ pandas
5
+ urlextract
6
+ scikit-learn==0.24.1
7
+ bs4
8
+ matplotlib
9
+ numpy
10
+ plotly
11
+ streamlit==1.21.0