fix: stat on class when no evalution
This commit is contained in:
51
models.py
51
models.py
@@ -410,6 +410,7 @@ class ClassGroup(db.Model):
|
|||||||
'assessments_count': 0,
|
'assessments_count': 0,
|
||||||
'students_count': len(self.students),
|
'students_count': len(self.students),
|
||||||
'class_averages': [],
|
'class_averages': [],
|
||||||
|
'student_averages': [],
|
||||||
'overall_statistics': {
|
'overall_statistics': {
|
||||||
'count': 0,
|
'count': 0,
|
||||||
'mean': 0,
|
'mean': 0,
|
||||||
@@ -418,7 +419,8 @@ class ClassGroup(db.Model):
|
|||||||
'max': 0,
|
'max': 0,
|
||||||
'std_dev': 0
|
'std_dev': 0
|
||||||
},
|
},
|
||||||
'distribution': []
|
'distribution': [],
|
||||||
|
'student_averages_distribution': []
|
||||||
}
|
}
|
||||||
|
|
||||||
# Calculer les moyennes par évaluation et par élève
|
# Calculer les moyennes par évaluation et par élève
|
||||||
@@ -468,7 +470,7 @@ class ClassGroup(db.Model):
|
|||||||
avg = statistics.mean(scores)
|
avg = statistics.mean(scores)
|
||||||
student_final_averages.append(round(avg, 2))
|
student_final_averages.append(round(avg, 2))
|
||||||
|
|
||||||
# Statistiques globales sur toutes les notes du trimestre
|
# Statistiques globales basées sur les moyennes des élèves (cohérent avec l'histogramme)
|
||||||
overall_stats = {
|
overall_stats = {
|
||||||
'count': 0,
|
'count': 0,
|
||||||
'mean': 0,
|
'mean': 0,
|
||||||
@@ -481,41 +483,21 @@ class ClassGroup(db.Model):
|
|||||||
distribution = []
|
distribution = []
|
||||||
student_averages_distribution = []
|
student_averages_distribution = []
|
||||||
|
|
||||||
if all_individual_scores:
|
# Utiliser les moyennes des élèves pour les statistiques (cohérent avec l'histogramme)
|
||||||
|
if student_final_averages:
|
||||||
import statistics
|
import statistics
|
||||||
import math
|
import math
|
||||||
|
|
||||||
overall_stats = {
|
overall_stats = {
|
||||||
'count': len(all_individual_scores),
|
'count': len(student_final_averages),
|
||||||
'mean': round(statistics.mean(all_individual_scores), 2),
|
'mean': round(statistics.mean(student_final_averages), 2),
|
||||||
'median': round(statistics.median(all_individual_scores), 2),
|
'median': round(statistics.median(student_final_averages), 2),
|
||||||
'min': round(min(all_individual_scores), 2),
|
'min': round(min(student_final_averages), 2),
|
||||||
'max': round(max(all_individual_scores), 2),
|
'max': round(max(student_final_averages), 2),
|
||||||
'std_dev': round(statistics.stdev(all_individual_scores) if len(all_individual_scores) > 1 else 0, 2)
|
'std_dev': round(statistics.stdev(student_final_averages) if len(student_final_averages) > 1 else 0, 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Créer l'histogramme de distribution (bins de 1 point sur 20)
|
|
||||||
bins = list(range(0, 22)) # 0-1, 1-2, ..., 19-20, 20+
|
|
||||||
bin_counts = [0] * (len(bins) - 1)
|
|
||||||
|
|
||||||
for score in all_individual_scores:
|
|
||||||
# Trouver le bon bin
|
|
||||||
bin_index = min(int(score), len(bin_counts) - 1)
|
|
||||||
bin_counts[bin_index] += 1
|
|
||||||
|
|
||||||
# Formatage pour Chart.js
|
|
||||||
for i in range(len(bin_counts)):
|
|
||||||
if i == len(bin_counts) - 1:
|
|
||||||
label = f"{bins[i]}+"
|
|
||||||
else:
|
|
||||||
label = f"{bins[i]}-{bins[i+1]}"
|
|
||||||
|
|
||||||
distribution.append({
|
|
||||||
'range': label,
|
|
||||||
'count': bin_counts[i]
|
|
||||||
})
|
|
||||||
|
|
||||||
# Créer l'histogramme des moyennes des élèves
|
# Créer l'histogramme des moyennes des élèves (distribution principale)
|
||||||
if student_final_averages:
|
if student_final_averages:
|
||||||
# Bins pour les moyennes des élèves (de 0 à 20)
|
# Bins pour les moyennes des élèves (de 0 à 20)
|
||||||
avg_bins = list(range(0, 22))
|
avg_bins = list(range(0, 22))
|
||||||
@@ -533,10 +515,13 @@ class ClassGroup(db.Model):
|
|||||||
else:
|
else:
|
||||||
label = f"{avg_bins[i]}-{avg_bins[i+1]}"
|
label = f"{avg_bins[i]}-{avg_bins[i+1]}"
|
||||||
|
|
||||||
student_averages_distribution.append({
|
bin_data = {
|
||||||
'range': label,
|
'range': label,
|
||||||
'count': avg_bin_counts[i]
|
'count': avg_bin_counts[i]
|
||||||
})
|
}
|
||||||
|
student_averages_distribution.append(bin_data)
|
||||||
|
# Maintenir la compatibilité avec distribution (même données maintenant)
|
||||||
|
distribution.append(bin_data.copy())
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'trimester': trimester,
|
'trimester': trimester,
|
||||||
|
|||||||
Reference in New Issue
Block a user