diff --git a/bash.exe.stackdump b/bash.exe.stackdump new file mode 100644 index 0000000000000000000000000000000000000000..f3a4fce2fa22dfe75b4b6dcaad6af101af172ac6 --- /dev/null +++ b/bash.exe.stackdump @@ -0,0 +1,16 @@ +Stack trace: +Frame Function Args +000FFFFCD30 00210062B0E (0021028A770, 00210275E51, 00000000001, 000FFFFB720) +000FFFFCD30 0021004846A (00210000000, 00200000000, 00000000000, 00000000001) +000FFFFCD30 002100484A2 (000006B0000, 000006CFA01, 00000000001, 000FFFFCBC0) +000FFFFCD30 0021006E416 (00210045323, 00210358AB8, 00000000000, 0000000000D) +000FFFFCD30 0021006E429 (00210045170, 0021023D7E0, 002100448F2, 000FFFFC920) +000FFFFCD30 002100713D4 (00000000013, 00000000001, 000FFFFC920, 00210278640) +000FFFFCD30 0021005AB65 (000FFFFCA70, 00000000000, 000FFFFCA78, 000FFFFFFFF) +000FFFFCD30 0021005B335 (000FFFFCD30, 000000303E9, 00210351408, 00210358478) +000FFFFCD30 0021005B847 (002100DF51E, 00000000000, 00000000000, 00000000000) +000FFFFCD30 0021005BB86 (002102308C0, 000FFFFCDF0, FFFFFFFFFFFFFFD1, 00000000000) +000FFFFCD30 00210048C0C (00000000000, 00000000000, 00000000000, 00000000000) +000FFFFFFF0 00210047716 (00000000000, 00000000000, 00000000000, 00000000000) +000FFFFFFF0 002100477C4 (00000000000, 00000000000, 00000000000, 00000000000) +End of stack trace diff --git a/data/embeddings.pkl b/data/embeddings.pkl new file mode 100644 index 0000000000000000000000000000000000000000..9ff040f44225b2eeacf82a949b89ecad6991ff59 --- /dev/null +++ b/data/embeddings.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27002092ffc208fad4e087d554dbfce116e7ac303dcfc12c4a333485f1a513ec +size 263380 diff --git a/data/filenamesdf.pkl b/data/filenamesdf.pkl new file mode 100644 index 0000000000000000000000000000000000000000..8bf1f00314b520be1d36e44891306a6f0089fc1b --- /dev/null +++ b/data/filenamesdf.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cb07a967c5f94b49807d02b97ee0cc8bad60849d38ea09f938b758a48a519e0 +size 3492 diff --git a/data/idx_to_pid.pkl b/data/idx_to_pid.pkl new file mode 100644 index 0000000000000000000000000000000000000000..3b83b5282ce833241ed54bfe968f466e06187e92 --- /dev/null +++ b/data/idx_to_pid.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a21a2f877c8cbdcdf3ddb8f89c6740f1d4b8f805050234f71aa60047947585ca +size 751 diff --git a/data/items_pivot.pkl b/data/items_pivot.pkl new file mode 100644 index 0000000000000000000000000000000000000000..57b680066c0e7ec43e2620d52f90ec95541ca526 --- /dev/null +++ b/data/items_pivot.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:585bf53706b0751e3316f5a90ed3b07adc475451c861db62274fab2352c530d8 +size 274255 diff --git a/data/lightfm-similarity.pkl b/data/lightfm-similarity.pkl new file mode 100644 index 0000000000000000000000000000000000000000..c22e3c874984bca6e078a23268b1c677a71d932e --- /dev/null +++ b/data/lightfm-similarity.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:858c67490d16778d42208cc7ff304805b4ff96c006edc3f8dd782838a41b2f9d +size 4248 diff --git a/data/pid_to_idx.pkl b/data/pid_to_idx.pkl new file mode 100644 index 0000000000000000000000000000000000000000..baa7e4cf785836be7cd6ba867904e7b7af3445de --- /dev/null +++ b/data/pid_to_idx.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a406640b7f440b6b09be1a0aaef90484aa68cad369ba859738e811a7f29e3e5 +size 751 diff --git a/data/products.pkl b/data/products.pkl new file mode 100644 index 0000000000000000000000000000000000000000..0287d7d1f38702ad0460d3373d44e8708915d194 --- /dev/null +++ b/data/products.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4601649aa61cafeb89e1e2ad01ac434b52d5db340b21efa865e4f02816434888 +size 27397 diff --git a/data/user_cart.pkl b/data/user_cart.pkl new file mode 100644 index 0000000000000000000000000000000000000000..6d4031f2c72f165ce9e79e6a712ebd8de96ceff0 --- /dev/null +++ b/data/user_cart.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:756d7317b7d6797feaddddbb59a0b57910d1df7f3e22527117c8dfa40d14ac99 +size 3988 diff --git a/images/000000000001448718.jpg b/images/000000000001448718.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47ec4980ca66e7c83156b4b1a254d4fae7dcd9c9 Binary files /dev/null and b/images/000000000001448718.jpg differ diff --git a/images/000000000001459264.jpg b/images/000000000001459264.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b08747b314f790da81238442798603a8d8a50765 Binary files /dev/null and b/images/000000000001459264.jpg differ diff --git a/images/000000000001462032.jpg b/images/000000000001462032.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f12833f20ddd26a0d462bb8360515eda2a64237 Binary files /dev/null and b/images/000000000001462032.jpg differ diff --git a/images/000000000001467736.jpg b/images/000000000001467736.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe818aa15986c009f89d7923777f035931a56ff3 Binary files /dev/null and b/images/000000000001467736.jpg differ diff --git a/images/000000000001467920 (2).jpg b/images/000000000001467920 (2).jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb7c54c85a52f2244ad7436ab0cf281e08305194 Binary files /dev/null and b/images/000000000001467920 (2).jpg differ diff --git a/images/000000000001467920.jpg b/images/000000000001467920.jpg new file mode 100644 index 0000000000000000000000000000000000000000..175c4790ebfa83d0d746f823c4bf8f0528ecc08b Binary files /dev/null and b/images/000000000001467920.jpg differ diff --git a/images/000000000001473527.jpg b/images/000000000001473527.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7c261fada7c58daaf1dbcc28a6533d19c57a389 Binary files /dev/null and b/images/000000000001473527.jpg differ diff --git a/images/000000000001482466.jpg b/images/000000000001482466.jpg new file mode 100644 index 0000000000000000000000000000000000000000..751db1ebe840aee14022337470316fa5bb382baf Binary files /dev/null and b/images/000000000001482466.jpg differ diff --git a/images/000000000001484653.jpg b/images/000000000001484653.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a4c36ae50c033cf95d7a35ec771ce0f7e59f93d Binary files /dev/null and b/images/000000000001484653.jpg differ diff --git a/images/000000000001484654.jpg b/images/000000000001484654.jpg new file mode 100644 index 0000000000000000000000000000000000000000..173bc1624ccfee8738386190821c1f634b264ede Binary files /dev/null and b/images/000000000001484654.jpg differ diff --git a/images/000000000001486109.jpg b/images/000000000001486109.jpg new file mode 100644 index 0000000000000000000000000000000000000000..59f3220779d72fbc970f4de90553732b4ecda319 Binary files /dev/null and b/images/000000000001486109.jpg differ diff --git a/images/000000000001486116.jpg b/images/000000000001486116.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a82a9570ecdea7f34d37666095233de864424b55 Binary files /dev/null and b/images/000000000001486116.jpg differ diff --git a/images/000000000001486966-2.jpg b/images/000000000001486966-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4fa426ba1a9c50701bb884a10217a92ca85553e4 Binary files /dev/null and b/images/000000000001486966-2.jpg differ diff --git a/images/000000000001486966.jpg b/images/000000000001486966.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2dfe910d09c4458c7f0a7eaa866d975fa4b0baf Binary files /dev/null and b/images/000000000001486966.jpg differ diff --git a/images/000000000001489102.jpg b/images/000000000001489102.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a65c2c1ce18d5eec55a1c080aaca40a21413cca Binary files /dev/null and b/images/000000000001489102.jpg differ diff --git a/images/000000000001489104.jpg b/images/000000000001489104.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aadfe1e34644a862065a7dcb1e8881058f91d89f Binary files /dev/null and b/images/000000000001489104.jpg differ diff --git a/images/000000000001494122.jpg b/images/000000000001494122.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19f59c088de7288a09cb0625d99d6092a8f1e9d0 Binary files /dev/null and b/images/000000000001494122.jpg differ diff --git a/images/00000000000150111.jpg b/images/00000000000150111.jpg new file mode 100644 index 0000000000000000000000000000000000000000..657d9ac323ac18d7947469ad2d859df5a219df6e Binary files /dev/null and b/images/00000000000150111.jpg differ diff --git a/images/000000000001501409.jpg b/images/000000000001501409.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a232f18b7e140401bc1d2229c4f178aae8cf789 Binary files /dev/null and b/images/000000000001501409.jpg differ diff --git a/images/000000000001501770.jpg b/images/000000000001501770.jpg new file mode 100644 index 0000000000000000000000000000000000000000..152be0fc282a9199e6e4d17d2162eb4b56ca3bb6 Binary files /dev/null and b/images/000000000001501770.jpg differ diff --git a/images/000000000001502222.jpg b/images/000000000001502222.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75850300b81e0fadcac53ad9451d22f21b267076 Binary files /dev/null and b/images/000000000001502222.jpg differ diff --git a/images/000000000001502333.jpg b/images/000000000001502333.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae14b4e454403640980bba07bf0ea96df723a89e Binary files /dev/null and b/images/000000000001502333.jpg differ diff --git a/images/000000000001502444.jpg b/images/000000000001502444.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d56e9b20a457c251b3115fdef6519b66619dd461 Binary files /dev/null and b/images/000000000001502444.jpg differ diff --git a/images/000000000001502629.jpg b/images/000000000001502629.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d957db600ac56c1c3d4285d49def4c6caf18ab1a Binary files /dev/null and b/images/000000000001502629.jpg differ diff --git a/images/000000000001502632.jpg b/images/000000000001502632.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea2f73f896f0e8e6514686e02849882995b9e46b Binary files /dev/null and b/images/000000000001502632.jpg differ diff --git a/images/000000000001502632.png b/images/000000000001502632.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3ab0598990f31bd895cf16617794b569dc41e9 Binary files /dev/null and b/images/000000000001502632.png differ diff --git a/images/000000000001502643.jpg b/images/000000000001502643.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ab1f45bb6367d84417ee45f367484cee0b31da3 Binary files /dev/null and b/images/000000000001502643.jpg differ diff --git a/images/000000000001502646.jpg b/images/000000000001502646.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38910aee8c5de4a57e24d0cb5a11a907f64d381a Binary files /dev/null and b/images/000000000001502646.jpg differ diff --git a/images/000000000001502647.jpg b/images/000000000001502647.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38910aee8c5de4a57e24d0cb5a11a907f64d381a Binary files /dev/null and b/images/000000000001502647.jpg differ diff --git a/images/000000000001502648.jpg b/images/000000000001502648.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc3279030efc3396328dd87222291fc9e9b9dd00 Binary files /dev/null and b/images/000000000001502648.jpg differ diff --git a/images/000000000001502658.jpg b/images/000000000001502658.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f10557e7f5691298d3aba0558384bd22dc76b540 Binary files /dev/null and b/images/000000000001502658.jpg differ diff --git a/images/000000000001502777.jpg b/images/000000000001502777.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01c7c7347265e2cebd77c43570a67d1330803423 Binary files /dev/null and b/images/000000000001502777.jpg differ diff --git a/images/000000000001502999.jpg b/images/000000000001502999.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9b62f2acf8117e4b72b080075bfbe5f7b1fe2dd Binary files /dev/null and b/images/000000000001502999.jpg differ diff --git a/images/000000000001505263.jpg b/images/000000000001505263.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fff10e84d33c1754390afced6fda7520636a857e Binary files /dev/null and b/images/000000000001505263.jpg differ diff --git a/images/000000000001509819.jpg b/images/000000000001509819.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db1cbd7ee8d97030234f63b7d4bf890bb4c708c4 Binary files /dev/null and b/images/000000000001509819.jpg differ diff --git a/images/desktop.ini b/images/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..b801375d7203541b3cae77c4c3a428d379f36596 --- /dev/null +++ b/images/desktop.ini @@ -0,0 +1,2 @@ +[LocalizedFileNames] +W GLYNE 300 SWS ZIP.jpg=@W GLYNE 300 SWS ZIP,0 diff --git a/images/header-gosport.jpg b/images/header-gosport.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f3de4a4e80de2560ec245e81158b392cc1e3b6d Binary files /dev/null and b/images/header-gosport.jpg differ diff --git a/images/logo-recom.png b/images/logo-recom.png new file mode 100644 index 0000000000000000000000000000000000000000..f131a449fb31180d256da7981704bae4064c7eeb Binary files /dev/null and b/images/logo-recom.png differ diff --git a/images/logo-recom2.png b/images/logo-recom2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe991d3cf5528ee69a30514ddb37f092aa5d143b Binary files /dev/null and b/images/logo-recom2.png differ diff --git a/images/montre-connecte.jpg b/images/montre-connecte.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a1a11465dfb061ae0c6fa74b790296caf10c3e7 Binary files /dev/null and b/images/montre-connecte.jpg differ diff --git a/images/sac.jpg b/images/sac.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b00df8e6c28fabb17fbf36a056bc3a808b9feeb0 Binary files /dev/null and b/images/sac.jpg differ diff --git a/images/shoes.jpg b/images/shoes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea4231b0916b00faae7c356ff35ebfa4ba035345 Binary files /dev/null and b/images/shoes.jpg differ diff --git a/images/survet.jpg b/images/survet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31b165b18a6a9bfebf96baa16303bfb8d7fa3494 Binary files /dev/null and b/images/survet.jpg differ diff --git a/images/velo.jpg b/images/velo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b2e908f2c5ca6c0c521426e740e6514d07ae23e Binary files /dev/null and b/images/velo.jpg differ diff --git a/pages/01_Admin_dashboard.py b/pages/01_Admin_dashboard.py new file mode 100644 index 0000000000000000000000000000000000000000..dc49f3a44dbee6a3080ad581d5992cbc20e670f9 --- /dev/null +++ b/pages/01_Admin_dashboard.py @@ -0,0 +1,159 @@ +import streamlit as st +import pandas as pd +import matplotlib.pyplot as plt +import glob +import streamlit as st +import os +from PIL import Image +import numpy as np +import pickle +from sklearn.neighbors import NearestNeighbors +import requests +from streamlit_lottie import st_lottie + + + + + +def main(): + + st.set_page_config(layout="wide", initial_sidebar_state='expanded') + st.image("images/logo-recom2.png", width=100) + with open('style.css') as f: + st.markdown(f'', unsafe_allow_html=True) + + + + hide_menu = """ + + """ + + def load_lottie(url): + r = requests.get(url) + if r.status_code != 200: + return None + return r.json() + + + + hello = st.columns(6) + with hello[2]: + lottie_robot= load_lottie("https://assets3.lottiefiles.com/packages/lf20_3vbOcw.json") + st_lottie(lottie_robot, height=100, key="robot") + + hello[1].markdown("

Welcome Admin !

",unsafe_allow_html=True) + st.markdown("
", unsafe_allow_html=True) + st.markdown("

Key Metrics

",unsafe_allow_html=True) + + + kpi= st.columns(3) + kpi[0].metric("Weekly Visits", "35642","+45%") + kpi[1].metric("Sales - 7 days", "5970", "+70%") + kpi[2].metric("Conversions -7 days", "9538","+35%") + + st.markdown("
", unsafe_allow_html=True) + + ### second row + + st.markdown("

Secondary Metrics

",unsafe_allow_html=True) + + first_kpi, second_kpi, third_kpi, fourth_kpi, fifth_kpi, sixth_kpi = st.columns(6) + + + with first_kpi: + st.markdown("**First KPI**") + number1 = 413486 + st.markdown(f"

{number1}

", unsafe_allow_html=True) + + with second_kpi: + st.markdown("**Second KPI**") + number2 = 254869 + st.markdown(f"

{number2}

", unsafe_allow_html=True) + + with third_kpi: + st.markdown("**Third KPI**") + number3 = 33657 + st.markdown(f"

{number3}

", unsafe_allow_html=True) + + with fourth_kpi: + st.markdown("**Fourth KPI**") + number1 = 53478 + st.markdown(f"

{number1}

", unsafe_allow_html=True) + + with fifth_kpi: + st.markdown("**Fifth KPI**") + number2 = 18690 + st.markdown(f"

{number2}

", unsafe_allow_html=True) + + with sixth_kpi: + st.markdown("**Sixth KPI**") + number3 = 333.597 + st.markdown(f"

{number3}

", unsafe_allow_html=True) + + st.markdown("
", unsafe_allow_html=True) + + + st.markdown("

Important charts

",unsafe_allow_html=True) + chart_data = pd.DataFrame( + np.random.randn(14,3), + columns = ['a','b','c']) + + charts = st.columns((2,0.3,2)) + charts[0].markdown("chart 1 ") + charts[0].bar_chart(chart_data) + + + df = pd.DataFrame( + np.random.randn(200, 3), + columns=['a', 'b', 'c']) + + df2 = pd.DataFrame( + np.random.randn(450, 3), + columns=['a', 'b', 'c']) + charts[0].markdown("chart 3 ") + charts[0].vega_lite_chart(df, { + 'mark': {'type': 'circle', 'tooltip': True}, + 'encoding': { + 'x': {'field': 'a', 'type': 'quantitative'}, + 'y': {'field': 'b', 'type': 'quantitative'}, + 'size': {'field': 'c', 'type': 'quantitative'}, + 'color': {'field': 'c', 'type': 'quantitative'}, + }, + }) + charts[2].markdown("chart 2 ") + charts[2].vega_lite_chart(df2, { + 'mark': {'type': 'circle', 'tooltip': True}, + 'encoding': { + 'x': {'field': 'a', 'type': 'quantitative'}, + 'y': {'field': 'b', 'type': 'quantitative'}, + 'size': {'field': 'c', 'type': 'quantitative'}, + 'color': {'field': 'c', 'type': 'quantitative'}, + }, + }) + charts[2].markdown("chart 4 ") + charts[2].line_chart(chart_data) + + + + + st.markdown(hide_menu, unsafe_allow_html=True) + + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/pages/02_Recommendation_system.py b/pages/02_Recommendation_system.py new file mode 100644 index 0000000000000000000000000000000000000000..ae7132fd13bd7132116a005766b51e577526e44f --- /dev/null +++ b/pages/02_Recommendation_system.py @@ -0,0 +1,433 @@ +import streamlit as st +import pandas as pd +import numpy as np +from PIL import Image +import matplotlib.pyplot as plt +import glob +from scipy.sparse import csr_matrix +from sklearn.neighbors import NearestNeighbors +import pickle +import io +import streamlit.components.v1 as stc + + + + + + +def main(): + + st.set_page_config(layout="wide", initial_sidebar_state='expanded') + st.image("images/logo-recom2.png", width=100) + with open('style.css') as f: + st.markdown(f'', unsafe_allow_html=True) + + hide_menu = """ + + """ + + st.markdown(hide_menu, unsafe_allow_html=True) + + + sidebar_header = '''This is a demo of Recom solution version 1.0.0. This demo gathers the main options. Please give it a try :''' + + page_options = ["Recommendations base on reviews", + "Recommendations based on product similarity", + "Generate email"] + + st.sidebar.info(sidebar_header) + + + + page_selection = st.sidebar.radio("Try", page_options) + + + ######################################################################################### + if page_selection == "Recommendations base on reviews": + pid_to_idx = pd.read_pickle("data/pid_to_idx.pkl") + idx_to_pid = pd.read_pickle("data/idx_to_pid.pkl") + + + products = pd.read_pickle("data/products.pkl") + lightfm_similarity = pd.read_pickle("data/lightfm-similarity.pkl") + items_pivot=pd.read_pickle("data/items_pivot.pkl") + items_sparse = csr_matrix(items_pivot) + model = NearestNeighbors(algorithm="brute") + model.fit(items_sparse) + + + def get_product_name(pid, product): + try: + name = products.loc[products.product_ids == pid].titles.values[0] + except: + name = "Unknown" + return name + + def get_product_id(name): + try: + product_id = products.loc[products.titles == name].product_ids.values[0] + except: + product_id = "Unknown" + return product_id + + + def get_sim_scores(pid): + idx = pid_to_idx[pid] + sims = lightfm_similarity[idx] + return sims + + + def get_ranked_recos(sims): + recos = [] + + for idx in np.argsort(-sims): + pid = idx_to_pid[idx] + name = get_product_name(pid, products) + score = sims[idx] + recos.append((name,pid)) + return recos + + + + + st.markdown('

Products Recommender System

', unsafe_allow_html=True) + st.markdown('This option will allow you to publish on your site recommendations of products "appreciated by other customers". These recommendations are based on the reviews of other customers. ') + product_list = products['titles'].values + selected_product = st.selectbox( + "Type or select a product from the dropdown", + product_list + ) + product_id = get_product_id(selected_product) + sims = get_sim_scores(product_id) + result = get_ranked_recos(sims)[:5] + + recommendation_button = st.button('Show Recommendation') + if recommendation_button: + product_id = get_product_id(selected_product) + sims = get_sim_scores(product_id) + result = get_ranked_recos(sims)[:5] + + + with st.form("reco1"): + cols = st.columns((1, 3)) + cols[0].image('images/'+result[0][1]+'.jpg', width=200) + cols[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols[1].markdown(result[0]) + cols[1].markdown("Url : yoursiteurl") + cols[1].markdown('

Description :

', unsafe_allow_html=True) + cols[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + with cols[1]: + submitted = st.form_submit_button('Deploy') + submitted_all = st.form_submit_button('Deploy All') + + + + + with st.form("reco2"): + cols2 = st.columns((1, 3)) + cols2[0].image('images/'+result[1][1]+'.jpg', width=200) + cols2[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols2[1].text(result[1]) + cols2[1].markdown("Url : yoursiteurl") + cols2[1].markdown('

Description :

', unsafe_allow_html=True) + cols2[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + cols2[1].form_submit_button('Deploy') + cols2[1].form_submit_button('Deploy All') + + + + with st.form("reco3"): + cols3= st.columns((1, 3)) + cols3[0].image('images/'+result[2][1]+'.jpg', width=200) + cols3[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols3[1].text(result[2]) + cols3[1].markdown("Url : yoursiteurl") + cols3[1].markdown('

Description :

', unsafe_allow_html=True) + cols3[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + cols3[1].form_submit_button('Deploy') + cols3[1].form_submit_button('Deploy All') + + + with st.form("reco4"): + cols4 = st.columns((1, 3)) + cols4[0].image('images/'+result[3][1]+'.jpg', width=200) + cols4[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols4[1].text(result[3]) + cols4[1].markdown("Url : yoursiteurl") + cols4[1].markdown('

Description :

', unsafe_allow_html=True) + cols4[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + cols4[1].form_submit_button('Deploy') + cols4[1].form_submit_button('Deploy All') + + + + with st.form("reco5"): + cols5 = st.columns((1, 3)) + cols5[0].image('images/'+result[4][1]+'.jpg', width=200) + cols5[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols5[1].text(result[4]) + cols5[1].markdown("Url : yoursiteurl") + cols5[1].markdown('

Description :

', unsafe_allow_html=True) + cols5[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + cols5[1].form_submit_button('Deploy') + cols5[1].form_submit_button('Deploy All') + + st.markdown("
", unsafe_allow_html=True) + st.success("Successfuly Deployed !") + st.success("output 'Deploy' :") + st.write("Clients also liked : ") + st.image('images/'+result[4][1]+'.jpg', width=150) + st.markdown(result[0][0]) + + st.markdown("
", unsafe_allow_html=True) + st.success("Successfuly Deployed !") + st.success("output 'Deploy All' :") + + st.write("Clients also liked : ") + cols_deploy = st.columns(5) + cols_deploy[0].image('images/'+result[0][1]+'.jpg', width=150) + cols_deploy[0].markdown(result[0][0]) + cols_deploy[1].image('images/'+result[1][1]+'.jpg', width=150) + cols_deploy[1].markdown(result[1][0]) + cols_deploy[2].image('images/'+result[2][1]+'.jpg', width=150) + cols_deploy[2].markdown(result[2][0]) + cols_deploy[3].image('images/'+result[3][1]+'.jpg', width=150) + cols_deploy[3].markdown(result[3][0]) + cols_deploy[4].image('images/'+result[4][1]+'.jpg', width=150) + cols_deploy[4].markdown(result[4][0]) + +######################################################################################### + + + if page_selection == "Recommendations based on product similarity": + products = pd.read_pickle("data/products.pkl") + feature_list = np.array(pickle.load(open('data/embeddings.pkl','rb'))) + filenames = pickle.load(open('data/filenamesdf.pkl','rb')) + + + def recommend(features,feature_list): + neighbors = NearestNeighbors(n_neighbors=6, algorithm='brute', metric='euclidean') + neighbors.fit(feature_list) + + distances, indices = neighbors.kneighbors([features]) + + return indices + + def reco2(indices): + for i in range(len(indices)): + cols = st.columns((1, 3)) + cols[1].markdown(filenames.index[indices[i]]) + cols[1].markdown(filenames.titles[indices[i]]) + cols[0].image(filenames.image_path[indices[i]].tolist()) + + + st.markdown("

Recommender System - image similarity

", unsafe_allow_html=True) + st.markdown('This feature will enable you to publish on your site recommendations of "similar products". These recommendations are based on similarities between product images.') + product_list = filenames['titles'].values + + selected_product = st.selectbox("Type or select a product from the dropdown",product_list) + + if st.button('Recommendation'): + + id = np.where(selected_product == product_list) + id2 = int(id[0]) + + result= recommend(feature_list[id2],feature_list) + results = list(result) + + with st.form("reco1"): + cols = st.columns((1, 3)) + cols[0].image(filenames.image_path[results[0]].tolist()[0], width=200) + cols[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols[1].markdown(filenames.titles[results[0]].tolist()[0]) + cols[1].markdown('

Description :

', unsafe_allow_html=True) + cols[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + cols[1].form_submit_button('Deploy') + + with st.form("reco2"): + cols = st.columns((1, 3)) + cols[0].image(filenames.image_path[results[0]].tolist()[1], width=200) + cols[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols[1].markdown(filenames.titles[results[0]].tolist()[1]) + cols[1].markdown('

Description :

', unsafe_allow_html=True) + cols[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + cols[1].form_submit_button('Deploy') + + + with st.form("reco3"): + cols = st.columns((1, 3)) + cols[0].image(filenames.image_path[results[0]].tolist()[2], width=200) + cols[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols[1].markdown(filenames.titles[results[0]].tolist()[2]) + cols[1].markdown('

Description :

', unsafe_allow_html=True) + cols[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + cols[1].form_submit_button('Deploy') + + with st.form("reco4"): + cols = st.columns((1, 3)) + cols[0].image(filenames.image_path[results[0]].tolist()[3], width=200) + cols[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols[1].markdown(filenames.titles[results[0]].tolist()[3]) + cols[1].markdown('

Description :

', unsafe_allow_html=True) + cols[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + cols[1].form_submit_button('Deploy') + + with st.form("reco5"): + cols = st.columns((1, 3)) + cols[0].image(filenames.image_path[results[0]].tolist()[4], width=200) + cols[1].markdown('

Product Name and ID:

', unsafe_allow_html=True) + cols[1].markdown(filenames.titles[results[0]].tolist()[4]) + cols[1].markdown('

Description :

', unsafe_allow_html=True) + cols[1].text('Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt \nut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco.') + cols[1].form_submit_button('Deploy') + cols[1].form_submit_button('Deploy All') + + st.markdown("
", unsafe_allow_html=True) + st.success("Successfuly Deployed !") + st.success("output 'Deploy' :") + st.write("Similar products : ") + st.image(filenames.image_path[results[0]].tolist()[0], width=150) + st.markdown(filenames.titles[results[0]].tolist()[4]) + + st.markdown("
", unsafe_allow_html=True) + st.success("Successfuly Deployed !") + st.success("output 'Deploy All' :") + st.write("Similar products : ") + cols_deploy = st.columns(5) + cols_deploy[0].image(filenames.image_path[results[0]].tolist()[0], width=150) + cols_deploy[0].markdown(filenames.titles[results[0]].tolist()[0]) + cols_deploy[1].image(filenames.image_path[results[0]].tolist()[1], width=150) + cols_deploy[1].markdown(filenames.titles[results[0]].tolist()[1]) + cols_deploy[2].image(filenames.image_path[results[0]].tolist()[2], width=150) + cols_deploy[2].markdown(filenames.titles[results[0]].tolist()[2]) + cols_deploy[3].image(filenames.image_path[results[0]].tolist()[3], width=150) + cols_deploy[3].markdown(filenames.titles[results[0]].tolist()[3]) + cols_deploy[4].image(filenames.image_path[results[0]].tolist()[4], width=150) + cols_deploy[4].markdown(filenames.titles[results[0]].tolist()[4]) + + +######################################################################################### + + + if page_selection == "Generate email": + user_cart = pd.read_pickle('data/user_cart.pkl') + name_list = user_cart['user_name'].values + feature_list = np.array(pickle.load(open('data/embeddings.pkl','rb'))) + filenames = pickle.load(open('data/filenamesdf.pkl','rb')) + + + def recommend(features,feature_list): + neighbors = NearestNeighbors(n_neighbors=6, algorithm='brute', metric='euclidean') + neighbors.fit(feature_list) + + distances, indices = neighbors.kneighbors([features]) + + return indices + + def reco2(indices): + for i in range(len(indices)): + cols = st.columns((1, 3)) + cols[1].markdown(filenames.index[indices[i]]) + cols[1].markdown(filenames.titles[indices[i]]) + cols[0].image(filenames.image_path[indices[i]].tolist()) + + st.markdown("

Mail Generator

", unsafe_allow_html=True) + st.markdown('With this feature you will be able to generate automatic emails to ask for feedback from old and new customers.\nThis email will include a request for feedback on the last product purchased, \nas well as product recommendations.', unsafe_allow_html=True) + + selected_user = st.selectbox("Type or select a user from the dropdown",name_list) + + + if st.button('generate mailing'): + + name = np.where(selected_user == user_cart['user_name'].values) + name_id = int(name[0]) + reco_mailing2 = recommend(feature_list[name_id],feature_list) + reco_mailing2 = list(reco_mailing2) + + st.markdown('>To: '+ selected_user+'', unsafe_allow_html=True) + st.markdown("
", unsafe_allow_html=True) + + st.markdown("

Hello "+ selected_user+' :) !Rate your purchased product:

', unsafe_allow_html=True) + #[a scale from 1 to 5] + cols= st.columns((3)) + cols[0].empty() + cols[1].markdown(user_cart.titles[name_id]) + cols[1].image(user_cart.image_path[name_id], width=200) + cols[1].markdown(":star::star::star::star::star:") + + cols[1].button('Rate this article on company.com') + cols[2].empty() + + st.text('\n\n') + + + + st.markdown('Your feedback helps us improve and reach more great customers like you.') + + + st.text('\n\n') + st.markdown("
", unsafe_allow_html=True) + + st.markdown('

Discover products in the same category:

', unsafe_allow_html=True) + st.text('\n\n') + cols_mail = st.columns((7)) + cols_mail[0].empty() + cols_mail[1].image(filenames.image_path[reco_mailing2[0]].tolist()[0], width=100) + cols_mail[1].markdown(filenames.titles[reco_mailing2[0]].tolist()[0]) + cols_mail[1].markdown(":star::star::star::star::star:") + cols_mail[2].image(filenames.image_path[reco_mailing2[0]].tolist()[1], width=100) + cols_mail[2].markdown(filenames.titles[reco_mailing2[0]].tolist()[1]) + cols_mail[2].markdown(":star::star::star::star:") + cols_mail[3].image(filenames.image_path[reco_mailing2[0]].tolist()[2], width=100) + cols_mail[3].markdown(filenames.titles[reco_mailing2[0]].tolist()[2]) + cols_mail[3].markdown(":star::star::star::star::star:") + cols_mail[4].image(filenames.image_path[reco_mailing2[0]].tolist()[3], width=100) + cols_mail[4].markdown(filenames.titles[reco_mailing2[0]].tolist()[3]) + cols_mail[4].markdown(":star::star::star::star:") + cols_mail[5].image(filenames.image_path[reco_mailing2[0]].tolist()[4], width=100) + cols_mail[5].markdown(filenames.titles[reco_mailing2[0]].tolist()[4]) + cols_mail[5].markdown(":star::star::star::star::star:") + cols_mail[6].empty() + + st.text('\n\n') + st.markdown("
", unsafe_allow_html=True) + st.markdown('

Discover our new products:

', unsafe_allow_html=True) + st.text('\n\n') + cols_mail2 = st.columns((4)) + + cols_mail2[0].image('images/velo.jpg', width=200) + cols_mail2[1].image('images/sac.jpg', width=200) + cols_mail2[2].image('images/shoes.jpg', width=200) + cols_mail2[3].image('images/survet.jpg', width=200) + + st.text('\n\n\n\n') + st.markdown("
", unsafe_allow_html=True) + + st.markdown('Always yours,') + st.markdown('[company] team') + + + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/recom.py b/recom.py new file mode 100644 index 0000000000000000000000000000000000000000..9bdd6a55c4275e9f27c984004cee178f7a00d6e2 --- /dev/null +++ b/recom.py @@ -0,0 +1,77 @@ +#imports + +import streamlit as st +import pandas as pd +from PIL import Image +import pickle +from pathlib import Path +import requests +from streamlit_lottie import st_lottie + + + + + + +def main(): + st.set_page_config(layout="wide") + with open('style.css') as f: + st.markdown(f'', unsafe_allow_html=True) + + + hide_menu = """ + + """ + + hide_sidebar = """ + + """ + + st.markdown(hide_menu, unsafe_allow_html=True) + st.markdown(hide_sidebar, unsafe_allow_html=True) + + + def load_lottie(url): + r = requests.get(url) + if r.status_code != 200: + return None + return r.json() + + lottie = load_lottie("https://assets2.lottiefiles.com/private_files/lf30_zSGy1w.json") + st.image("images/logo-recom2.png") + cols = st.columns((2,3)) + with cols[1]: + + st_lottie(lottie, height=400, key="coding") + with cols[0]: + st.markdown("

Hello :)

", unsafe_allow_html=True) + login = st.text_input("Username: ", 'admin') + password = st.text_input("Password: ", "recom_demo") + st.markdown('LOGIN', unsafe_allow_html=True) + + + + +if __name__ == '__main__': + main() + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..480be0bc958db04e9092c6f2cbc24717e96a9ed3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,222 @@ +absl-py==1.2.0 +altair==4.2.0 +anyio==3.6.1 +argon2-cffi==21.3.0 +argon2-cffi-bindings==21.2.0 +asttokens==2.0.5 +astunparse==1.6.3 +async-generator==1.10 +atomicwrites==1.4.1 +attrs==22.1.0 +Babel==2.10.3 +backcall==0.2.0 +bcrypt==4.0.0 +beautifulsoup4==4.11.1 +bleach==5.0.1 +blinker==1.5 +blis==0.7.8 +bokeh==2.4.3 +Brotli==1.0.9 +bs4==0.0.1 +cachetools==5.2.0 +catalogue==2.0.8 +catboost==1.0.6 +certifi==2021.10.8 +cffi==1.15.1 +charset-normalizer==2.1.0 +click==8.1.3 +colorama==0.4.5 +commonmark==0.9.1 +cycler==0.11.0 +cymem==2.0.6 +Cython==0.29.28 +dash==2.6.1 +dash-core-components==2.0.0 +dash-html-components==2.0.0 +dash-table==5.0.0 +debugpy==1.6.2 +decorator==5.1.1 +defusedxml==0.7.1 +docopt==0.6.2 +en-core-web-md @ https://github.com/explosion/spacy-models/releases/download/en_core_web_md-3.4.0/en_core_web_md-3.4.0-py3-none-any.whl +en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.4.0/en_core_web_sm-3.4.0-py3-none-any.whl +entrypoints==0.4 +executing==0.9.1 +extra-streamlit-components==0.1.55 +fastapi==0.79.0 +fastjsonschema==2.16.1 +Flask==2.2.1 +Flask-Compress==1.12 +flatbuffers==1.12 +fonttools==4.34.4 +fr-core-news-md @ https://github.com/explosion/spacy-models/releases/download/fr_core_news_md-3.4.0/fr_core_news_md-3.4.0-py3-none-any.whl +fr-core-news-sm @ https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-3.4.0/fr_core_news_sm-3.4.0-py3-none-any.whl +funcy==1.17 +future==0.18.2 +gast==0.4.0 +gensim==4.2.0 +gitdb==4.0.9 +GitPython==3.1.27 +google-auth==2.9.1 +google-auth-oauthlib==0.4.6 +google-pasta==0.2.0 +graphviz==0.20.1 +grpcio==1.47.0 +h11==0.13.0 +h5py==3.7.0 +idna==3.3 +imbalanced-learn==0.9.1 +importlib-metadata==4.12.0 +iniconfig==1.1.1 +install==1.3.5 +ipykernel==6.15.1 +ipython==8.4.0 +ipython-genutils==0.2.0 +ipywidgets==7.7.1 +itsdangerous==2.1.2 +jedi==0.18.1 +Jinja2==3.1.2 +joblib==1.1.0 +json5==0.9.9 +jsonschema==4.9.1 +jupyter-client==7.3.4 +jupyter-core==4.11.1 +jupyter-server==1.18.1 +jupyterlab==3.4.4 +jupyterlab-pygments==0.2.2 +jupyterlab-server==2.15.0 +jupyterlab-widgets==1.1.1 +keras==2.9.0 +Keras-Preprocessing==1.1.2 +kiwisolver==1.4.4 +langcodes==3.3.0 +libclang==14.0.6 +lightgbm==3.3.2 +Markdown==3.4.1 +MarkupSafe==2.1.1 +matplotlib==3.5.2 +matplotlib-inline==0.1.3 +mistune==0.8.4 +murmurhash==1.0.7 +names==0.3.0 +nbclassic==0.4.3 +nbclient==0.6.6 +nbconvert==6.5.0 +nbformat==5.4.0 +nest-asyncio==1.5.5 +nltk==3.7 +notebook==6.4.12 +notebook-shim==0.1.0 +numexpr==2.8.3 +numpy==1.23.1 +oauthlib==3.2.0 +opencv-python==4.6.0.66 +opt-einsum==3.3.0 +outcome==1.2.0 +packaging==21.3 +pandas==1.4.3 +pandocfilters==1.5.0 +parso==0.8.3 +pathy==0.6.2 +pickleshare==0.7.5 +Pillow==9.2.0 +pipreqs==0.4.11 +plotly==5.9.0 +pluggy==1.0.0 +preshed==3.0.6 +prometheus-client==0.14.1 +prompt-toolkit==3.0.30 +protobuf==3.19.4 +psutil==5.9.1 +pure-eval==0.2.2 +py==1.11.0 +pyarrow==9.0.0 +pyasn1==0.4.8 +pyasn1-modules==0.2.8 +pycparser==2.21 +pydantic==1.9.1 +pydeck==0.7.1 +Pygments==2.12.0 +PyJWT==2.4.0 +pyLDAvis==2.1.2 +Pympler==1.0.1 +pyparsing==3.0.9 +pyrsistent==0.18.1 +PySocks==1.7.1 +pytest==7.1.2 +python-dateutil==2.8.2 +python-decouple==3.6 +pytz==2022.1 +pytz-deprecation-shim==0.1.0.post0 +pywin32==304 +pywinpty==2.0.6 +PyYAML==6.0 +pyzmq==23.2.0 +regex==2022.7.25 +requests==2.28.1 +requests-oauthlib==1.3.1 +rich==12.5.1 +rsa==4.9 +scikit-learn==1.1.1 +scipy==1.9.0 +seaborn==0.11.2 +selenium==4.4.2 +semver==2.13.0 +Send2Trash==1.8.0 +six==1.16.0 +smart-open==5.2.1 +smmap==5.0.0 +sniffio==1.2.0 +sortedcontainers==2.4.0 +soupsieve==2.3.2.post1 +spacy==3.4.1 +spacy-legacy==3.0.9 +spacy-loggers==1.0.3 +srsly==2.4.4 +stack-data==0.3.0 +starlette==0.19.1 +streamlit==1.12.2 +streamlit-aggrid==0.3.3 +streamlit-authenticator==0.2.1 +streamlit-lottie==0.0.3 +streamlit-option-menu==0.3.2 +tenacity==8.0.1 +tensorboard==2.9.1 +tensorboard-data-server==0.6.1 +tensorboard-plugin-wit==1.8.1 +tensorflow==2.9.1 +tensorflow-estimator==2.9.0 +tensorflow-io-gcs-filesystem==0.26.0 +termcolor==1.1.0 +terminado==0.15.0 +textblob==0.17.1 +thinc==8.1.0 +threadpoolctl==3.1.0 +tinycss2==1.1.1 +toml==0.10.2 +tomli==2.0.1 +toolz==0.12.0 +tornado==6.2 +tqdm==4.64.0 +traitlets==5.3.0 +trio==0.21.0 +trio-websocket==0.9.2 +typer==0.4.2 +typing_extensions==4.3.0 +tzdata==2022.1 +tzlocal==4.2 +urllib3==1.26.11 +uvicorn==0.18.2 +validators==0.20.0 +wasabi==0.10.1 +watchdog==2.1.9 +wcwidth==0.2.5 +webencodings==0.5.1 +websocket-client==1.3.3 +Werkzeug==2.2.1 +widgetsnbextension==3.6.1 +wrapt==1.14.1 +wsproto==1.1.0 +xgboost==1.6.1 +yarg==0.1.9 +zipp==3.8.1 diff --git a/style.css b/style.css new file mode 100644 index 0000000000000000000000000000000000000000..1fc194673db7f2fe83770c7f9d53a479e505ed3d --- /dev/null +++ b/style.css @@ -0,0 +1,95 @@ + +.css-k7ct77 { + color: #FFFFFF; + background-color: rgb(17, 102, 228); +} + +.st-bp { + + background-color: rgb(0 104 201 / 10%); + +} + + +a { + + text-decoration: none; + color: rgb(0, 0, 0); + border: 1px solid #DCDCDC; + padding: 4px 12px; + border-radius: 5px; + background-color: rgb(17, 102, 228); +} + +a:visited { + text-decoration: none; + } + +.css-1sslkv8 a { + + color: #FFFFFF; +} + +.css-1z8u7d { + border:rgba(61, 127, 227, 0.284) 0.5px solid; + +} + +.css-163ttbj { + + background-color:rgb(17, 102, 228); +} + +.st-al { + + color: rgb(248 249 251); + +} + +.st-au { + background-color: rgb(242 245 247 / 18%); +} + +.css-15tags5 { + + color: rgb(0 66 128); + +} + +div.row-widget.stRadio > div { + color: #FFFFFF; +} + + +div.row-widget.stRadio > div[role="radiogroup"] > label[data-baseweb="radio"] > div:first-child { + background-color: rgb(33, 15, 134); + +} + +span { + color: #FFFFFF; +} + +h5 { + color: black; +} + +.css-hied5v::before { + visibility: hidden; +} + +.css-hied5v::after { + background-image: linear-gradient(0deg, rgb(21, 84, 210), transparent); +} + +img { + padding: 20px,20px; +} + +.css-1pxazr7 { + visibility: hidden; +} + +.css-rytr0c { + visibility: hidden; +} \ No newline at end of file