Nagaraj81's picture
Upload 2 files
9f82984 verified
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()