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("""![Visitors](https://api.visitorbadge.io/api/combined?path=https%3A%2F%2Fhuggingface.co%2Fspaces%2FMiragic-AI%2FMiragic-Sales-Pilot&labelColor=%2337d67a&countColor=%23ff8a65&style=plastic&labelStyle=upper)""")

# 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)