Spaces:
Sleeping
Sleeping
#!/usr/bin/env python | |
# coding: utf-8 | |
# In[1]: | |
import streamlit as st | |
from PIL import Image | |
import pandas as pd | |
import numpy as np | |
import catboost | |
import random | |
#from streamlit_js_eval import streamlit_js_eval | |
# Create two columns | |
col1, col2 = st.columns([1, 3]) # Adjust the ratio as needed | |
# Load and display the logo image in the first column | |
with col1: | |
image_path = "niq.png" # Update this path if your image is in a different directory | |
st.image(image_path, width=150) # Adjust the width as needed | |
# Set the title of the app in the second column | |
with col2: | |
st.title("Segmentation Tool") | |
st.sidebar.title("Welcome to the Dollar General Segmentation Tool!") | |
st.sidebar.info( | |
""" | |
**Please follow the instructions below to contribute to our research:** | |
- On the right side, you will encounter a series of statements. | |
- **Carefully read each statement** and use the dropdowns and sliders to select the option that best describes your preferences or behaviors. | |
- Your thoughtful responses are crucial for the accuracy of our segmentation model. | |
- The information you provide will be used to enhance our understanding of different customer segments. | |
**Thank you for participating in our research. Your input is invaluable!** | |
""" | |
) | |
st.markdown("<h2 style='color: black;'>Demographics</h2>", unsafe_allow_html=True) | |
# In[ ]: | |
# Add statement for Gender | |
st.write("**Gender**") | |
gender_display_options = ["Male", "Female", "Other", "Prefer not to disclose"] | |
gender_encoding = {"Male": 1, "Female": 2, "Other": 3, "Prefer not to disclose": 4} | |
selected_gender_display = st.selectbox("Select your gender:", gender_display_options) | |
selected_gender_encoded = gender_encoding[selected_gender_display] | |
# Add statement for Age | |
st.write("**Age**") | |
age_display_options = ["18-34", "35-44", "45-54", "55-64", "65 and above"] | |
age_encoding = {"18-34": 3, "35-44": 4, "45-54": 5, "55-64": 6, "65 and above": 7} | |
selected_age_display = st.selectbox("Select your age range:", age_display_options) | |
selected_age_encoded = age_encoding[selected_age_display] | |
# In[ ]: | |
# Add a heading for Shopping Behaviour section with highlighted color | |
st.markdown("<h2 style='color: black;'>Shopping Behaviour</h2>", unsafe_allow_html=True) | |
# In[ ]: | |
# First statement with dropdown options | |
statement1 = "Which of the following best describes how well you know the prices of the household items you buy regularly?" | |
statement1_options = [ | |
"I know the prices of the household items I buy regularly and always notice when the prices change", | |
"I know the prices of some of the items I buy regularly and usually notice when the prices change", | |
"I generally know about how much I pay for things, but I don’t pay much attention to how much the products I buy cost or when prices change", | |
"Convenience is more important to me than lower prices" | |
] | |
statement1_encoding = { | |
"I know the prices of the household items I buy regularly and always notice when the prices change": 1, | |
"I know the prices of some of the items I buy regularly and usually notice when the prices change": 2, | |
"I generally know about how much I pay for things, but I don’t pay much attention to how much the products I buy cost or when prices change": 3, | |
"Convenience is more important to me than lower prices": 4 | |
} | |
selected_statement1_display = st.selectbox(f"**{statement1}**", statement1_options) | |
# Save the encoding for the selected statement1 option | |
selected_statement1_encoded = statement1_encoding[selected_statement1_display] | |
# In[ ]: | |
# Second statement with dropdown options | |
statement2 = "How much did you spend when visiting any Dollar General store in the past month in total?" | |
statement2_options = ["$10 or less", "$11-$30", "$31-$70", "$71-$200", "Over $200","I have not shopped in the past month"] | |
statement2_encoding = { | |
"$10 or less": 1, | |
"$11-$30": 2, | |
"$31-$70": 3, | |
"$71-$200": 4, | |
"Over $200": 5, | |
"I have not shopped in the past month":1 | |
} | |
selected_statement2_display = st.selectbox(f"**{statement2}**", statement2_options) | |
# Save the encoding for the selected statement2 option | |
selected_statement2_encoded = statement2_encoding[selected_statement2_display] | |
# In[ ]: | |
#Third statement with dropdown options | |
statement3 = "On a typical shopping trip to Dollar General, how many items do you purchase?" | |
statement3_options = ["1-2 items", "3-4 items", "5-6 items", "7-8 items", "More than 8 items"] | |
statement3_encoding = { | |
"1-2 items": 1, | |
"3-4 items": 2, | |
"5-6 items": 3, | |
"7-8 items": 4, | |
"More than 8 items": 5 | |
} | |
selected_statement3_display = st.selectbox(f"**{statement3}**", statement3_options) | |
# Save the encoding for the selected statement3 option | |
selected_statement3_encoded = statement3_encoding[selected_statement3_display] | |
# In[ ]: | |
#Fourth statement with dropdown options | |
statement4 = "How often do you go shopping at any Dollar General?" | |
statement4_options = ["1-2 times a year", "3-5 times a year", "6-11 times a year", "Once a month", "2-3 times a month", "4 or more times a month"] | |
statement4_encoding = { | |
"1-2 times a year": 1, | |
"3-5 times a year": 2, | |
"6-11 times a year": 3, | |
"Once a month": 4, | |
"2-3 times a month": 5, | |
"4 or more times a month": 6 | |
} | |
selected_statement4_display = st.selectbox(f"**{statement4}**", statement4_options) | |
# Save the encoding for the selected statement4 option | |
selected_statement4_encoded = statement4_encoding[selected_statement4_display] | |
# Add a heading for Shopping Habit section with highlighted color | |
st.markdown("<h2 style='color: black;'>Shopping Habit</h2>", unsafe_allow_html=True) | |
st.write("**If you were to shop for household items, how would you shop? Please select where on the scale you feel best describes you.**") | |
# Create sliders with descriptive statements | |
sliders = [ | |
("I always buy well-known brands", "I don’t care much about brands"), | |
("Promotions / sales rarely change my brand choices", "I buy different brands because of promotions / sales"), | |
("Often, I am stressed while shopping", "I find shopping enjoyable"), | |
("I feel shopping is fun" , "I feel shopping is a tedious task"), | |
("I like to take my time and browse when shopping", "I don’t like spending unnecessary time when shopping"), | |
("I use apps while shopping", "I do not use apps while shopping"), | |
("I end up purchasing a lot of things that I didn’t intend to", "I am very disciplined when I shop and only get what I intended to buy"), | |
("I know prices of household items very well", "I do not pay attention to the price of household items"), | |
("I know exactly what items to buy before I get to the store", "I tend to make most of my shopping decisions when I’m in the store") | |
] | |
#slider_responses = {} | |
#for idx, (left_text, right_text) in enumerate(sliders): | |
# cols = st.columns([1, 2, 1]) # Define columns with the desired width ratio | |
# with cols[0]: | |
# st.write(left_text) # Right-side statement | |
# with cols[1]: | |
# slider_key = f"slider_{idx}" | |
# slider_responses[(left_text, right_text)] = st.slider( | |
# "", | |
# min_value=1, | |
# max_value=5, | |
# value=3, | |
# format="%d", | |
# key=slider_key | |
# ) | |
# with cols[2]: | |
# st.write(right_text) # Left-side statement | |
#import streamlit as st | |
# Custom function to display a slider without showing its value | |
def slider_without_value(label, min_value, max_value, value, key): | |
# Create a slider and capture its value | |
selected_value = st.slider(label, min_value, max_value, value, format="", key=key) | |
# Return the selected value without displaying it | |
return selected_value | |
slider_responses = {} | |
for idx, (left_text, right_text) in enumerate(sliders): | |
cols = st.columns([1, 2, 1]) # Define columns with the desired width ratio | |
with cols[0]: | |
st.write(left_text) # Left-side statement | |
with cols[1]: | |
slider_key = f"slider_{idx}" | |
slider_responses[(left_text, right_text)] = slider_without_value( | |
"", 1, 5, 3, key=slider_key | |
) | |
with cols[2]: | |
st.write(right_text) # Right-side statement | |
# Collect responses for each statement | |
responses = { | |
"SC2": selected_gender_encoded, | |
"SC3a": selected_age_encoded, | |
"PR2a": selected_statement1_encoded, | |
"SH1": slider_responses[("I always buy well-known brands", "I don’t care much about brands")], | |
"SH2": slider_responses[("Promotions / sales rarely change my brand choices", "I buy different brands because of promotions / sales")], | |
"SH3": slider_responses[("Often, I am stressed while shopping", "I find shopping enjoyable")], | |
"SH4":slider_responses[("I feel shopping is fun" , "I feel shopping is a tedious task")], | |
"SH5": slider_responses[("I like to take my time and browse when shopping", "I don’t like spending unnecessary time when shopping")], | |
"SH6": slider_responses[("I use apps while shopping", "I do not use apps while shopping")], | |
"SH7": slider_responses[("I end up purchasing a lot of things that I didn’t intend to", "I am very disciplined when I shop and only get what I intended to buy")], | |
"SH8": slider_responses[("I know prices of household items very well", "I do not pay attention to the price of household items")], | |
"SH9": slider_responses[("I know exactly what items to buy before I get to the store", "I tend to make most of my shopping decisions when I’m in the store")], | |
"Q21": selected_statement2_encoded, | |
"Q25": selected_statement3_encoded, | |
"Q26": selected_statement4_encoded | |
} | |
df=pd.DataFrame([responses]) | |
#st.write(df) | |
# Load the saved model | |
#import pickle | |
#model_path = 'Trained_model.pickle' | |
#with open(model_path, 'rb') as model_file: | |
# model = pickle.load(model_file) | |
label_mapping = { | |
1: "Stacey", | |
2: "Dana", | |
3: "Marge", | |
4: "Carl", | |
5: "Ivy", | |
6: "Sue", | |
7: "Cora", | |
8: "Strangers" | |
} | |
# Make prediction for demo purposes | |
if st.button('Submit'): | |
# Choose a random key from label_mapping | |
random_key = random.choice(list(label_mapping.keys())) | |
random_label = label_mapping[random_key] | |
#if st.button('Submit'): | |
# prediction_numeric = model.predict(df)[0] | |
# prediction_numeric=prediction_numeric+1 | |
# Convert numpy array to int if it's a single value array | |
# if isinstance(prediction_numeric, np.ndarray) and prediction_numeric.size == 1: | |
# prediction_numeric = int(prediction_numeric) | |
# predicted_label = label_mapping.get(prediction_numeric, "Unknown") | |
# Assuming 'predicted_label' is defined and holds the prediction result | |
# Create two columns | |
col1, col2 = st.columns(2) | |
# Use the first column to display the statement with a border | |
with col1: | |
st.markdown("<div style='border: 2px solid #f0f2f6; padding: 4px; border-radius: 5px; margin: 10px 0;'><strong>Assigned Statement:</strong></div>", unsafe_allow_html=True) | |
# Use the second column to display the label aligned to the right with a border | |
with col2: | |
st.markdown(f"<div style='text-align: right; padding-right: 16px; border: 2px solid #f0f2f6; padding: 4px; border-radius: 5px; margin: 10px 0;'><strong>{random_label}</strong></div>", unsafe_allow_html=True) | |
# Add prediction to the DataFrame | |
#df['Assgined_Segment'] = predicted_label | |