top of page
Anneaux lumineux au néon

PROJET 1

NOTATION PIX

Pix est un service public en ligne français qui permet à ses utilisateurs d'évaluer, de développer et de certifier leurs compétences numériques

 

  • Le projet Notation PIX consiste en la transformation de scores PIX en des notes sur 20.

Pour ce faire, nous avons tous dû, dans un premier temps, réaliser un parcours de rentrée PIX. Grâce à ce dernier, nous avons obtenu un fichier Excel regroupant les noms des élèves, accompagnés de leur scores dans diverses compétences PIX, et d'un score global. Nous avons ainsi élaboré une formule nous permettant de convertir chaque score en note.

Lors des premières séances consacrées à ce projet, nous avons appris à calculer les valeurs maximale, minimale ainsi que moyenne d'une liste.

04/10/23
 

Aujourd'hui, notre professeur nous donne un programme informatique entièrement rédigé. Ce dernier permet de tracer un graphique en récupérant des données d'un fichier CSV. De surcroît, ce programme utilise la bibliothèque matplotlib.

Pour ma classe, la consigne est simple, nous devons modifier ce code pour qu'il puisse à l'avenir tracer un graphique avec les scores PIX correspondant à chaque élève.

Ce programme doit devenir un support supplémentaire pour écrire mon code final.

Toutefois, je me dois d'abord de le modifier pour l'adapter au projet. Je remarque assez rapidement après avoir pris connaissance du code que les rectifications seront simples.

En premier lieu, je commence par remplacer le fichier CSV dont on exploitera les données. Je modifie alors le fichier que le programme ouvre par le fichier Excel abordé précédemment. Puis, je rectifie le séparateur noté comme étant une virgule, par un point virgule. Ensuite, je corrige le contenu de la Liste_x et la Liste_y pour y placer de nouvelles données. En effet, dans la Liste_x, je place le contenu de la quatrième colonne du tableur, à savoir les noms des élèves. De cette même manière, je place dans la Liste_y, le contenu de la neuvième colonne du tableur, à savoir les scores des élèves. Après cela, il me suffit de modifier le nom de l'axe des abscisses, des ordonnées, ainsi que le titre du graphique.

J'avoue avoir eu un peu de mal au début car j'avais simplement mal sauvegardé le fichier CSV dans le même dossier que le code. Il n'était alors pas reconnu et le programme ne pouvait pas fonctionner. Néanmoins, de manière globale, l'appropriation de ce code était assez rapide et relativement simple une fois comprise.

import matplotlib.pyplot as plt

fichier = open("4_octobre_2023_NSI1.csv", encoding="utf8")
ligne = fichier.readline() # lecture de la première ligne
noms_colonnes = ligne.strip().split(";") # récupération de tous les éléments de la première lignes
print("noms colonnes=",noms_colonnes)

Liste_x=[]
Liste_y=[]
for ligne in fichier:
  elements = ligne.strip().split(";")
  Liste_x.append(elements[4])
  Liste_y.append(int(elements[9]))
print(Liste_x, Liste_y)
fichier.close()

def tracer_figure(liste1,liste2):
  plt.figure(figsize = (16, 10))
  plt.plot(liste1,liste2, label='scores')

  plt.xlabel('Noms')
  plt.xticks(rotation = 60)
  plt.ylabel('Scores')
  plt.title("Scores Pix")
  plt.legend()
  plt.show()

if __name__=="__main__":
  tracer_figure(Liste_x,Liste_y)

06/10/23


Aujourd'hui, la rédaction du programme commence réellement. Je débute alors par regrouper les différentes variables dont j'ai besoin pour calculer ma formule. Sur une page EduPython, je rassemble, le calcul du maximum, du minimum et de la moyenne.

# Calcul de la moyenne

def moyenne(liste_scores):
  somme=0
  compteur=0
  for i in liste_scores:
  # i prend successivement toutes les valeurs de la liste
       print(i)
       somme=i+somme
       # ajoute i à la variable somme
       compteur=compteur+1
       #ajoute 1 à la variable compteur
  print(somme)
  print(compteur)
  print(somme/compteur)
  return (somme/compteur)

moyenne_liste=moyenne(liste_scores)


# Calcul de la valeur minimale

 

def minimum(liste_scores):
  compteur=0
  minimum = liste_scores[0]
  for i in liste_scores:
       if i <=minimum:
           minimum = i
  print(minimum)
  return(minimum)
minimum_liste=minimum(liste_scores)


# Calcul de la valeur maximale


def maximum(liste_scores):
   compteur=0
   maximum = liste_scores[0]
   for i in liste_scores:
       if i >= maximum:
           maximum = i
   print (maximum)
   return (maximum)
maximum_liste=maximum(liste_scores)

Ensuite, sachant que nous avons besoin des scores de chaque élève (à la place des valeurs mises au hasard dans la liste score ci-dessus), je décide de reprendre le début du code traçant le graphique. Les premières lignes de ce programme consistent en l'ouverture du fichier CSV et à en ressortir ce dont on a besoin uniquement, à savoir les noms et les scores (comme vu précédemment). Ainsi, je renomme tout d'abord la Liste_x par "liste_noms", et la Liste_y par la "liste_scores". Puis, je place les noms des élèves dans la liste_noms, en y affectant les données de la quatrième colonne de notre tableur. Je reproduis le processus en affectant les scores cette fois ci, à la liste_scores.

Enfin, je crée une nouvelle liste "score", à laquelle j'affecte les noms et les scores.

Je précise que cette partie du code est mise tout en haut du programme. En effet, l'importation de la bibliothèque matplotlib ainsi que la manipulation du fichier CSV doit se faire en début de programme évidemment.

import matplotlib.pyplot as plt

 

fichier = open("4_octobre_2023_NSI1.csv", encoding="utf8")
ligne = fichier.readline() # lecture de la première ligne
noms_colonnes = ligne.strip().split(";") # récupération de tous les éléments de la première lignes
print("noms colonnes=",noms_colonnes)
# Ouverture fichier scores Pix
liste_noms=[]
liste_scores=[]
for ligne in fichier:
  elements = ligne.strip().split(";")
  liste_noms.append(elements[4])
  liste_scores.append(int(elements[9]))
print(liste_noms, liste_scores)
fichier.close()
# Récupération valeurs scores Pix
score=[liste_noms, liste_scores]

09/10/23
 

Afin de faire fonctionner mon programme, j'ai besoin de créer une boucle qui convertira chaque score PIX en une note. Cette boucle constituera la base même de mon code. Je commence alors à la rédiger. Pour ce faire, j'utilise une boucle for avec la variable i qui prendra successivement toutes les valeurs de ma boucle.

Je définis d'abord les variables a et b, qui entrent en compte dans la formule.

b=((20-Notemoyenne)*(maximum_liste/moyenne_liste))/(1-maximum_liste/moyenne_liste)
a=(Notemoyenne-b)/moyenne_liste

 

for i in liste_scores:
  i=a*i+b

  print(i)

À ce moment là, je me rends compte que ma boucle ne fonctionne pas. En effet, les scores restent des scores PIX et ne se convertissent pas en note dans la console.

Je ne comprends pas comment cela est possible. Néanmoins, il me paraît rapidement évident que la formule est le problème.

Je pense avoir passé bien quelques dizaines de minutes à essayer de résoudre ce problème avec ma boucle.

J'ai pu me rendre compte que ma formule, ou surtout ce à quoi correspondaient a et b, n'avaient pas d'erreur.

J'ai alors commencé à me documenter sur le sujet, mais je n'ai rien trouvé de pertinent.

Je repasse en revue le programme dans son ensemble un certain nombre de fois.

A un certain point, je décide de rajouter "print(liste_scores)" après "print (i)". Mais cela n'a rien changé de concret.

Après avoir atteint un niveau d'agacement considérable face à ce problème, je choisis de reprendre ma documentation. Voilà alors que je redécouvre la fonction "len()". Je la connaissais effectivement déjà mais n'avais pas encore pensé à l'utiliser dans mon projet. Cette fonction permet de renvoyer le nombre d'éléments (ou la longueur) dans une liste.

Je modifie alors ma liste mais en y rajoutant également un détail. Nous devons effectivement arrondir les notes pour éviter d'avoir un trop grand nombre de chiffres significatifs par la suite. Je réutilise donc la fonction "round()", déjà étudiée il y quelques semaines en cours d'NSI. Cette fonction permet d'arrondir, au plus proche, une valeur à n chiffres après la virgule.

De plus, je rajoute "Notemoyenne=int(input("Choisissez la note moyenne"))" (donné par notre professseur), de manière à ce que l'utilisateur puisse saisir au clavier un entier correspondant à la moyenne qu'il choisit pour la classe.

Notemoyenne=int(input("Choisissez la note moyenne"))

b=(20-Notemoyenne*maximum_liste/moyenne_liste)/(1-maximum_liste/moyenne_liste)
a=(Notemoyenne-b)/moyenne_liste

for note in range (len(liste_scores)):
  liste_scores[note] = round(a*liste_scores[note]+b,1)
  print(liste_scores[note])


print(liste_scores)

Je me retrouve donc avec une boucle sous cette forme dorénavant.

Je rajoute à présent la fin du programme traçant le graphique, de manière à évidemment tracer le graphique (mais le programme n’avait pas forcément à être coupé en deux, le laisser tel quel au début n'aurait rien changé).

def tracer_figure(liste_noms,liste_scores):
  plt.figure(figsize = (16, 10))
  plt.bar(liste_noms,liste_scores, label='Notes')

  plt.xlabel('Noms')
  plt.xticks(rotation = 60)
  plt.ylabel('Notes')
  plt.title("Notation Pix")
  plt.legend()
  plt.show()

tracer_figure(liste_noms,liste_scores)

Nous pouvons peut-être remarqué quelques modifications par rapport au programme vu en haut de page. Premièrement, j'ai bien changé la Liste_x avec la liste_noms et la Liste_y avec la liste_scores. J'ai également adapté le titre du graphique, de l'axe des abscisses et des ordonnées.

Enfin, j'ai décidé de modifier la courbe du graphique. Cela me semblait tout de même évident car le graphique précédent représentait une variation. Néanmoins, ce projet a pour objectif de convertir les notes des élèves de manière individuelle. Ainsi, après quelques minutes de recherche sur l'utilisation de la bibliothèque matplotlib, je trouve ce que je cherchais.

En remplaçant sur cette ligne "plt.plot(liste_noms,liste_scores, label='Notes')", "plot" par "bar", mon graphique devient un diagramme en barres, ce qui me convient personnellement davantage.

09 10 Graphique FINAL.png

Ainsi, cet exercice de Notation Pix aura été en quelque sorte, mon premier vrai projet. Il m'a permis d'être davantage à l'aise avec les bases de la programmation comme la création de fonctions, entre autres. Il m'aura également appris à mieux comprendre les codes informatiques qui me paraissaient avant plus confus. Il m'a permis de me réconcilier avec la programmation qui ne constituait qu'autrefois, rien d'autre que du travail. Ce projet annonce pour moi le début d'une année prometteuse en spécialité NSI.

bottom of page