"""UI logic for the "Estadístiques" page.""" from __future__ import annotations from pathlib import Path import pandas as pd import streamlit as st import yaml from databases import get_feedback_video_stats def render_statistics_page() -> None: st.header("Estadístiques") col1, col2 = st.columns(2) with col1: mode_label = st.selectbox( "Mode d'agregació", ["mitjana", "mediana", "inicial", "actual"], help=( "mitjana: mitjana de totes les valoracions; " "mediana: valor central; " "inicial: primer registre en el temps; " "actual: darrer registre en el temps." ), ) # Etiquetes humanes per als sis ítems (a partir de config.yaml -> labels) cfg_path = Path(__file__).resolve().parent.parent / "config.yaml" try: with cfg_path.open("r", encoding="utf-8") as f: cfg = yaml.safe_load(f) or {} except FileNotFoundError: cfg = {} labels_cfg = cfg.get("labels", {}) or {} raw_labels = [ labels_cfg.get("score_1", "score_1"), labels_cfg.get("score_2", "score_2"), labels_cfg.get("score_3", "score_3"), labels_cfg.get("score_4", "score_4"), labels_cfg.get("score_5", "score_5"), labels_cfg.get("score_6", "score_6"), ] label_map = {f"score_{i+1}": raw_labels[i] for i in range(6)} order_options = {"nom": "video_name"} for i in range(6): key = f"score_{i+1}" human = raw_labels[i] order_options[human] = key with col2: order_label = st.selectbox( "Ordenar per", list(order_options.keys()), help=( "Indica el camp pel qual s'ordenen els vídeos a la taula: " "nom del vídeo o alguna de les sis característiques d'avaluació." ), ) stats = get_feedback_video_stats(agg=mode_label) if not stats: st.caption("Encara no hi ha valoracions a demo/temp/feedback.db.") st.stop() df = pd.DataFrame(stats) # Ordenació segons el selector order_key = order_options[order_label] ascending = order_key == "video_name" df = df.sort_values(order_key, ascending=ascending, na_position="last") # Preparar taula per mostrar: seleccionar columnes i arrodonir valors numèrics display_cols = [ "video_name", "n", "score_1", "score_2", "score_3", "score_4", "score_5", "score_6", ] df_display = df[display_cols].copy() # Arrodonir scores a la unitat (0 decimals) score_cols = [c for c in display_cols if c.startswith("score_")] df_display[score_cols] = df_display[score_cols].round(0) st.subheader("Taula agregada per vídeo") st.dataframe( df_display.rename(columns=label_map), use_container_width=True, hide_index=True, )