demo / page_modules /statistics.py
VeuReu's picture
Upload 14 files
247c28a
raw
history blame
2.97 kB
"""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,
)