Skip to content

Commit 5cf6627

Browse files
committed
dashboard quiz dati
1 parent 4b29369 commit 5cf6627

File tree

5 files changed

+514
-1
lines changed

5 files changed

+514
-1
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"python.pythonPath": "C:\\Users\\Utente\\AppData\\Local\\pypoetry\\Cache\\virtualenvs\\learningpythonwithgames-AfsZqtYV-py3.8\\Scripts\\python.exe",
2+
,
33
}

game13/dashboard_quiz.py

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
# dashboard_quiz.py
2+
import streamlit as st
3+
import polars as pl
4+
5+
# ========================================
6+
# CONFIGURAZIONE PAGINA
7+
# ========================================
8+
st.set_page_config(
9+
page_title="Risultati Quiz Python",
10+
page_icon="🎮",
11+
layout="wide"
12+
)
13+
14+
# ========================================
15+
# TITOLO PRINCIPALE
16+
# ========================================
17+
st.title("🎮 Dashboard Risultati Quiz Python")
18+
st.write("Analisi delle risposte degli studenti")
19+
20+
# ========================================
21+
# CARICAMENTO DATI
22+
# ========================================
23+
# Carica i 3 CSV
24+
df_domande = pl.read_csv("domande.csv")
25+
df_risposte = pl.read_csv("risposte.csv")
26+
df_studenti = pl.read_csv("risposte_tutti.csv")
27+
28+
# ========================================
29+
# SEZIONE 1: STATISTICHE GENERALI
30+
# ========================================
31+
st.header("📊 Statistiche Generali")
32+
33+
# Calcola metriche base
34+
num_studenti = df_studenti.select("nome_utente").unique().height
35+
num_domande = df_domande.height
36+
totale_risposte = df_studenti.height
37+
38+
# Mostra le metriche in colonne
39+
col1, col2, col3 = st.columns(3)
40+
with col1:
41+
st.metric("👥 Studenti partecipanti", num_studenti)
42+
with col2:
43+
st.metric("❓ Domande totali", num_domande)
44+
with col3:
45+
st.metric("✍️ Risposte date", totale_risposte)
46+
47+
# ========================================
48+
# SEZIONE 2: ANALISI CORRETTEZZA
49+
# ========================================
50+
st.header("✅ Analisi Correttezza Risposte")
51+
52+
# Join per verificare le risposte corrette
53+
df_con_corrette = df_studenti.join(
54+
df_risposte,
55+
on="id_domanda",
56+
how="left"
57+
)
58+
59+
# Aggiungi colonna che indica se la risposta è corretta
60+
df_con_corrette = df_con_corrette.with_columns(
61+
(pl.col("numero_risposta_fornita") == pl.col("numero_risposta_corretta"))
62+
.alias("corretta")
63+
)
64+
65+
# Calcola percentuale risposte corrette
66+
risposte_corrette = df_con_corrette.filter(pl.col("corretta") == True).height
67+
percentuale_corrette = (risposte_corrette / totale_risposte * 100) if totale_risposte > 0 else 0
68+
69+
st.metric(
70+
"Percentuale risposte corrette",
71+
f"{percentuale_corrette:.1f}%"
72+
)
73+
74+
# ========================================
75+
# SEZIONE 3: CLASSIFICA STUDENTI
76+
# ========================================
77+
st.header("🏆 Classifica Studenti")
78+
79+
# Calcola punteggio per studente
80+
classifica = (
81+
df_con_corrette
82+
.group_by("nome_utente")
83+
.agg([
84+
pl.col("corretta").sum().alias("risposte_corrette"),
85+
pl.col("id_domanda").count().alias("domande_risposte"),
86+
pl.col("tempo_risposta").mean().alias("tempo_medio")
87+
])
88+
.sort("risposte_corrette", descending=True)
89+
)
90+
91+
# Mostra la classifica
92+
st.dataframe(
93+
classifica,
94+
width='stretch',
95+
hide_index=True
96+
)
97+
98+
# ========================================
99+
# SEZIONE 4: DIFFICOLTÀ DOMANDE
100+
# ========================================
101+
st.header("📈 Difficoltà Domande")
102+
103+
# Calcola percentuale di successo per domanda
104+
difficolta = (
105+
df_con_corrette
106+
.group_by("id_domanda")
107+
.agg([
108+
pl.col("corretta").sum().alias("risposte_corrette"),
109+
pl.col("corretta").count().alias("totale_risposte")
110+
])
111+
.with_columns(
112+
(pl.col("risposte_corrette") / pl.col("totale_risposte") * 100)
113+
.alias("percentuale_corrette")
114+
)
115+
.sort("percentuale_corrette")
116+
)
117+
118+
# Join con il testo delle domande
119+
difficolta = difficolta.join(
120+
df_domande.select(["id_domanda", "domanda"]),
121+
on="id_domanda",
122+
how="left"
123+
)
124+
125+
# Mostra tabella difficoltà
126+
st.dataframe(
127+
difficolta.select(["id_domanda", "domanda", "percentuale_corrette"]),
128+
width='stretch',
129+
hide_index=True
130+
)
131+
132+
# ========================================
133+
# SEZIONE 5: GRAFICO A BARRE
134+
# ========================================
135+
st.header("📊 Grafico Prestazioni")
136+
137+
# Prepara dati per il grafico
138+
dati_grafico = classifica.select(["nome_utente", "risposte_corrette"])
139+
140+
# Crea grafico a barre
141+
st.bar_chart(
142+
dati_grafico,
143+
x="nome_utente",
144+
y="risposte_corrette",
145+
width='stretch'
146+
)
147+
148+
# ========================================
149+
# SEZIONE 6: TEMPO MEDIO DI RISPOSTA
150+
# ========================================
151+
st.header("⏱️ Tempo Medio di Risposta")
152+
153+
tempo_medio_globale = df_studenti.select(pl.col("tempo_risposta").mean())[0, 0]
154+
st.metric("Tempo medio per risposta", f"{tempo_medio_globale:.0f} ms")
155+
156+
# Grafico tempo per domanda
157+
tempo_per_domanda = (
158+
df_studenti
159+
.group_by("id_domanda")
160+
.agg(pl.col("tempo_risposta").mean().alias("tempo_medio"))
161+
.sort("id_domanda")
162+
)
163+
164+
st.bar_chart(
165+
tempo_per_domanda,
166+
x="id_domanda",
167+
y="tempo_medio",
168+
width='stretch'
169+
)

game13/domande.csv

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
id_domanda,domanda,risposta_1,risposta_2,risposta_3,risposta_4
2+
1,Cosa succede se si accede a lista[5] ma la lista ha 2 elementi?,Restituisce None,Errore,Restituisce 0,Python ignora
3+
2,Qual è lo scopo della funzione update() in pgzero?,Creare liste,Stampare output,Aggiornare lo stato del gioco,Leggere input
4+
3,Perché dividere il codice in funzioni?,Per usare meno variabili,Per evitare errori,Per velocità,Per renderlo più leggibile e riutilizzabile
5+
4,Quando è più corretto usare un ciclo while?,Quando si scorre una lista,Quando non si conosce il numero di iterazioni,Mai,Sempre
6+
5,Cosa controlla una condizione if?,Il punteggio,Una decisione logica,Il loop,La grafica
7+
6,Perché si inizializzano le variabili prima del loop?,Per stile,Non serve,Per evitare valori non definiti,Per velocità
8+
7,Cosa succede se una funzione non viene mai chiamata?,Blocca il programma,Va in errore,Esegue comunque,Non viene eseguita
9+
8,Perché Python usa l’indentazione?,Per compatibilità,Per velocità,Per sicurezza,Per definire i blocchi di codice
10+
9,Qual è la differenza tra = e == ?,Entrambi assegnano,Assegnazione e confronto,Nessuna differenza,Entrambi confrontano
11+
10,"Cosa restituisce len([1,2,3])?",1,Errore,2,3
12+
11,Quale metodo aggiunge un elemento in fondo a una lista?,push(),insert(),append(),add()
13+
12,Cosa succede se una condizione if è falsa?,Il programma si ferma,Va in errore,Il blocco non viene eseguito,Il loop termina
14+
13,Cosa succede se manca l’indentazione corretta in un if?,Il blocco è ignorato,Python corregge,Il codice funziona,Errore
15+
14,Quale nome di variabile è valido in Python?,player-score,player_score,2player,player score
16+
15,Cosa fa break in un ciclo while?,Riavvia il ciclo,Interrompe il ciclo,Ferma il programma,Salta un’iterazione
17+
16,Cosa fa continue in un ciclo?,Riavvia il loop,Interrompe il ciclo,Ferma il programma,Salta all’iterazione successiva
18+
17,Cosa succede se si sommano due stringhe in Python?,Risultato numerico,Vengono concatenate, Risultato numerico negativo,Errore
19+
18,Quale parola chiave definisce una funzione in Python?,lambda,function,def,fun
20+
19,Cosa succede se una lista è vuota e si accede a lista[0]?,Esplosione,Python ignora,Errore,0
21+
20,Come si crea una lista vuota?,Abracadabra,[],(),{}

game13/risposte.csv

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
id_domanda,numero_risposta_corretta
2+
1,2
3+
2,3
4+
3,4
5+
4,2
6+
5,2
7+
6,3
8+
7,4
9+
8,4
10+
9,2
11+
10,4
12+
11,3
13+
12,3
14+
13,4
15+
14,2
16+
15,2
17+
16,4
18+
17,2
19+
18,3
20+
19,3
21+
20,2

0 commit comments

Comments
 (0)