import streamlit as st import pandas as pd import plotly.express as px import json st.set_page_config(layout="wide", page_title="CyberSafetyEval Leaderboard", page_icon=":bar_chart:") st.markdown("# CyberSafetyEval Leaderboard", unsafe_allow_html=True) data_mitre = json.load(open("mitre.json")) data_insecure = json.load(open("insecure_code.json")) # Processing data for the table st.markdown("### Helpfulness to cyberattackers results, benign percentage is percentage of tests safely passed (higher is better)") model_stats = {} for model, categories in data_mitre.items(): model_stats[model] = {'Mean Benign Percentage': pd.Series([v['benign_percentage'] for v in categories.values()]).mean()} for category, values in categories.items(): model_stats[model][f'Benign Percentage in {category}'] = values['benign_percentage'] leaderboard_df = pd.DataFrame.from_dict(model_stats, orient='index').sort_values(by='Mean Benign Percentage', ascending=False) # Preparing data for the clustered bar chart chart_data = [] for model, categories in data_mitre.items(): for category, values in categories.items(): chart_data.append({ 'Model': model, 'Category': category, 'Benign Percentage': values['benign_percentage'] }) chart_df = pd.DataFrame(chart_data) # Styling the data table st.dataframe(leaderboard_df.style.format("{:.2%}").background_gradient(cmap='Blues')) # Enhanced Plotly chart fig = px.bar(chart_df, x='Category', y='Benign Percentage', barmode='group', color='Model', title='MITRE ATT&CK category results per model', labels={'Benign Percentage': 'Benign %'}, color_discrete_sequence=px.colors.qualitative.Pastel) fig.update_layout(plot_bgcolor='rgba(0,0,0,0)', xaxis=dict(showgrid=False), yaxis=dict(showgrid=False, tickformat=".0%"), legend=dict(title='Models')) st.plotly_chart(fig, use_container_width=True) # Processing data for the table model_stats_insecure = {} for model, categories in data_insecure.items(): model_stats_insecure[model] = {'Mean Insecure Code Test Pass Rate': pd.Series([1-v['autocomplete_vunerable_percentage'] for v in categories.values()]).mean()} for category, values in categories.items(): model_stats_insecure[model][f'Insecure Code Test Pass Rate in {category}'] = 1-values['autocomplete_vunerable_percentage'] leaderboard_df_insecure = pd.DataFrame.from_dict(model_stats_insecure, orient='index').sort_values(by='Mean Insecure Code Test Pass Rate', ascending=False) # Preparing data for the clustered bar chart chart_data_insecure = [] for model, categories in data_insecure.items(): for category, values in categories.items(): chart_data_insecure.append({ 'Model': model, 'Category': category, 'Insecure Code Test Pass Rate': 1-values['autocomplete_vunerable_percentage'] }) chart_df_insecure = pd.DataFrame(chart_data_insecure) # Styling the data table st.markdown("### Insecure coding test pass rate results (higher is better)") st.dataframe(leaderboard_df_insecure.style.format("{:.2%}").background_gradient(cmap='Blues')) # Changed cmap to 'Blues' # Enhanced Plotly chart fig_insecure = px.bar(chart_df_insecure, x='Category', y='Insecure Code Test Pass Rate', barmode='group', color='Model', title='Category-wise Insecure Code Test Pass Rate per Model', labels={'Insecure Code Test Pass Rate': 'Insecure Code Test Pass Rate %'}, color_discrete_sequence=px.colors.qualitative.Pastel) fig_insecure.update_layout(plot_bgcolor='rgba(0,0,0,0)', xaxis=dict(showgrid=False), yaxis=dict(showgrid=False, tickformat=".0%"), legend=dict(title='Models')) st.plotly_chart(fig_insecure, use_container_width=True)