1 Exercice : Notes L3 Mathématiques
Considérons les notes pour un étudiant de L3 Mathématiques pour les deux semestres de l’année.
Pour chaque semestre :
- Crééer une Series qui contient les notes des ECUEs (des entiers aléatoires de 0 à 20) et les indices sont les noms des ECUEs.
- Créér une Series qui contient les coefficients des ECUEs et les indices sont les noms des ECUEs.
- Créer un DataFrame qui contient les notes et les coefficients des ECUEs.
Voici un exemple pour le semestre 1
et pour le semestre 2
Utiliser ces deux DataFrames pour répondre aux questions suivantes :
- Quelle est la moyenne des notes de l’étudiant pendant le premier semestre ?
- Quelle est la moyenne des notes de l’étudiant pendant le second semestre ?
- Quelle est la moyenne des notes de l’étudiant pour l’année ?
- L’étudiant a-t-il amélioré ses performances au second semestre ? Si oui, de combien ?
Bonus : créer un DataFrame qui contient les notes et les coefficients des ECUEs pour les deux semestres. Pour l’exemple précédent, le DataFrame devra être :
# les noms des ECUE du semestre 1 dans une liste
ecue_names_semester1 = ["M51 Intégration",
"M52 Topologie",
"M53 Calcul différentiel",
"M54 Algèbre 5",
"M55 DS&SC 5",
"RDOC",
"PPE"]
# les coefficients des ECUE du semestre 1 dans une Series dont les index sont les noms des ECUE
coefficients_semester1 = pd.Series( data=[8, 8, 8, 4, 2, 0, 0],
index=ecue_names_semester1)
# les notes de l'étudiant 1 dans une Series dont les index sont les noms des ECUE
etu_1_semester1 = pd.Series( data=np.random.randint(0, 21, size=len(ecue_names_semester1)),
index=ecue_names_semester1)
# on cosntruit le DataFrame comme un dict de Series
df_semester1 = pd.DataFrame( {"Coefficients": coefficients_semester1,
"Étudiant 1": etu_1_semester1}
)
display(df_semester1)
Coefficients | Étudiant 1 | |
---|---|---|
M51 Intégration | 8 | 17 |
M52 Topologie | 8 | 3 |
M53 Calcul différentiel | 8 | 13 |
M54 Algèbre 5 | 4 | 18 |
M55 DS&SC 5 | 2 | 12 |
RDOC | 0 | 19 |
PPE | 0 | 20 |
ecue_names_semester2 = ["M61 EDO", "M62 Analyse Complexe", "M63 Modélisation", "M64 DS&SC 6", "UE65", "UE66"]
coefficients_semester2 = pd.Series( data=[5, 9, 4, 4, 6, 2],
index=ecue_names_semester2)
etu_1_semester2 = pd.Series( data=np.random.randint(0, 21, size=len(ecue_names_semester2)),
index=ecue_names_semester2)
df_semester2 = pd.DataFrame({"Coefficients": coefficients_semester2,
"Étudiant 1": etu_1_semester2}
)
display(df_semester2)
Coefficients | Étudiant 1 | |
---|---|---|
M61 EDO | 5 | 6 |
M62 Analyse Complexe | 9 | 15 |
M63 Modélisation | 4 | 15 |
M64 DS&SC 6 | 4 | 1 |
UE65 | 6 | 20 |
UE66 | 2 | 11 |
# moyenne du semestre 1
# si on utilise les Series
# moy_semester1 = sum(coefficients_semester1*etu_1_semester1)/sum(coefficients_semester1)
# display(moy_semester1)
# si on utilise le DataFrame
moy_semester1 = ( df_semester1["Coefficients"]*df_semester1["Étudiant 1"] ).sum() / df_semester1["Coefficients"].sum()
display(moy_semester1)
# idem avec "dot"
# moy_semester1 = df_semester1["Étudiant 1"].dot(df_semester1["Coefficients"]) / df_semester1["Coefficients"].sum()
# display(moy_semester1)
# idem avec "np.average" qui permet de pondérer la moyenne par les coefficients
# moy_semester1 = np.average(df_semester1["Étudiant 1"], weights=df_semester1["Coefficients"])
# # display(moy_semester1)
12.0
count 6
min 1
max 20
Name: Étudiant 1, dtype: int64
# moyenne du semestre 2
moy_semester2 = np.average(df_semester2["Étudiant 1"], weights=df_semester2["Coefficients"])
display(moy_semester2)
12.366666666666667
Notes et coefficients pour l’année entière :
# Fusionner les DataFrame pour obtenir l'année entière
# Les colonnes des deux DataFrame sont les mêmes, on peut donc les concaténer
df_year = pd.concat([df_semester1, df_semester2])
# Autre version avec un DataFrame avec MultiIndex
# df_year = pd.concat([df_semester1, df_semester2], keys=["Semestre 1", "Semestre 2"], axis=0)
df_year
Coefficients | Étudiant 1 | |
---|---|---|
M51 Intégration | 8 | 17 |
M52 Topologie | 8 | 3 |
M53 Calcul différentiel | 8 | 13 |
M54 Algèbre 5 | 4 | 18 |
M55 DS&SC 5 | 2 | 12 |
RDOC | 0 | 19 |
PPE | 0 | 20 |
M61 EDO | 5 | 6 |
M62 Analyse Complexe | 9 | 15 |
M63 Modélisation | 4 | 15 |
M64 DS&SC 6 | 4 | 1 |
UE65 | 6 | 20 |
UE66 | 2 | 11 |
count 13
min 1
max 20
Name: Étudiant 1, dtype: int64
# Calcule des moyennes pondérées
moyenne_annee = np.average(df_year["Étudiant 1"], weights=df_year["Coefficients"])
print(f"La pire note de l'année : {df_year['Étudiant 1'].min()} obtenue à l'ECUE {df_year['Étudiant 1'].idxmin()}")
print(f"La meilleure note de l'année : {df_year['Étudiant 1'].max()} obtenue à l'ECUE {df_year['Étudiant 1'].idxmax()}")
print(f"Moyenne des notes pour l'année : {moyenne_annee:.2f}")
print(f"Moyenne des notes pour le premier semestre : {moy_semester1:.2f}")
print(f"Moyenne des notes pour le second semestre : {moy_semester2:.2f}")
# Amélioration des performances ?
amelioration = moy_semester2 - moy_semester1
print(f"Amélioration des performances dans la seconde moitié : {amelioration:.2f}")
La pire note de l'année : 1 obtenue à l'ECUE M64 DS&SC 6
La meilleure note de l'année : 20 obtenue à l'ECUE PPE
Moyenne des notes pour l'année : 12.18
Moyenne des notes pour le premier semestre : 12.00
Moyenne des notes pour le second semestre : 12.37
Amélioration des performances dans la seconde moitié : 0.37