File size: 4,619 Bytes
9f82984
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import random
import gradio as gr
from sklearn.linear_model import LinearRegression
import tempfile

def generate_synthetic_data(n_days=90):
    dates = pd.date_range(end=datetime.today(), periods=n_days)
    data = []
    store_names = [f"Store_{i}" for i in range(1, 21)]
    categories = ['Fashion', 'Electronics', 'Food', 'Entertainment', 'Home Decor']
    zones = ['Ground Floor', 'First Floor', 'Second Floor']

    for date in dates:
        for store in store_names:
            visitors = np.random.poisson(lam=150)
            sales = np.random.normal(loc=visitors * 10, scale=visitors * 2)
            dwell_time = np.random.normal(loc=30, scale=5)
            category = random.choice(categories)
            zone = random.choice(zones)
            data.append({
                'date': date,
                'store': store,
                'category': category,
                'zone': zone,
                'visitors': max(0, visitors),
                'sales': max(0, sales),
                'dwell_time': max(5, dwell_time)
            })
    return pd.DataFrame(data)

def forecast_sales(df, days_ahead=7):
    daily_sales = df.groupby('date')['sales'].sum().reset_index()
    daily_sales['day_num'] = (daily_sales['date'] - daily_sales['date'].min()).dt.days
    X = daily_sales[['day_num']]
    y = daily_sales['sales']
    model = LinearRegression().fit(X, y)

    last_day = daily_sales['day_num'].max()
    future_days = np.arange(last_day + 1, last_day + 1 + days_ahead).reshape(-1, 1)
    future_dates = [daily_sales['date'].max() + timedelta(days=i) for i in range(1, days_ahead + 1)]
    predictions = model.predict(future_days)
    forecast_df = pd.DataFrame({'date': future_dates, 'sales': predictions})
    return forecast_df

def generate_chart(chart_type):
    df = generate_synthetic_data()
    forecast_df = forecast_sales(df)
    
    daily_visits = df.groupby('date')['visitors'].sum().reset_index()
    category_sales = df.groupby('category')['sales'].sum().reset_index()
    zone_traffic = df.groupby('zone')['visitors'].sum().reset_index()
    top_stores = df.groupby('store')['sales'].sum().nlargest(10).reset_index()
    dwell_time = df.groupby('category')['dwell_time'].mean().reset_index()

    fig, ax = plt.subplots(figsize=(8, 5))
    plt.tight_layout()

    if chart_type == "Daily Footfall":
        ax.plot(daily_visits['date'], daily_visits['visitors'], color='blue')
        ax.set_title('Daily Footfall')
        ax.set_xlabel('Date')
        ax.set_ylabel('Visitors')
    elif chart_type == "Sales by Category":
        ax.bar(category_sales['category'], category_sales['sales'], color='green')
        ax.set_title('Sales by Category')
        ax.set_ylabel('Sales')
    elif chart_type == "Footfall by Zone":
        ax.pie(zone_traffic['visitors'], labels=zone_traffic['zone'], autopct='%1.1f%%')
        ax.set_title('Footfall by Zone')
    elif chart_type == "Top 10 Stores by Sales":
        ax.bar(top_stores['store'], top_stores['sales'], color='purple')
        ax.set_title('Top 10 Stores by Sales')
        ax.set_ylabel('Sales')
        plt.xticks(rotation=45)
    elif chart_type == "Avg Dwell Time by Category":
        ax.bar(dwell_time['category'], dwell_time['dwell_time'], color='orange')
        ax.set_title('Avg Dwell Time by Category')
        ax.set_ylabel('Dwell Time (mins)')
    elif chart_type == "Forecasted Sales (Next 7 Days)":
        ax.plot(forecast_df['date'], forecast_df['sales'], color='red')
        ax.set_title('Forecasted Sales (Next 7 Days)')
        ax.set_xlabel('Date')
        ax.set_ylabel('Predicted Sales')
    else:
        return None

    tmp_file = tempfile.NamedTemporaryFile(suffix=".png", delete=False)
    plt.savefig(tmp_file.name, bbox_inches='tight')
    plt.close(fig)
    return tmp_file.name

with gr.Blocks(title="📊 Mall Dashboard with Matplotlib") as demo:
    gr.Markdown("## 🏬 Mall Analytics Dashboard (Matplotlib Version)")
    chart_dropdown = gr.Dropdown(
        choices=[
            "Daily Footfall",
            "Sales by Category",
            "Footfall by Zone",
            "Top 10 Stores by Sales",
            "Avg Dwell Time by Category",
            "Forecasted Sales (Next 7 Days)"
        ],
        value="Daily Footfall",
        label="Choose a Chart"
    )
    generate_button = gr.Button("Generate Chart")
    image_output = gr.Image(label="Chart Output")

    generate_button.click(fn=generate_chart, inputs=chart_dropdown, outputs=image_output)

demo.launch()