smart-analytics-copilot / app /dashboard.py
SamadhiDBS's picture
Update app/dashboard.py
7a809d2 verified
###____________ Chart selection logic and dashboard generation___________
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
class DashboardGenerator:
def __init__(self, df, schema):
self.df = df
self.schema = schema
self.charts = []
def generate_all_charts(self):
"""
Generate appropriate charts for each column type
"""
print(" Generating charts...")
#numeric columns - Histograms
for col in self.schema['numeric'][:5]: # Limit to 5 charts
fig = self.create_histogram(col)
self.charts.append({
'title': f'Distribution of {col}',
'figure': fig,
'type': 'histogram'
})
# categorical columns - Bar charts (top 10)
for col in self.schema['categorical'][:3]:
fig = self.create_bar_chart(col)
self.charts.append({
'title': f'Top values in {col}',
'figure': fig,
'type': 'bar'
})
# time series - Line charts
for date_col in self.schema['datetime']:
for num_col in self.schema['numeric'][:2]:
fig = self.create_time_series(date_col, num_col)
self.charts.append({
'title': f'{num_col} over time',
'figure': fig,
'type': 'line'
})
# correlation heatmap
if len(self.schema['numeric']) >= 2:
fig = self.create_correlation_heatmap()
self.charts.append({
'title': 'Correlation Heatmap',
'figure': fig,
'type': 'heatmap'
})
return self.charts
def create_histogram(self, column):
"""Create histogram for numeric column"""
fig = px.histogram(
self.df,
x=column,
title=f'Distribution of {column}',
color_discrete_sequence=['#2E86AB'],
nbins=30
)
fig.update_layout(
showlegend=False,
height=400,
template='plotly_white'
)
return fig
def create_bar_chart(self, column):
"""Create bar chart for categorical column"""
value_counts = self.df[column].value_counts().head(10)
fig = px.bar(
x=value_counts.values,
y=value_counts.index,
orientation='h',
title=f'Top 10 values in {column}',
color=value_counts.values,
color_continuous_scale='Blues'
)
fig.update_layout(
xaxis_title='Count',
yaxis_title=column,
height=400,
template='plotly_white'
)
return fig
def create_time_series(self, date_col, value_col):
"""Create time series line chart"""
# group by date
time_data = self.df.groupby(pd.Grouper(key=date_col, freq='D'))[value_col].mean().reset_index()
fig = px.line(
time_data,
x=date_col,
y=value_col,
title=f'{value_col} over time',
markers=True
)
fig.update_layout(
xaxis_title='Date',
yaxis_title=value_col,
height=400,
template='plotly_white'
)
return fig
def create_correlation_heatmap(self):
"""Create correlation heatmap"""
corr_matrix = self.df[self.schema['numeric']].corr()
fig = px.imshow(
corr_matrix,
text_auto='.2f',
aspect='auto',
color_continuous_scale='RdBu',
title='Correlation Heatmap'
)
fig.update_layout(
height=500,
template='plotly_white'
)
return fig
def create_key_metrics(self):
"""Create KPI cards for important metrics"""
metrics = []
for col in self.schema['numeric'][:4]: # Top 4 numeric columns
mean_val = self.df[col].mean()
std_val = self.df[col].std()
min_val = self.df[col].min()
max_val = self.df[col].max()
metrics.append({
'name': col.upper(),
'value': f"{mean_val:,.0f}",
'change': f"±{std_val:,.0f}",
'min': f"{min_val:,.0f}",
'max': f"{max_val:,.0f}",
'type': 'average'
})
return metrics
def create_summary_table(self):
"""Create summary statistics table"""
summary = []
for col in self.schema['numeric']:
summary.append({
'Column': col,
'Mean': round(self.df[col].mean(), 2),
'Median': round(self.df[col].median(), 2),
'Std Dev': round(self.df[col].std(), 2),
'Min': round(self.df[col].min(), 2),
'Max': round(self.df[col].max(), 2)
})
return pd.DataFrame(summary)