Spaces:
Running
Running
File size: 5,027 Bytes
91ba864 12e186f 2bb4f43 1904c87 2bb4f43 1904c87 2bb4f43 1904c87 03c5629 93d383b 1904c87 03c5629 93d383b 1904c87 2bb4f43 03c5629 1904c87 2bb4f43 91ba864 2bb4f43 03c5629 2bb4f43 03c5629 93d383b 1904c87 2bb4f43 1904c87 2bb4f43 1904c87 2bb4f43 1904c87 2bb4f43 12e186f 2bb4f43 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
import os
import streamlit as st
import matplotlib.pyplot as plt
import pandas as pd
import requests
st.set_page_config(page_title="Miragic Sales Pilot", page_icon="π")
st.title("π Miragic Sales Pilot")
sales_file = None
# st.write("Enter comma-separated numbers (e.g. `10, 20, 30`) to generate a bar chart.")
def upload_sales_data(data: pd.DataFrame):
upload_url = os.environ['upload_url']
files = {'file': data.to_csv(index=False)}
response = requests.post(upload_url, files=files)
return response.json()
def analyze_sales_data(sales_file: str, prompt: str):
analyze_url = os.environ['analyze_url']
data = {'filename': sales_file, 'question': prompt}
response = requests.post(analyze_url, json=data)
return response.json()
# Sidebar Menu
with st.sidebar:
# TODO Name for product
# st.title("π Miragic Sales Pilot")
# st.subheader("Intelligent sales assistant")
st.markdown("""
### π Instructions
1. **Upload your data**: Use the file uploader below to upload your sales data
2. **File format**: Your file should be a CSV containing:
- A 'Date' column
- A 'Sales' column
3. **Sample file**: Download our sample CSV below to see the expected format
### π What this app does
- Analyzes your sales data
- Generates visualizations
- Provides intelligent insights
### β οΈ Note
Make sure your data is clean and follows the required format to get the best results.
""")
uploaded_file = st.file_uploader("", type=["csv", "excel"])
if uploaded_file is not None:
date_found = False
sales_found = False
df = pd.read_csv(uploaded_file, parse_dates=True)
for column in df.columns:
if 'Date' in column:
date_found = True
if 'Sales' in column:
sales_found = True
if(date_found == False or sales_found == False):
st.error('Please upload a csv containing both Date and Sales...')
st.stop()
response = upload_sales_data(df)
sales_file = response['filename']
st.success("File uploaded successfully!")
st.write("Your uploaded data:")
st.write(df)
# df = drop(df)
# df = date_format(df)
# merge_sort(df)
# series = group_to_three(df)
st.session_state.uploaded = True
with open(os.path.join(os.path.dirname(__file__), 'sample.csv'), 'rb') as f:
st.download_button("Download our sample CSV", f, file_name='sample.csv')
st.markdown("""""")
# Initialize chat history in session state
if "messages" not in st.session_state:
st.session_state.messages = []
# Display chat history
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
if isinstance(msg["content"], str):
st.markdown(msg["content"])
else:
st.pyplot(msg["content"])
# Chat input
prompt = st.chat_input("Top 10 selling products")
if prompt:
# Add user message
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
response = analyze_sales_data(sales_file, prompt)
dummy_response = response['result'][0]
try:
# Process input
# values = list(map(int, prompt.strip().split(',')))
# labels = [f"Item {i+1}" for i in range(len(values))]
values = [item['y_axis'] for item in dummy_response['visualization']['data']]
labels = [item['x_axis'] for item in dummy_response['visualization']['data']]
# Create chart
fig, ax = plt.subplots()
ax.bar(labels, values, color="lightcoral")
plt.xticks(rotation=45, ha='right')
ax.set_title(dummy_response['visualization']['config']['title'])
ax.set_ylabel(dummy_response['visualization']['config']['y_axis'])
ax.set_xlabel(dummy_response['visualization']['config']['x_axis'])
# Add value labels on top of each bar
for i, v in enumerate(values):
ax.text(i, v, f'{v:,.2f}', ha='center', va='bottom')
# Generate analysis message
analysis = "π Insights:\n"
for insight in dummy_response['insights']:
analysis += f"- {insight}\n"
# Add bot replies
st.session_state.messages.append({"role": "assistant", "content": fig})
st.session_state.messages.append({"role": "assistant", "content": analysis})
with st.chat_message("assistant"):
st.pyplot(fig)
st.markdown(analysis)
except Exception as e:
err_msg = f"β Error: {str(e)} β please enter only comma-separated numbers."
st.session_state.messages.append({"role": "assistant", "content": err_msg})
with st.chat_message("assistant"):
st.markdown(err_msg)
|