Ce document est un .txt à ouvrir dans VS Code. On peut aussi le tranformer en .py et l'ouvrir dans sublime texte pour avoir de la coloration syntaxique. (Avec VS Code, en .py, tout passe en rouge !) Cmd-A puis Cmd-k-0 : pour avoir le plan Objectifs : analyse de données python : VS Code, numpy : Jupyter pandas : Jupyter matplotlib : Jupyter 5 cours et TP associés : 2 cours python de base + données de base 2 cours numpy + matplotlib 1 cours pandas + matplotlib 2 cours python : python de base + données de base Le vocabulaire à maitriser (44 notions): python de base (18 notions) variable, type, int, float, string, bool (6) test, boucle while, break, fonction, return (6) print, input (2) commentaires # et ''' (2) try, except (2) Données de base (25 notions) string, liste, len (3) split, join (2) max, min, in, count, replace (5) boucles for, range (3) import (1) slice (1) dictionnaire, (1) lecture de fichier, excel et CSV, f-string (3) ensemble, tuple, destructuration (3) matrice (1) API, JSON (2) Cours 1 : Python de base (21 notions) : Exemples : input, print, variable, int, float, string, isnumric(), int(), type, try, except, if, commentaires a=input("a:") print(a) b=input("b:") print(type(b)) print(b) entier = input("entier:") # essayer avec autre chose qu'un entier entier = int(entier) print(type(entier)) print(entier) entier = input("entier:") if entier.isnumeric(): # isnumeric ne reconnait que les entiers positifs. entier = int(entier) resultat = 3*entier print("entier:", entier, "resultat:", résultat) nombre = input("nombre:") try: nombre=int(nombre) resultat = 2 * nombre except: print(nombre, "n'est pas un entier") if type(nombre) == str: try: nombre=float(nombre) resultat = 2 * nombre except: print(nombre, "n'est pas un float") if type(nombre) == str: resultat = 2 * nombre print("nombre:", nombre, "résultat:", resultat) Exercices série 1 : testez l''exemple précédent. Faites le "planter". Ecrivez un code sans fonction qui permet de lire les coefficient a et b de l''équation aX+b = 0 et qui affiche le résultat (1 solution : -b/a, ou une infinité de solution quand a=b=0, ou 0 solution quand a=0 et b!=0). On vérifiera que a et b sont bien des numériques. Exemples : else, fonction, return, bool Année bissextile : annee=input("année:") if annee.isnumeric(): if annee % 4 == 0: print(annee, "est bissextile") else: print(annee, "n'est pas bissextile") Sous forme de fonction : def bissextile(annne): if annee % 4 == 0: return True else : return False Le "programme principal" = le "main" utilise la fonction annee=int(input("année:")) if bissextile(annee) == True: print(annee, "est bissextile") else: print(annee, "n'est pas bissextile") Ecriture complète propre : # ------------------- # les fonctions # ------------------- def bissextile(annne): if annee % 4 == 0: return True else : return False # ------------------- # le main # ------------------- annee=int(input("année:")) if bissextile(annee) == True: print(annee, "est bissextile") else: print(annee, "n'est pas bissextile") Exercices série 2: Testez l''exemple précédent. Faites le "planter". Ecrivez une fonction bissextile qui prenne en compte le fait que les années divisible par 100 ne sont pas bissextiles et que les années divisbles par 400 le sont quand même. Exemples : boucle while, break Une boucle while permet de répéter quelque chose plusieurs fois. Le nombre de répétitions n''est pas connu à l''avance. Si on veut répéter la saisie jusqu''à ce qu''elle soit juste, on pourra écrire : while(True): # on boucle sans fin annee=input("année:") if annee.isnumeric() is True: annee=int(annee) break # fait sortir de la boucle else: print("Entrer un entier ! Recommencez !") if bissextile(annee) == True: print(annee, "est bissextile") else: print(annee, "n''est pas bissextile") pour la boucle while, on pourrait écrire : continuer=True while(continuer): # tant que continuer est vrai annee=input("année:") if annee.isnumeric() is True: annee=int(annee) continuer=False else: print("Entrer un entier ! Recommencez !") Exercices série 3: os.system(), MVC Testez l''exemple précédent avec un code "propre" structuré en MVC Ecrivez un programme qui propose 3 choix : tester si une annéee est bissextile, résoudre une équation simple, quitter. Les choix 1 et 2 appelle une fonction qu''on appelle "controleur" : ctrl_bissextile() et ctrl_equation(). Ces fonction gère la saisie et font appel aux fonctions qu''on a déjà écrites. Le choix "q" ou "0" fait quitter le programme. on utilisera le package os pour effacer l''ecran (cherchez la solution !) Cours 2 : Données de base (23 notions) Exemples : liste, append, pop, for, range, import, random l=[] # liste vide notes=[12, 10, 15] print(notes) eleves=["Alexandre", "Bérénice", "Sophie", "Hector"] print(eleves) notes.append(18) # [12, 10, 15, 18] eleve=eleves.pop() # "hector", ["Alexandre", "Bérénice", "Sophie"] print(notes, eleves) for eleve in eleves : print(eleve) for i in range(len(notes)): print(notes[i]) for i in range(0, len(notes)): notes[i]+= 1 import random notes=[] for i in range(10): notes.append(random.randint(0,20)) print(notes) Exercices série 11 Ecrivez un programme qui, à partir d''une première liste d''entiers donnée, fabrique une deuxième liste ne contenant que les nombres positifs de la première. Mettez ce calcul dans une fonction et écrivez un main qui utilise cette fonction Exemples : max, tuple note_max = max(notes) t=(10, 15) est un tuple de 2 valeurs (on dit un couple) un tuple est entièrement non modifiable Exercices série 12 Ecrire une fonction qui retourne le min et le max d''une liste donnée. Ecrire le main qui utilise cette fonction : on verra à cette occasion un usage de déstructuration Exemple manipulation de string : split, join, capitalize 3 outils : split, join, capitalize() "bonjour tout le monde".split() donne ['bonjour', 'tout', 'le', 'monde'] "-".join(['bonjour', 'tout', 'le', 'monde']) donne: 'bonjour-tout-le-monde' "bonjour".capitalize() donne : "Bonjour" Exercices série 13 Comment mettre en majuscule chaque mot d''une phrase séparé par un espace ? On commence par décrire ce qu''on va faire : avec tel outil je récupère ceci. Ensuite avec tel autre outil je fais ceci, etc. Ensuite on le code dans une fonction et on écrit le main qui teste la fonction. Exemple : Slicing Le slicing est une technique d'extraction d'une partie d'une string ou d'une liste l[2:5] extrait dans une liste les éléments de 2 à 4 compris l[2:] extrait de 2 à la fin l[:5] extrait de 0 à 4 compris l[:-1] extrait de 0 jusqu'à l'avant dernier compris l[:] extrait tout l[::1] extrait tout en sens inverse etc. Ca marche aussi avec les string Exercice : série 14 Ecrire la fonction précédente sans utiliser capitalize() mais en utilisant upper() : on utilisera des slices. Ecrire un programme qui teste cette fonction. Exemple : Dictionnaire eleve={"id:1", "nom":"Hector", "age":25} un dictionnaire est une organisation de données constituée de couples clé-valeur. Chaque clé est unique dans un dictionnaire. En analyse de données, les clés d''un dictionnaire correspondent à la première ligne d''une table excel. Les valeurs du dictionnaires correspondent à une des lignes suivantes de la table excel. on peut écire : eleve["id"] eleve["nom"] eleve["age"] ce sont trois variables qui s''utilise comme n''importe quelle variable. eleve["age"]=24 Exercice série 15, count, replace Ecrire une fonction qui, à partir d''une string qui représente un texte, compte le nombre d''occurrence de chaque mot dans le texte. On considère que le texte ne contient que de lettres et des espaces. La fonction count() permet de compter le nombre d''occurrences d''une valeur dans une liste. Dans un deuxième temps, on peut s''occuper de remplacer les , . ; ! etc. par des espaces. La fonction replace() permet de remplacer un caractère (ou un mot) d''un texte par un autre (ou un mot ou rien). On peut demander à chatgpt de générer des phrases. Exemple : excel et csv, fichier, open, with-as, une table excel (équivalente à un fichier CSV) se traduit par une liste de dictionnaire. eleves = [ {"id": 1, "nom": "Hector", "age":25}, {"id": 2, "nom": "Sophie", "age":30}, {"id": 3, "nom": "Alexandre", "age":18}, {"id": 4, "nom": "Bérénice", "age":22} ] On va lire des fichiers CSV et transformer le contenu en liste de dictionnaires : import csv # les fonctions : le modèle def lire_csv_en_liste_de_dict(fichier_path, delimiter=';', quotechar='"'): """ Lit un fichier CSV et retourne une liste de dictionnaires :in: fichier_path: chemin vers le fichier CSV à lire :return: liste_dict sous la forme d'une liste de dictionnaires """ with open(fichier_path, mode='r', newline='', encoding='utf-8') as fichier: lecteur_csv = csv.DictReader(fichier, delimiter=delimiter, quotechar=quotechar) # Transformer chaque ligne en dictionnaire et la stocker dans une liste liste_dict = [ligne for ligne in lecteur_csv] return liste_dict # Le main - traitement fichier_path = 'employes.csv' # Remplace par le chemin réel de ton fichier CSV individus = lire_csv_en_liste_de_dict(fichier_path) # le main - affichage for individu in individus: print(individu) Exercice série 16 Tester le code de chargement du CSV des employes Calculer le salaire moyen Récupérer tous les employes dont la fonction est "analyst" Exemple : f-string la f-string nous permet de formater l''affichage d''un tableau for individu in individus: print( f"| id: {individu['id']:>5s} " f"| nom: {individu['nom']:>10s} " f"|" ) Exercice série 17 Afficher tous les employes et tous leurs attributs en formatant la largeur d''affichage avec des f-string Le but est d''obtenir un résultat proche de ceci : +------+--------+-----------+---------------+---------+------------+----------------+-----------------+ | id | nom | fonction | date_embauche | salaire | commission | id_departement | id_employe_chef | +------+--------+-----------+---------------+---------+------------+----------------+-----------------+ | 7369 | SMITH | CLERK | 1980-12-17 | 800.00 | NULL | 20 | 7902 | | 7499 | ALLEN | SALESMAN | 1981-02-20 | 1600.00 | 300.00 | 30 | 7698 | | 7521 | WARD | SALESMAN | 1981-02-22 | 1250.00 | 500.00 | 30 | 7698 | | 7566 | JONES | MANAGER | 1981-04-02 | 2975.00 | NULL | 20 | 7839 | | 7654 | MARTIN | SALESMAN | 1981-09-28 | 1250.00 | 1400.00 | 30 | 7698 | | 7698 | BLAKE | MANAGER | 1981-05-01 | 2850.00 | NULL | 30 | 7839 | | 7782 | CLARK | MANAGER | 1981-06-09 | 2450.00 | NULL | 10 | 7839 | | 7788 | SCOTT | ANALYST | 1982-12-09 | 3000.00 | NULL | 20 | 7566 | | 7839 | KING | PRESIDENT | 1981-11-17 | 5000.00 | NULL | 10 | NULL | | 7844 | TURNER | SALESMAN | 1981-09-08 | 1500.00 | 0.00 | 30 | 7698 | | 7900 | JAMES | CLERK | 1981-12-03 | 950.00 | NULL | 30 | 7698 | | 7902 | FORD | ANALYST | 1981-12-03 | 3000.00 | NULL | 20 | 7566 | | 7903 | ADAMS | CLERK | 1983-01-12 | 1100.00 | NULL | 20 | 7788 | | 7904 | MILLER | CLERK | 1982-01-23 | 1300.00 | NULL | 10 | 7782 | +------+--------+-----------+---------------+---------+------------+----------------+-----------------+