LeonardoErcolani's picture
Create app.py
7e44c6f verified
raw
history blame
4.24 kB
import streamlit as st
import pandas as pd
import icc # Importing ICC computation functions
# Set up Streamlit page layout (Full Width)
st.set_page_config(layout="wide", page_title="ICC Computation App", page_icon="πŸ“Š")
# Title and instructions
st.title("πŸ“Š ICC Computation App")
st.markdown("Upload a **CSV file** containing LLM evaluation scores and compute **Intraclass Correlation Coefficients (ICC)**.")
# **Two Side-by-Side Containers**
container_left, container_right = st.columns([1, 2]) # Left (Filters) | Right (ICC Results + Heatmaps)
# **LEFT: File Upload & Selection Filters**
with container_left:
st.header("πŸ“‚ Upload & Selection")
# File uploader
uploaded_file = st.file_uploader("Upload Your CSV", type=["csv"])
if uploaded_file is not None:
df = pd.read_csv(uploaded_file, delimiter=",", dtype=str) # Read as string first
required_columns = ["assessor", "respondent"]
criterion_columns = [col for col in df.columns if col.startswith("criterion")]
if not all(col in df.columns for col in required_columns) or len(criterion_columns) < 1:
st.error("❌ Invalid CSV format.")
else:
st.success("βœ… CSV format is valid!")
# Sidebar filters
st.subheader("πŸ” Select Filters")
# Extract Unique Options
all_assessors = sorted(df["assessor"].unique())
all_respondents = sorted(df["respondent"].unique())
all_criteria = criterion_columns
# **Assessors Selection with 'Select All'**
select_all_assessors = st.checkbox("Select All Assessors", value=True)
selected_assessors = st.multiselect(
"Select Assessors", all_assessors, default=all_assessors if select_all_assessors else []
)
# **Respondents Selection with 'Select All'**
select_all_respondents = st.checkbox("Select All Respondents", value=True)
selected_respondents = st.multiselect(
"Select Respondents", all_respondents, default=all_respondents if select_all_respondents else []
)
# **Criteria Selection with 'Select All'**
select_all_criteria = st.checkbox("Select All Criteria", value=True)
selected_criteria = st.multiselect(
"Select Criteria", all_criteria, default=all_criteria if select_all_criteria else []
)
def reset_filters():
"""Resets selections to all available options."""
st.session_state["selected_assessors"] = all_assessors
st.session_state["selected_respondents"] = all_respondents
st.session_state["selected_criteria"] = all_criteria
# Reset All Button
if st.button("πŸ”„ Reset All Selections"):
reset_filters()
# Filter data based on user selection
df = icc.preprocess_data(df, selected_assessors, selected_respondents, selected_criteria)
if df.empty:
st.error("⚠️ No data available with selected filters.")
# **RIGHT: Display ICC Results + Heatmaps**
with container_right:
st.header("πŸ“Š ICC Results & Heatmaps")
if uploaded_file is not None and not df.empty:
with st.spinner("⏳ Computing ICC... Please wait."):
icc_results = icc.compute_icc(df)
if icc_results is not None:
st.subheader("πŸ“ˆ Overall ICC Results")
st.dataframe(icc_results, use_container_width=True) # Display ICC table
else:
st.warning("⚠️ Not enough respondents to compute ICC.")
# **HEATMAPS: Display Below in 3 Columns**
st.subheader("πŸ”₯ ICC Heatmaps (Assessor Agreement)")
heatmap_cols = st.columns(3) # 3-column layout for heatmaps
# Compute assessor ICC
icc_matrix_types = icc.compute_assessor_icc(df)
# Generate heatmaps and display
heatmap_files = icc.generate_heatmaps(icc_matrix_types)
for i, (icc_type, heatmap_file) in enumerate(heatmap_files.items()):
heatmap_cols[i].image(heatmap_file, caption=f"ICC Heatmap ({icc_type})", use_container_width=True)