|
|
"""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." |
|
|
), |
|
|
) |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
order_key = order_options[order_label] |
|
|
ascending = order_key == "video_name" |
|
|
df = df.sort_values(order_key, ascending=ascending, na_position="last") |
|
|
|
|
|
|
|
|
display_cols = [ |
|
|
"video_name", |
|
|
"n", |
|
|
"score_1", |
|
|
"score_2", |
|
|
"score_3", |
|
|
"score_4", |
|
|
"score_5", |
|
|
"score_6", |
|
|
] |
|
|
df_display = df[display_cols].copy() |
|
|
|
|
|
|
|
|
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, |
|
|
) |
|
|
|