|
import gradio as gr |
|
import pandas as pd |
|
import plotly.express as px |
|
import plotly.graph_objects as go |
|
from sklearn.cluster import KMeans |
|
from sklearn.preprocessing import StandardScaler |
|
import numpy as np |
|
import statsmodels.api as sm |
|
import os |
|
|
|
|
|
df = pd.read_csv("data/india_growth_metrics.csv") |
|
df.columns = df.columns.str.strip() |
|
cities = df['City'].unique() |
|
metrics = df.columns[1:-1] |
|
|
|
|
|
scaler = StandardScaler() |
|
cluster_data = scaler.fit_transform(df[metrics]) |
|
kmeans = KMeans(n_clusters=4, random_state=0).fit(cluster_data) |
|
df['Cluster'] = kmeans.labels_ |
|
|
|
def create_bar_chart(selected_cities, selected_metric): |
|
"""Create bar chart for selected cities and metric""" |
|
if not selected_cities or not selected_metric: |
|
return None |
|
|
|
filtered = df[df['City'].isin(selected_cities)] |
|
fig = px.bar(filtered, x='City', y=selected_metric, color='City', |
|
title=f"{selected_metric} Comparison") |
|
return fig |
|
|
|
def create_radar_chart(selected_cities): |
|
"""Create radar chart for selected cities""" |
|
if not selected_cities: |
|
return None |
|
|
|
radar_df = df[df['City'].isin(selected_cities)].set_index('City') |
|
melted = radar_df[metrics].reset_index().melt(id_vars='City', var_name='Metric', value_name='Value') |
|
fig = px.line_polar(melted, r='Value', theta='Metric', color='City', |
|
line_close=True, title="Radar View") |
|
fig.update_traces(fill='toself') |
|
return fig |
|
|
|
def create_correlation_matrix(selected_cities): |
|
"""Create correlation matrix for selected cities""" |
|
if not selected_cities: |
|
return None |
|
|
|
corr = df[df['City'].isin(selected_cities)][metrics].corr() |
|
fig = px.imshow(corr, text_auto=True, title="Correlation Matrix") |
|
return fig |
|
|
|
def generate_ai_insights(selected_cities): |
|
"""Generate AI insights for selected cities""" |
|
if not selected_cities: |
|
return "Please select cities to generate insights." |
|
|
|
insights = [] |
|
for city in selected_cities: |
|
city_data = df[df['City'] == city] |
|
if not city_data.empty: |
|
highest = city_data[metrics].idxmax(axis=1).values[0] |
|
lowest = city_data[metrics].idxmin(axis=1).values[0] |
|
insights.append(f"๐๏ธ **{city}** excels in **{highest}** but needs improvement in **{lowest}**.") |
|
|
|
return "\n".join(insights) if insights else "No insights available." |
|
|
|
def find_twin_cities(selected_cities): |
|
"""Find twin cities for selected cities""" |
|
if not selected_cities: |
|
return "Please select cities to find twin cities." |
|
|
|
twin_info = [] |
|
for city in selected_cities: |
|
city_data = df[df['City'] == city] |
|
if not city_data.empty: |
|
city_vec = city_data[metrics].values |
|
df_temp = df.copy() |
|
df_temp['distance'] = np.linalg.norm(df_temp[metrics].values - city_vec, axis=1) |
|
nearest = df_temp[df_temp['City'] != city].sort_values('distance').iloc[0]['City'] |
|
twin_info.append(f"๐๏ธ **{city}**'s most similar city is **{nearest}**.") |
|
|
|
return "\n".join(twin_info) if twin_info else "No twin cities found." |
|
|
|
def create_time_series(selected_metric, selected_city): |
|
"""Create time series forecast for selected metric and city""" |
|
if not selected_metric or not selected_city: |
|
return None |
|
|
|
try: |
|
time_df = pd.read_csv("data/timeseries.csv", encoding='utf-8-sig') |
|
time_df.columns = time_df.columns.str.strip() |
|
time_df['City'] = time_df['City'].str.strip() |
|
|
|
fig = go.Figure() |
|
city_df = time_df[time_df['City'] == selected_city].sort_values('Year') |
|
city_df['Year'] = pd.to_datetime(city_df['Year'], format='%Y') |
|
|
|
if selected_metric in city_df.columns: |
|
ts = city_df.set_index('Year')[selected_metric] |
|
fig.add_trace(go.Scatter(x=ts.index, y=ts.values, mode='lines+markers', |
|
name=selected_metric)) |
|
try: |
|
model = sm.tsa.ARIMA(ts, order=(1, 1, 0)).fit() |
|
forecast = model.get_forecast(steps=3) |
|
forecast_index = pd.date_range(start=ts.index[-1] + pd.offsets.YearBegin(), |
|
periods=3, freq='YS') |
|
forecast_series = pd.Series(forecast.predicted_mean.values, index=forecast_index) |
|
fig.add_trace(go.Scatter(x=forecast_series.index, y=forecast_series.values, |
|
mode='lines+markers', name=f"{selected_metric} Forecast", |
|
line=dict(dash='dash'))) |
|
except: |
|
pass |
|
|
|
fig.update_layout(title=f"Time Series Forecast: {selected_metric} in {selected_city}", |
|
xaxis_title='Year') |
|
return fig |
|
except Exception as e: |
|
return None |
|
|
|
def create_cluster_view(metric): |
|
"""Create cluster visualization""" |
|
if not metric: |
|
return None |
|
|
|
fig = px.scatter(df, x=metric, y='Gini Coefficient', color='Cluster', |
|
hover_data=['City'], title="City Clustering") |
|
return fig |
|
|
|
|
|
with gr.Blocks(title="India Growth Metrics Dashboard", theme=gr.themes.Soft()) as demo: |
|
gr.Markdown("# ๐ฎ๐ณ Decode India: Smart AI-Enhanced Dashboard for Growth Metrics") |
|
gr.Markdown("A powerful interactive dashboard that visualizes and analyzes growth metrics for 35 major Indian cities using AI, time series forecasting, and cluster-based insights.") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
gr.Markdown("### ๐ Dashboard Controls") |
|
|
|
city_selector = gr.Dropdown( |
|
choices=list(cities), |
|
value=list(cities[:3]), |
|
label="Select Cities", |
|
multiselect=True |
|
) |
|
|
|
metric_selector = gr.Dropdown( |
|
choices=list(metrics), |
|
value=metrics[0], |
|
label="Select Metric" |
|
) |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
gr.Markdown("### ๐ Bar Chart Comparison") |
|
bar_chart = gr.Plot(label="Bar Chart") |
|
|
|
with gr.Column(scale=1): |
|
gr.Markdown("### ๐ Radar Chart") |
|
radar_chart = gr.Plot(label="Radar Chart") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
gr.Markdown("### ๐งฎ Correlation Matrix") |
|
correlation_matrix = gr.Plot(label="Correlation Matrix") |
|
|
|
with gr.Column(scale=1): |
|
gr.Markdown("### ๐ฏ City Clustering") |
|
cluster_view = gr.Plot(label="Cluster View") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
gr.Markdown("### ๐ Time Series Forecast") |
|
time_series = gr.Plot(label="Time Series") |
|
|
|
with gr.Column(scale=1): |
|
gr.Markdown("### ๐ง AI Insights") |
|
ai_insights = gr.Markdown(label="AI Insights") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
gr.Markdown("### ๐ Twin City Recommendations") |
|
twin_cities = gr.Markdown(label="Twin Cities") |
|
|
|
|
|
def update_all_outputs(selected_cities, selected_metric): |
|
|
|
time_series_city = selected_cities[0] if selected_cities else None |
|
|
|
bar_fig = create_bar_chart(selected_cities, selected_metric) |
|
radar_fig = create_radar_chart(selected_cities) |
|
corr_fig = create_correlation_matrix(selected_cities) |
|
cluster_fig = create_cluster_view(selected_metric) |
|
ai_md = generate_ai_insights(selected_cities) |
|
twin_md = find_twin_cities(selected_cities) |
|
ts_fig = create_time_series(selected_metric, time_series_city) |
|
|
|
return bar_fig, radar_fig, corr_fig, cluster_fig, ts_fig, ai_md, twin_md |
|
|
|
|
|
all_outputs = [bar_chart, radar_chart, correlation_matrix, cluster_view, time_series, ai_insights, twin_cities] |
|
|
|
|
|
city_selector.change( |
|
fn=update_all_outputs, |
|
inputs=[city_selector, metric_selector], |
|
outputs=all_outputs |
|
) |
|
|
|
metric_selector.change( |
|
fn=update_all_outputs, |
|
inputs=[city_selector, metric_selector], |
|
outputs=all_outputs |
|
) |
|
|
|
demo.load( |
|
fn=update_all_outputs, |
|
inputs=[city_selector, metric_selector], |
|
outputs=all_outputs |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|