| """ |
| Additional visualizations for the OpenHands Index leaderboard. |
| |
| These functions use the generic create_scatter_chart() from leaderboard_transformer |
| as the single source of truth for scatter plot styling and behavior. |
| """ |
| import pandas as pd |
| import plotly.graph_objects as go |
| import aliases |
|
|
| |
| from leaderboard_transformer import create_scatter_chart, STANDARD_LAYOUT, STANDARD_FONT |
|
|
|
|
| def _find_column(df: pd.DataFrame, candidates: list, default: str = None) -> str: |
| """Find the first matching column name from candidates.""" |
| for col in candidates: |
| if col in df.columns: |
| return col |
| return default |
|
|
|
|
| def create_evolution_over_time_chart(df: pd.DataFrame, mark_by: str = None) -> go.Figure: |
| """ |
| Create a chart showing model performance evolution over release dates. |
| |
| Args: |
| df: DataFrame with release_date and score columns |
| mark_by: One of "Company", "Openness", or "Country" for marker icons |
| |
| Returns: |
| Plotly figure showing score evolution over time |
| """ |
| |
| release_date_col = _find_column(df, ['release_date', 'Release_Date', 'Release Date']) |
| |
| if df.empty or release_date_col is None: |
| fig = go.Figure() |
| fig.add_annotation( |
| text="No release date data available", |
| xref="paper", yref="paper", |
| x=0.5, y=0.5, showarrow=False, |
| font=STANDARD_FONT |
| ) |
| fig.update_layout(**STANDARD_LAYOUT, title="Model Performance Evolution Over Time") |
| return fig |
| |
| |
| score_col = _find_column(df, ['Average Score', 'average score', 'Average score']) |
| if score_col is None: |
| |
| for col in df.columns: |
| if 'score' in col.lower() and 'average' in col.lower(): |
| score_col = col |
| break |
| |
| if score_col is None: |
| fig = go.Figure() |
| fig.add_annotation( |
| text="No score data available", |
| xref="paper", yref="paper", |
| x=0.5, y=0.5, showarrow=False, |
| font=STANDARD_FONT |
| ) |
| fig.update_layout(**STANDARD_LAYOUT, title="Model Performance Evolution Over Time") |
| return fig |
| |
| |
| return create_scatter_chart( |
| df=df, |
| x_col=release_date_col, |
| y_col=score_col, |
| title="Model Performance Evolution Over Time", |
| x_label="Model Release Date", |
| y_label="Average Score", |
| mark_by=mark_by, |
| x_type="date", |
| pareto_lower_is_better=False, |
| ) |
|
|
|
|
| def create_accuracy_by_size_chart(df: pd.DataFrame, mark_by: str = None) -> go.Figure: |
| """ |
| Create a scatter plot showing accuracy vs parameter count for open-weights models. |
| |
| Args: |
| df: DataFrame with parameter_count and score columns |
| mark_by: One of "Company", "Openness", or "Country" for marker icons |
| |
| Returns: |
| Plotly figure showing accuracy vs model size |
| """ |
| |
| param_col = _find_column(df, ['parameter_count_b', 'Parameter_Count_B', 'Parameter Count B']) |
| |
| if df.empty or param_col is None: |
| fig = go.Figure() |
| fig.add_annotation( |
| text="No parameter count data available", |
| xref="paper", yref="paper", |
| x=0.5, y=0.5, showarrow=False, |
| font=STANDARD_FONT |
| ) |
| fig.update_layout(**STANDARD_LAYOUT, title="Open Model Accuracy by Size") |
| return fig |
| |
| |
| open_aliases = [aliases.CANONICAL_OPENNESS_OPEN] + list( |
| aliases.OPENNESS_ALIASES.get(aliases.CANONICAL_OPENNESS_OPEN, []) |
| ) |
| openness_col = 'Openness' if 'Openness' in df.columns else 'openness' |
| |
| plot_df = df[ |
| (df[param_col].notna()) & |
| (df[openness_col].isin(open_aliases)) |
| ].copy() |
| |
| if plot_df.empty: |
| fig = go.Figure() |
| fig.add_annotation( |
| text="No open-weights models with parameter data available", |
| xref="paper", yref="paper", |
| x=0.5, y=0.5, showarrow=False, |
| font=STANDARD_FONT |
| ) |
| fig.update_layout(**STANDARD_LAYOUT, title="Open Model Accuracy by Size") |
| return fig |
| |
| |
| score_col = _find_column(plot_df, ['Average Score', 'average score', 'Average score']) |
| if score_col is None: |
| for col in plot_df.columns: |
| if 'score' in col.lower() and 'average' in col.lower(): |
| score_col = col |
| break |
| |
| if score_col is None: |
| fig = go.Figure() |
| fig.add_annotation( |
| text="No score data available", |
| xref="paper", yref="paper", |
| x=0.5, y=0.5, showarrow=False, |
| font=STANDARD_FONT |
| ) |
| fig.update_layout(**STANDARD_LAYOUT, title="Open Model Accuracy by Size") |
| return fig |
| |
| |
| return create_scatter_chart( |
| df=plot_df, |
| x_col=param_col, |
| y_col=score_col, |
| title="Open Model Accuracy by Size", |
| x_label="Parameters (Billions)", |
| y_label="Average Score", |
| mark_by=mark_by, |
| x_type="log", |
| pareto_lower_is_better=True, |
| ) |
|
|