mrcryptsie commited on
Commit
aadd23b
·
1 Parent(s): 5f6db28
Files changed (11) hide show
  1. README.md +18 -9
  2. app.py +162 -0
  3. coefficients.py +9 -0
  4. data.py +212 -0
  5. debouche.py +14 -0
  6. etablissement.py +11 -0
  7. filiere.py +23 -0
  8. main.py +48 -0
  9. student.py +23 -0
  10. universite.py +12 -0
  11. utils.py +62 -0
README.md CHANGED
@@ -1,14 +1,23 @@
1
  ---
2
- title: Recommended Algo Orienty
3
- emoji: 😻
4
- colorFrom: indigo
5
- colorTo: gray
6
- sdk: gradio
7
- sdk_version: 5.11.0
8
  app_file: app.py
9
  pinned: false
10
- license: mit
11
- short_description: Algorithme de recommandation
12
  ---
13
 
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: ALGORITHME DE RECOMMANDATION
3
+ emoji: 🎓
4
+ colorFrom: blue
5
+ colorTo: indigo
6
+ sdk: streamlit
7
+ sdk_version: "1.22.0"
8
  app_file: app.py
9
  pinned: false
 
 
10
  ---
11
 
12
+ # ALGORITHME DE RECOMMANDATION
13
+
14
+ ## Fonctionnalités
15
+
16
+ - **Gestion des étudiants** : Stocke les informations des étudiants (nom, prénom, série, résultats scolaires).
17
+ - **Calcul des moyennes** : Calcule les moyennes des étudiants par matière et par année.
18
+ - **Sélection des meilleures matières** : Identifie les matières où l'étudiant excelle.
19
+ - **Proposition de filières** : Propose des filières d'études en fonction des meilleures matières de l'étudiant.
20
+ - **Visualisation des débouchés** : Affiche les débouchés professionnels associés à chaque filière.
21
+
22
+ ---
23
+
app.py ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from data import coefficients_C, coefficients_D, filieres, students
3
+ from utils import (
4
+ get_student_by_id,
5
+ calculer_moyennes,
6
+ calculer_scores_selection,
7
+ selectionner_meilleures_matieres,
8
+ compter_occurrences_meilleures_matieres,
9
+ selectionner_top_matieres,
10
+ proposer_filieres
11
+ )
12
+
13
+ def analyser_etudiant(student_id):
14
+ # Vérifier si l'étudiant existe
15
+ student = get_student_by_id(students, student_id)
16
+ if not student:
17
+ return ["Étudiant introuvable"] + [""] * 14 # Retourner 15 valeurs vides si l'étudiant n'est pas trouvé
18
+
19
+ # Définir les coefficients et les biais
20
+ coefficients = coefficients_C if student.serie == "C" else coefficients_D
21
+ biais = {
22
+ "Mathématiques": 5,
23
+ "Physique-Chimie": 4,
24
+ "Informatique": 3,
25
+ "Français": 2,
26
+ "Philosophie": 1,
27
+ "Anglais": 2
28
+ }
29
+
30
+ # Étape 1 : Calcul des moyennes (hors Baccalauréat)
31
+ moyennes = calculer_moyennes(student.resultats)
32
+ moyennes_seconde = "\n".join([f"- {matiere}: {moyenne}" for matiere, moyenne in moyennes["Seconde"].items()])
33
+ moyennes_premiere = "\n".join([f"- {matiere}: {moyenne}" for matiere, moyenne in moyennes["Première"].items()])
34
+ moyennes_terminale = "\n".join([f"- {matiere}: {moyenne}" for matiere, moyenne in moyennes["Terminale"].items()])
35
+
36
+ # Étape 2 : Calcul des scores (hors Baccalauréat)
37
+ scores = calculer_scores_selection(moyennes, coefficients, biais)
38
+ scores_seconde = "\n".join([f"- {matiere}: {score}" for matiere, score in scores["Seconde"].items()])
39
+ scores_premiere = "\n".join([f"- {matiere}: {score}" for matiere, score in scores["Première"].items()])
40
+ scores_terminale = "\n".join([f"- {matiere}: {score}" for matiere, score in scores["Terminale"].items()])
41
+
42
+ # Étape 3 : Calcul des scores pour le Baccalauréat
43
+ scores_bac = {}
44
+ for matiere, note in student.resultats["Baccalauréat"].items():
45
+ coef = coefficients.get_coefficient(matiere)
46
+ score_bac = (note * coef) + note + biais.get(matiere, 0)
47
+ scores_bac[matiere] = score_bac
48
+
49
+ # Ajout des scores du Baccalauréat aux scores globaux
50
+ scores["Baccalauréat"] = scores_bac
51
+ scores_bac_str = "\n".join([f"- {matiere}: {score}" for matiere, score in scores_bac.items()])
52
+
53
+ # Étape 4 : Sélection des meilleures matières par année (y compris Baccalauréat)
54
+ meilleures_matieres = selectionner_meilleures_matieres(scores)
55
+ meilleures_seconde = "\n".join([f"- {matiere}" for matiere in meilleures_matieres.get("Seconde", [])])
56
+ meilleures_premiere = "\n".join([f"- {matiere}" for matiere in meilleures_matieres.get("Première", [])])
57
+ meilleures_terminale = "\n".join([f"- {matiere}" for matiere in meilleures_matieres.get("Terminale", [])])
58
+ meilleures_bac = "\n".join([f"- {matiere}" for matiere in meilleures_matieres.get("Baccalauréat", [])])
59
+
60
+ # Étape 5 : Comptage des occurrences des meilleures matières
61
+ occurrences = compter_occurrences_meilleures_matieres(meilleures_matieres)
62
+ occurrences_str = "\n".join([f"- {matiere}: {count}" for matiere, count in occurrences.items()])
63
+
64
+ # Étape 6 : Sélection des quatre meilleures matières
65
+ top_matieres = selectionner_top_matieres(occurrences, biais)
66
+ top_matieres_str = "\n".join([f"- {matiere}" for matiere in top_matieres])
67
+
68
+ # Étape 7 : Proposition des filières
69
+ propositions = proposer_filieres(top_matieres, filieres, student.serie)
70
+ propositions_str = "\n".join([f"- {filiere.nom}" for filiere in propositions])
71
+
72
+ # Retourner toutes les étapes (15 valeurs)
73
+ return [
74
+ f"Étudiant : {student.nom}", # Informations étudiant
75
+ moyennes_seconde, moyennes_premiere, moyennes_terminale, # Moyennes par année
76
+ scores_seconde, scores_premiere, scores_terminale, # Scores par année
77
+ scores_bac_str, # Scores du Baccalauréat
78
+ meilleures_seconde, meilleures_premiere, meilleures_terminale, meilleures_bac, # Meilleures matières par année
79
+ occurrences_str, # Occurrences des meilleures matières
80
+ top_matieres_str, # Quatre meilleures matières
81
+ propositions_str # Filières proposées
82
+ ]
83
+ # Interface Gradio stylisée avec années séparées
84
+ with gr.Blocks(theme=gr.themes.Soft()) as interface:
85
+ gr.Markdown("# 🎓 Analyse des Étudiants et Suggestions de Filières 🎓")
86
+ gr.Markdown("Cette application analyse les résultats scolaires d'un étudiant et propose des filières adaptées en fonction de ses performances.")
87
+
88
+ with gr.Row():
89
+ with gr.Column():
90
+ student_id_input = gr.Textbox(label="🔍 Identifiant Étudiant", placeholder="E001", lines=1)
91
+ analyze_button = gr.Button("🚀 Analyser", variant="primary")
92
+
93
+ with gr.Column():
94
+ student_info = gr.Textbox(label="👤 Informations Étudiant", interactive=False)
95
+
96
+ with gr.Tab("📊 Moyennes et Scores"):
97
+ with gr.Row():
98
+ with gr.Column():
99
+ gr.Markdown("### 📈 Moyennes par Année")
100
+ with gr.Group():
101
+ gr.Markdown("#### Seconde")
102
+ moyennes_seconde = gr.Textbox(label="", interactive=False, lines=4)
103
+ gr.Markdown("#### Première")
104
+ moyennes_premiere = gr.Textbox(label="", interactive=False, lines=4)
105
+ gr.Markdown("#### Terminale")
106
+ moyennes_terminale = gr.Textbox(label="", interactive=False, lines=4)
107
+ with gr.Column():
108
+ gr.Markdown("### 📊 Scores par Année")
109
+ with gr.Group():
110
+ gr.Markdown("#### Seconde")
111
+ scores_seconde = gr.Textbox(label="", interactive=False, lines=4)
112
+ gr.Markdown("#### Première")
113
+ scores_premiere = gr.Textbox(label="", interactive=False, lines=4)
114
+ gr.Markdown("#### Terminale")
115
+ scores_terminale = gr.Textbox(label="", interactive=False, lines=4)
116
+ with gr.Column():
117
+ gr.Markdown("### 🏆 Scores du Baccalauréat")
118
+ scores_bac_output = gr.Textbox(label="", interactive=False, lines=6)
119
+
120
+ with gr.Tab("🏅 Meilleures Matières"):
121
+ with gr.Row():
122
+ with gr.Column():
123
+ gr.Markdown("### 🥇 Meilleures Matières par Année")
124
+ with gr.Group():
125
+ gr.Markdown("#### Seconde")
126
+ meilleures_seconde = gr.Textbox(label="", interactive=False, lines=3)
127
+ gr.Markdown("#### Première")
128
+ meilleures_premiere = gr.Textbox(label="", interactive=False, lines=3)
129
+ gr.Markdown("#### Terminale")
130
+ meilleures_terminale = gr.Textbox(label="", interactive=False, lines=3)
131
+ gr.Markdown("#### Baccalauréat")
132
+ meilleures_bac = gr.Textbox(label="", interactive=False, lines=3)
133
+ with gr.Column():
134
+ gr.Markdown("### 🔢 Occurrences des Meilleures Matières")
135
+ occurrences_output = gr.Textbox(label="", interactive=False, lines=6)
136
+ with gr.Column():
137
+ gr.Markdown("### 🏅 Quatre Meilleures Matières")
138
+ top_matieres_output = gr.Textbox(label="", interactive=False, lines=4)
139
+
140
+ with gr.Tab("🎓 Filières Proposées"):
141
+ gr.Markdown("### 📚 Filières Proposées")
142
+ propositions_output = gr.Textbox(label="", interactive=False, lines=6)
143
+
144
+ # Lier le bouton à la fonction
145
+ analyze_button.click(
146
+ analyser_etudiant,
147
+ inputs=[student_id_input],
148
+ outputs=[
149
+ student_info,
150
+ moyennes_seconde, moyennes_premiere, moyennes_terminale,
151
+ scores_seconde, scores_premiere, scores_terminale,
152
+ scores_bac_output,
153
+ meilleures_seconde, meilleures_premiere, meilleures_terminale, meilleures_bac,
154
+ occurrences_output,
155
+ top_matieres_output,
156
+ propositions_output
157
+ ]
158
+ )
159
+
160
+ # Lancer l'application
161
+ if __name__ == "__main__":
162
+ interface.launch()
coefficients.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ class Coefficients:
2
+ def __init__(self, serie, matieres):
3
+ self.serie = serie
4
+ self.matieres = matieres
5
+
6
+ def get_coefficient(self, matiere):
7
+ if matiere not in self.matieres:
8
+ raise ValueError(f"Matière '{matiere}' non trouvée dans les coefficients pour la série {self.serie}.")
9
+ return self.matieres.get(matiere, 1)
data.py ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from coefficients import Coefficients
2
+ from debouche import Debouche
3
+ from filiere import Filiere
4
+ from etablissement import Etablissement
5
+ from universite import Universite
6
+ from student import Student
7
+
8
+ # Coefficients pour chaque série
9
+ coefficients_C = Coefficients("C", {
10
+ "Mathématiques": 4,
11
+ "Physique-Chimie": 3,
12
+ "Informatique": 2,
13
+ "Français": 2,
14
+ "Philosophie": 1,
15
+ "Anglais": 2
16
+ })
17
+
18
+ coefficients_D = Coefficients("D", {
19
+ "Mathématiques": 4,
20
+ "SVT": 3,
21
+ "Informatique": 2,
22
+ "Français": 2,
23
+ "Philosophie": 1,
24
+ "Anglais": 2
25
+ })
26
+
27
+ # Simulation des débouchés (40 débouchés)
28
+ debouches_informatique = [
29
+ Debouche("Développeur Web", "Informatique", 45000, 95, "Très bonnes"),
30
+ Debouche("Data Scientist", "Informatique", 60000, 90, "Excellentes"),
31
+ Debouche("Ingénieur Logiciel", "Informatique", 55000, 92, "Très bonnes"),
32
+ Debouche("Administrateur Système", "Informatique", 50000, 88, "Bonnes"),
33
+ Debouche("Analyste Cybersécurité", "Informatique", 65000, 94, "Excellentes"),
34
+ Debouche("Concepteur UI/UX", "Informatique", 48000, 89, "Bonnes"),
35
+ Debouche("Architecte Cloud", "Informatique", 70000, 93, "Excellentes"),
36
+ Debouche("Ingénieur DevOps", "Informatique", 68000, 91, "Très bonnes"),
37
+ Debouche("Développeur Mobile", "Informatique", 52000, 87, "Bonnes"),
38
+ Debouche("Ingénieur Réseaux", "Informatique", 58000, 90, "Très bonnes")
39
+ ]
40
+
41
+ debouches_medecine = [
42
+ Debouche("Médecin Généraliste", "Santé", 75000, 98, "Bonnes"),
43
+ Debouche("Chirurgien", "Santé", 120000, 99, "Excellentes"),
44
+ Debouche("Dentiste", "Santé", 90000, 97, "Bonnes"),
45
+ Debouche("Pharmacien", "Santé", 85000, 96, "Bonnes"),
46
+ Debouche("Infirmier", "Santé", 50000, 95, "Bonnes"),
47
+ Debouche("Radiologue", "Santé", 110000, 98, "Excellentes"),
48
+ Debouche("Pédiatre", "Santé", 95000, 97, "Bonnes"),
49
+ Debouche("Cardiologue", "Santé", 130000, 99, "Excellentes"),
50
+ Debouche("Psychiatre", "Santé", 100000, 96, "Bonnes"),
51
+ Debouche("Vétérinaire", "Santé", 80000, 95, "Bonnes")
52
+ ]
53
+
54
+ debouches_ingenierie = [
55
+ Debouche("Ingénieur Civil", "Ingénierie", 70000, 92, "Très bonnes"),
56
+ Debouche("Ingénieur Mécanique", "Ingénierie", 72000, 91, "Très bonnes"),
57
+ Debouche("Ingénieur Électrique", "Ingénierie", 75000, 93, "Excellentes"),
58
+ Debouche("Ingénieur Chimiste", "Ingénierie", 68000, 90, "Bonnes"),
59
+ Debouche("Ingénieur Aérospatial", "Ingénierie", 85000, 94, "Excellentes"),
60
+ Debouche("Ingénieur Environnemental", "Ingénierie", 65000, 89, "Bonnes"),
61
+ Debouche("Ingénieur Industriel", "Ingénierie", 70000, 91, "Très bonnes"),
62
+ Debouche("Ingénieur Matériaux", "Ingénierie", 73000, 92, "Très bonnes"),
63
+ Debouche("Ingénieur Robotique", "Ingénierie", 78000, 93, "Excellentes"),
64
+ Debouche("Ingénieur Biomédical", "Ingénierie", 76000, 92, "Très bonnes")
65
+ ]
66
+
67
+ debouches_commerce = [
68
+ Debouche("Analyste Financier", "Commerce", 60000, 90, "Très bonnes"),
69
+ Debouche("Responsable Marketing", "Commerce", 58000, 89, "Bonnes"),
70
+ Debouche("Chef de Projet", "Commerce", 65000, 91, "Très bonnes"),
71
+ Debouche("Consultant en Gestion", "Commerce", 70000, 92, "Très bonnes"),
72
+ Debouche("Directeur des Ventes", "Commerce", 80000, 93, "Excellentes"),
73
+ Debouche("Analyste Commercial", "Commerce", 55000, 88, "Bonnes"),
74
+ Debouche("Responsable RH", "Commerce", 62000, 90, "Très bonnes"),
75
+ Debouche("Entrepreneur", "Commerce", 75000, 92, "Très bonnes"),
76
+ Debouche("Analyste de Données", "Commerce", 68000, 91, "Très bonnes"),
77
+ Debouche("Responsable Logistique", "Commerce", 60000, 89, "Bonnes")
78
+ ]
79
+
80
+ # Simulation des filières (15 filières)
81
+ filieres = [
82
+ Filiere("F001", "Informatique", "Université A", "École des Sciences Informatiques", "C", ["Mathématiques", "Informatique", "Anglais"], debouches_informatique),
83
+ Filiere("F002", "Génie Logiciel", "Université A", "École des Sciences Informatiques", "C", ["Mathématiques", "Informatique", "Physique-Chimie"], debouches_informatique),
84
+ Filiere("F003", "Médecine", "Université B", "Faculté de Médecine", "D", ["Biologie", "Physique", "Chimie"], debouches_medecine),
85
+ Filiere("F004", "Génie Civil", "Université B", "École d'Ingénierie", "D", ["Mathématiques", "Physique", "Chimie"], debouches_ingenierie),
86
+ Filiere("F005", "Pharmacie", "Université B", "Faculté de Médecine", "D", ["Biologie", "Chimie", "Physique"], debouches_medecine),
87
+ Filiere("F006", "Ingénierie Mécanique", "Université C", "École d'Ingénierie", "C", ["Mathématiques", "Physique", "Informatique"], debouches_ingenierie),
88
+ Filiere("F007", "Ingénierie Électrique", "Université C", "École d'Ingénierie", "C", ["Mathématiques", "Physique", "Informatique"], debouches_ingenierie),
89
+ Filiere("F008", "Commerce International", "Université D", "École de Commerce", "D", ["Mathématiques", "Anglais", "Français"], debouches_commerce),
90
+ Filiere("F009", "Marketing", "Université D", "École de Commerce", "D", ["Mathématiques", "Anglais", "Français"], debouches_commerce),
91
+ Filiere("F010", "Biologie Moléculaire", "Université E", "Faculté des Sciences", "D", ["Biologie", "Chimie", "Physique"], debouches_medecine),
92
+ Filiere("F011", "Chimie Industrielle", "Université E", "Faculté des Sciences", "C", ["Chimie", "Physique", "Mathématiques"], debouches_ingenierie),
93
+ Filiere("F012", "Physique Appliquée", "Université F", "Faculté des Sciences", "C", ["Physique", "Mathématiques", "Informatique"], debouches_ingenierie),
94
+ Filiere("F013", "Mathématiques Appliquées", "Université F", "Faculté des Sciences", "C", ["Mathématiques", "Informatique", "Physique"], debouches_informatique),
95
+ Filiere("F014", "Économie", "Université G", "École de Commerce", "D", ["Mathématiques", "Français", "Anglais"], debouches_commerce),
96
+ Filiere("F015", "Gestion des Entreprises", "Université G", "École de Commerce", "D", ["Mathématiques", "Français", "Anglais"], debouches_commerce)
97
+ ]
98
+
99
+ # Simulation des établissements
100
+ etablissements = [
101
+ Etablissement("École des Sciences Informatiques", "École", [filieres[0], filieres[1]]),
102
+ Etablissement("Faculté de Médecine", "Faculté", [filieres[2], filieres[4]]),
103
+ Etablissement("École d'Ingénierie", "École", [filieres[3], filieres[5], filieres[6]]),
104
+ Etablissement("École de Commerce", "École", [filieres[7], filieres[8], filieres[13], filieres[14]]),
105
+ Etablissement("Faculté des Sciences", "Faculté", [filieres[9], filieres[10], filieres[11], filieres[12]])
106
+ ]
107
+
108
+ # Simulation des universités
109
+ universites = [
110
+ Universite("Université A", [etablissements[0]]),
111
+ Universite("Université B", [etablissements[1], etablissements[2]]),
112
+ Universite("Université C", [etablissements[2]]),
113
+ Universite("Université D", [etablissements[3]]),
114
+ Universite("Université E", [etablissements[4]]),
115
+ Universite("Université F", [etablissements[4]]),
116
+ Universite("Université G", [etablissements[3]])
117
+ ]
118
+
119
+ # Simulation des étudiants (10 étudiants)
120
+ students = [
121
+ Student("E001", "John", "Doe", "C", {
122
+ "Seconde": {"Mathématiques": {"Semestre 1": 12, "Semestre 2": 8}, "Physique-Chimie": {"Semestre 1": 10, "Semestre 2": 13},
123
+ "Informatique": {"Semestre 1": 16, "Semestre 2": 17}, "Français": {"Semestre 1": 8, "Semestre 2": 13.5},
124
+ "Philosophie": {"Semestre 1": 11, "Semestre 2": 12}, "Anglais": {"Semestre 1": 15, "Semestre 2": 14}},
125
+ "Première": {"Mathématiques": {"Semestre 1": 14, "Semestre 2": 5}, "Physique-Chimie": {"Semestre 1": 20, "Semestre 2": 14},
126
+ "Informatique": {"Semestre 1": 10, "Semestre 2": 18}, "Français": {"Semestre 1": 15, "Semestre 2": 14},
127
+ "Philosophie": {"Semestre 1": 15, "Semestre 2": 14}, "Anglais": {"Semestre 1": 16, "Semestre 2": 15}},
128
+ "Terminale": {"Mathématiques": {"Semestre 1": 10, "Semestre 2": 16}, "Physique-Chimie": {"Semestre 1": 14, "Semestre 2": 15},
129
+ "Informatique": {"Semestre 1": 10, "Semestre 2": 19}, "Français": {"Semestre 1": 16, "Semestre 2": 15},
130
+ "Philosophie": {"Semestre 1": 10, "Semestre 2": 15}, "Anglais": {"Semestre 1": 18, "Semestre 2": 18}},
131
+ "Baccalauréat": {"Mathématiques": 10, "Physique-Chimie": 19, "Informatique": 12, "Français": 20, "Philosophie": 19, "Anglais": 20}}),
132
+
133
+ Student("E002", "Alice", "Smith", "D", {
134
+ "Seconde": {"Mathématiques": {"Semestre 1": 14.5, "Semestre 2": 15.5}, "SVT": {"Semestre 1": 13.5, "Semestre 2": 14.5},
135
+ "Informatique": {"Semestre 1": 16, "Semestre 2": 16.5}, "Français": {"Semestre 1": 12, "Semestre 2": 13},
136
+ "Philosophie": {"Semestre 1": 10.5, "Semestre 2": 11}, "Anglais": {"Semestre 1": 14, "Semestre 2": 15}},
137
+ "Première": {"Mathématiques": {"Semestre 1": 14, "Semestre 2": 15}, "SVT": {"Semestre 1": 13, "Semestre 2": 14},
138
+ "Informatique": {"Semestre 1": 15, "Semestre 2": 16}, "Français": {"Semestre 1": 13, "Semestre 2": 14},
139
+ "Philosophie": {"Semestre 1": 12, "Semestre 2": 13}, "Anglais": {"Semestre 1": 15, "Semestre 2": 16}},
140
+ "Terminale": {"Mathématiques": {"Semestre 1": 15, "Semestre 2": 16}, "SVT": {"Semestre 1": 14.5, "Semestre 2": 15.5},
141
+ "Informatique": {"Semestre 1": 17, "Semestre 2": 18}, "Français": {"Semestre 1": 14, "Semestre 2": 15},
142
+ "Philosophie": {"Semestre 1": 13, "Semestre 2": 14}, "Anglais": {"Semestre 1": 16, "Semestre 2": 17}},
143
+ "Baccalauréat": {"Mathématiques": 16, "SVT": 15, "Informatique": 17, "Français": 15, "Philosophie": 13, "Anglais": 16}}),
144
+
145
+ Student("E003", "John", "Doe", "D", {
146
+ "Seconde": {"Mathématiques": {"Semestre 1": 13, "Semestre 2": 14}, "SVT": {"Semestre 1": 12.5, "Semestre 2": 13.5},
147
+ "Informatique": {"Semestre 1": 15.5, "Semestre 2": 16}, "Français": {"Semestre 1": 11.5, "Semestre 2": 12.5},
148
+ "Philosophie": {"Semestre 1": 10, "Semestre 2": 11}, "Anglais": {"Semestre 1": 13.5, "Semestre 2": 14}},
149
+ "Première": {"Mathématiques": {"Semestre 1": 14.5, "Semestre 2": 15.5}, "SVT": {"Semestre 1": 13, "Semestre 2": 14},
150
+ "Informatique": {"Semestre 1": 16, "Semestre 2": 16.5}, "Français": {"Semestre 1": 13, "Semestre 2": 14},
151
+ "Philosophie": {"Semestre 1": 11.5, "Semestre 2": 12.5}, "Anglais": {"Semestre 1": 14.5, "Semestre 2": 15}},
152
+ "Terminale": {"Mathématiques": {"Semestre 1": 16, "Semestre 2": 17}, "SVT": {"Semestre 1": 14.5, "Semestre 2": 15.5},
153
+ "Informatique": {"Semestre 1": 17.5, "Semestre 2": 18}, "Français": {"Semestre 1": 14, "Semestre 2": 15},
154
+ "Philosophie": {"Semestre 1": 12, "Semestre 2": 13}, "Anglais": {"Semestre 1": 15.5, "Semestre 2": 16}},
155
+ "Baccalauréat": {"Mathématiques": 17, "SVT": 15.5, "Informatique": 18, "Français": 15, "Philosophie": 12.5, "Anglais": 16.5}}),
156
+
157
+ Student("E004", "Emma", "Johnson", "D", {
158
+
159
+ "Seconde": {"Mathématiques": {"Semestre 1": 10.5, "Semestre 2": 11}, "SVT": {"Semestre 1": 12, "Semestre 2": 13},
160
+ "Informatique": {"Semestre 1": 13, "Semestre 2": 13.5}, "Français": {"Semestre 1": 14, "Semestre 2": 15},
161
+ "Philosophie": {"Semestre 1": 13.5, "Semestre 2": 14}, "Anglais": {"Semestre 1": 15, "Semestre 2": 16}},
162
+
163
+ "Première": {"Mathématiques": {"Semestre 1": 11, "Semestre 2": 12}, "SVT": {"Semestre 1": 13, "Semestre 2": 14},
164
+ "Informatique": {"Semestre 1": 14, "Semestre 2": 14.5}, "Français": {"Semestre 1": 15, "Semestre 2": 16},
165
+ "Philosophie": {"Semestre 1": 14.5, "Semestre 2": 15}, "Anglais": {"Semestre 1": 16, "Semestre 2": 17}},
166
+
167
+ "Terminale": {"Mathématiques": {"Semestre 1": 12, "Semestre 2": 12.5}, "SVT": {"Semestre 1": 14, "Semestre 2": 15},
168
+ "Informatique": {"Semestre 1": 15, "Semestre 2": 15.5}, "Français": {"Semestre 1": 16, "Semestre 2": 17},
169
+ "Philosophie": {"Semestre 1": 15.5, "Semestre 2": 16}, "Anglais": {"Semestre 1": 17, "Semestre 2": 17.5}},
170
+ "Baccalauréat": {"Mathématiques": 12.5, "SVT": 15, "Informatique": 15.5, "Français": 17, "Philosophie": 16, "Anglais": 17}}),
171
+
172
+ Student("E005", "Liam", "Brown", "D", {
173
+ "Seconde": {"Mathématiques": {"Semestre 1": 12.5, "Semestre 2": 13}, "SVT": {"Semestre 1": 14, "Semestre 2": 14.5},
174
+ "Informatique": {"Semestre 1": 16, "Semestre 2": 16.5}, "Français": {"Semestre 1": 11.5, "Semestre 2": 12},
175
+ "Philosophie": {"Semestre 1": 10, "Semestre 2": 10.5}, "Anglais": {"Semestre 1": 13, "Semestre 2": 14}},
176
+ "Première": {"Mathématiques": {"Semestre 1": 14, "Semestre 2": 14.5}, "SVT": {"Semestre 1": 15, "Semestre 2": 15.5},
177
+ "Informatique": {"Semestre 1": 17, "Semestre 2": 17.5}, "Français": {"Semestre 1": 12, "Semestre 2": 13},
178
+ "Philosophie": {"Semestre 1": 11, "Semestre 2": 11.5}, "Anglais": {"Semestre 1": 14.5, "Semestre 2": 15}},
179
+ "Terminale": {"Mathématiques": {"Semestre 1": 15.5, "Semestre 2": 16}, "SVT": {"Semestre 1": 16, "Semestre 2": 16.5},
180
+ "Informatique": {"Semestre 1": 18, "Semestre 2": 18.5}, "Français": {"Semestre 1": 14, "Semestre 2": 15},
181
+ "Philosophie": {"Semestre 1": 12, "Semestre 2": 12.5}, "Anglais": {"Semestre 1": 15.5, "Semestre 2": 16}},
182
+ "Baccalauréat": {"Mathématiques": 16, "SVT": 16.5, "Informatique": 18.5, "Français": 15, "Philosophie": 12.5, "Anglais": 16}}),
183
+
184
+ Student("E006", "Olivia", "Davis", "D", {
185
+ "Seconde": {"Mathématiques": {"Semestre 1": 11, "Semestre 2": 11.5}, "SVT": {"Semestre 1": 13.5, "Semestre 2": 14},
186
+ "Informatique": {"Semestre 1": 14.5, "Semestre 2": 15}, "Français": {"Semestre 1": 14, "Semestre 2": 15},
187
+ "Philosophie": {"Semestre 1": 12.5, "Semestre 2": 13}, "Anglais": {"Semestre 1": 14.5, "Semestre 2": 15.5}},
188
+ "Première": {"Mathématiques": {"Semestre 1": 12.5, "Semestre 2": 13}, "SVT": {"Semestre 1": 14.5, "Semestre 2": 15},
189
+ "Informatique": {"Semestre 1": 15.5, "Semestre 2": 16}, "Français": {"Semestre 1": 15, "Semestre 2": 16},
190
+ "Philosophie": {"Semestre 1": 13, "Semestre 2": 13.5}, "Anglais": {"Semestre 1": 16, "Semestre 2": 17}},
191
+ "Terminale": {"Mathématiques": {"Semestre 1": 13, "Semestre 2": 14}, "SVT": {"Semestre 1": 15, "Semestre 2": 15.5},
192
+ "Informatique": {"Semestre 1": 16.5, "Semestre 2": 17}, "Français": {"Semestre 1": 16.5, "Semestre 2": 17},
193
+ "Philosophie": {"Semestre 1": 14, "Semestre 2": 14.5}, "Anglais": {"Semestre 1": 17.5, "Semestre 2": 18}},
194
+ "Baccalauréat": {"Mathématiques": 14, "SVT": 15.5, "Informatique": 17, "Français": 17, "Philosophie": 14.5, "Anglais": 18}}),
195
+
196
+ Student("E007", "Sophia", "Miller", "D", {
197
+ "Seconde": {"Mathématiques": {"Semestre 1": 12, "Semestre 2": 13}, "SVT": {"Semestre 1": 14, "Semestre 2": 14.5},
198
+ "Informatique": {"Semestre 1": 15, "Semestre 2": 15.5}, "Français": {"Semestre 1": 13, "Semestre 2": 13.5},
199
+ "Philosophie": {"Semestre 1": 12, "Semestre 2": 12.5}, "Anglais": {"Semestre 1": 14.5, "Semestre 2": 15}},
200
+ "Première": {"Mathématiques": {"Semestre 1": 14, "Semestre 2": 14.5}, "SVT": {"Semestre 1": 15, "Semestre 2": 15.5},
201
+ "Informatique": {"Semestre 1": 16, "Semestre 2": 16.5}, "Français": {"Semestre 1": 14, "Semestre 2": 15},
202
+ "Philosophie": {"Semestre 1": 13, "Semestre 2": 13.5}, "Anglais": {"Semestre 1": 15.5, "Semestre 2": 16}},
203
+ "Terminale": {"Mathématiques": {"Semestre 1": 15, "Semestre 2": 15.5}, "SVT": {"Semestre 1": 16, "Semestre 2": 16.5},
204
+ "Informatique": {"Semestre 1": 17, "Semestre 2": 17.5}, "Français": {"Semestre 1": 15, "Semestre 2": 15.5},
205
+ "Philosophie": {"Semestre 1": 14, "Semestre 2": 14.5}, "Anglais": {"Semestre 1": 16.5, "Semestre 2": 17}},
206
+ "Baccalauréat": {"Mathématiques": 15.5, "SVT": 16.5, "Informatique": 17.5, "Français": 15.5, "Philosophie": 14.5, "Anglais": 17}}),
207
+
208
+
209
+ # Ajoutez 8 autres étudiants ici...
210
+ ]
211
+
212
+ # Ajoutez les 8 autres étudiants avec des résultats variés...
debouche.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class Debouche:
2
+ def __init__(self, nom, marche_emploi, salaire_moyen, taux_emploi, perspectives_croissance):
3
+ self.nom = nom
4
+ self.marche_emploi = marche_emploi
5
+ self.salaire_moyen = salaire_moyen
6
+ self.taux_emploi = taux_emploi
7
+ self.perspectives_croissance = perspectives_croissance
8
+
9
+ def afficher_info(self):
10
+ return (f"Débouché: {self.nom}\n"
11
+ f" Marché de l'emploi: {self.marche_emploi}\n"
12
+ f" Salaire moyen: {self.salaire_moyen} €/an\n"
13
+ f" Taux d'emploi: {self.taux_emploi}%\n"
14
+ f" Perspectives de croissance: {self.perspectives_croissance}\n")
etablissement.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class Etablissement:
2
+ def __init__(self, nom, type, filieres):
3
+ self.nom = nom
4
+ self.type = type
5
+ self.filieres = filieres
6
+
7
+ def afficher_filieres(self):
8
+ filieres_str = f"Établissement: {self.nom} ({self.type})\n"
9
+ for filiere in self.filieres:
10
+ filieres_str += f" - {filiere.nom}\n"
11
+ return filieres_str
filiere.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from debouche import Debouche
2
+
3
+ class Filiere:
4
+ def __init__(self, id, nom, universite, etablissement, serie, matieres, debouches):
5
+ self.id = id
6
+ self.nom = nom
7
+ self.universite = universite
8
+ self.etablissement = etablissement
9
+ self.serie = serie
10
+ self.matieres = matieres
11
+ self.debouches = debouches
12
+
13
+ def afficher_info(self):
14
+ info = (f"Filière: {self.nom}\n"
15
+ f" Identifiant de la filière: {self.id}\n"
16
+ f" Université: {self.universite}\n"
17
+ f" Établissement: {self.etablissement} ({'École' if 'École' in self.etablissement else 'Faculté'})\n"
18
+ f" Série correspondante: {self.serie}\n"
19
+ f" Matières : {', '.join(self.matieres)}\n"
20
+ f" Débouchés :\n")
21
+ for debouche in self.debouches:
22
+ info += debouche.afficher_info()
23
+ return info
main.py ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # main.py
2
+
3
+ from data import coefficients_C, coefficients_D, filieres, students
4
+ from utils import get_student_by_id, calculer_moyennes, calculer_scores_selection, selectionner_meilleures_matieres, afficher_meilleures_matieres, compter_occurrences_meilleures_matieres, selectionner_top_matieres, proposer_filieres
5
+
6
+ # Définir les coefficients et les biais
7
+ coefficients = coefficients_C if students[0].serie == "C" else coefficients_D
8
+ biais = {
9
+ "Mathématiques": 5,
10
+ "Physique-Chimie": 4,
11
+ "Informatique": 3,
12
+ "Français": 2,
13
+ "Philosophie": 1,
14
+ "Anglais": 2
15
+ }
16
+
17
+ # Exemple d'utilisation
18
+ student_id = "E001"
19
+ student = get_student_by_id(students, student_id)
20
+
21
+ # Calculer les moyennes des notes pour chaque matière (hors Baccalauréat)
22
+ moyennes = calculer_moyennes(student.resultats)
23
+
24
+ # Calculer les scores de sélection pour chaque matière
25
+ scores = calculer_scores_selection(moyennes, coefficients, biais)
26
+
27
+ # Sélectionner les trois meilleures matières pour chaque classe
28
+ meilleures_matieres = selectionner_meilleures_matieres(scores)
29
+
30
+ # Afficher les trois meilleures matières pour chaque classe et le Baccalauréat
31
+ afficher_meilleures_matieres(meilleures_matieres, student.resultats["Baccalauréat"])
32
+
33
+ # Sélectionner les quatre meilleures matières
34
+ occurrences = compter_occurrences_meilleures_matieres(meilleures_matieres)
35
+ top_matieres = selectionner_top_matieres(occurrences, biais)
36
+
37
+ # Afficher les quatre meilleures matières
38
+ print("Les quatre meilleures matières durant tout le parcours :")
39
+ for matiere in top_matieres:
40
+ print(f"- {matiere}")
41
+
42
+ # Proposer des filières en fonction des meilleures matières
43
+ propositions = proposer_filieres(top_matieres, filieres, student.serie)
44
+
45
+ # Afficher les propositions de filières
46
+ print("Propositions de filières :")
47
+ for filiere in propositions:
48
+ filiere.afficher_info()
student.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class Student:
2
+ def __init__(self, educmaster, prenom, nom, serie, resultats):
3
+ self.educmaster = educmaster
4
+ self.prenom = prenom
5
+ self.nom = nom
6
+ self.serie = serie
7
+ self.resultats = resultats
8
+
9
+ def afficher_moyennes_par_annee(self, coefficients):
10
+ resultats_str = f"Résultats pour {self.prenom} {self.nom} (ID: {self.educmaster}) en Série {self.serie} :\n"
11
+ for annee, matieres in self.resultats.items():
12
+ resultats_str += f"\nAnnée: {annee}\n"
13
+ if annee == "Baccalauréat":
14
+ for matiere, note in matieres.items():
15
+ coef = coefficients.get_coefficient(matiere)
16
+ resultats_str += f"- {matiere} (Coef {coef}): {note}\n"
17
+ else:
18
+ for matiere, moyennes in matieres.items():
19
+ moy_sem1 = moyennes["Semestre 1"]
20
+ moy_sem2 = moyennes["Semestre 2"]
21
+ coef = coefficients.get_coefficient(matiere)
22
+ resultats_str += f"- {matiere} (Coef {coef}): Semestre 1: {moy_sem1}, Semestre 2: {moy_sem2}\n"
23
+ return resultats_str
universite.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from etablissement import Etablissement
2
+
3
+ class Universite:
4
+ def __init__(self, nom, etablissements):
5
+ self.nom = nom
6
+ self.etablissements = etablissements
7
+
8
+ def afficher_filieres(self):
9
+ filieres_str = f"Université: {self.nom}\n"
10
+ for etablissement in self.etablissements:
11
+ filieres_str += etablissement.afficher_filieres()
12
+ return filieres_str
utils.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ def get_student_by_id(students, student_id):
2
+ for student in students:
3
+ if student.educmaster == student_id:
4
+ return student
5
+ return None
6
+
7
+ def calculer_moyennes(resultats):
8
+ moyennes = {}
9
+ for annee, matieres in resultats.items():
10
+ if annee != "Baccalauréat":
11
+ moyennes[annee] = {}
12
+ for matiere, notes in matieres.items():
13
+ moyenne = (notes["Semestre 1"] + notes["Semestre 2"]) / 2
14
+ moyennes[annee][matiere] = moyenne
15
+ return moyennes
16
+
17
+ def calculer_scores_selection(moyennes, coefficients, biais):
18
+ scores = {}
19
+ for annee, matieres in moyennes.items():
20
+ scores[annee] = {}
21
+ for matiere, moyenne in matieres.items():
22
+ coef = coefficients.get_coefficient(matiere)
23
+ score = (moyenne * coef) + moyenne + biais.get(matiere, 0)
24
+ scores[annee][matiere] = score
25
+ return scores
26
+
27
+ def selectionner_meilleures_matieres(scores):
28
+ """
29
+ Sélectionne les trois meilleures matières pour chaque année, y compris le Baccalauréat.
30
+
31
+ :param scores: Les scores des matières par année.
32
+ :return: Un dictionnaire des meilleures matières par année.
33
+ """
34
+ meilleures_matieres = {}
35
+ for annee, matieres in scores.items():
36
+ sorted_matieres = sorted(matieres.items(), key=lambda x: x[1], reverse=True)
37
+ meilleures_matieres[annee] = [matiere for matiere, score in sorted_matieres[:3]]
38
+ return meilleures_matieres
39
+
40
+ def compter_occurrences_meilleures_matieres(meilleures_matieres):
41
+ occurrences = {}
42
+ for annee, matieres in meilleures_matieres.items():
43
+ for matiere in matieres:
44
+ if matiere in occurrences:
45
+ occurrences[matiere] += 1
46
+ else:
47
+ occurrences[matiere] = 1
48
+ return occurrences
49
+
50
+ def selectionner_top_matieres(occurrences, biais):
51
+ sorted_occurrences = sorted(occurrences.items(), key=lambda x: (x[1], biais.get(x[0], 0)), reverse=True)
52
+ return [matiere for matiere, count in sorted_occurrences[:4]]
53
+
54
+ def proposer_filieres(top_matieres, filieres, serie):
55
+ propositions = []
56
+ for filiere in filieres:
57
+ if filiere.serie == serie:
58
+ count_best_matieres = sum(1 for matiere in top_matieres if matiere in filiere.matieres)
59
+ propositions.append((filiere, count_best_matieres))
60
+
61
+ propositions_triees = sorted(propositions, key=lambda x: x[1], reverse=True)
62
+ return [filiere for filiere, count in propositions_triees]