Développement, savoir-faire complémentaires
Introduction
Voici quelques compléments que nous avons jugés bien utiles. Ce choix drastique de quelques techniques complémentaires est très empirique. N’hésitez pas à nous écrire pour nous inciter à le compléter lors d’une éventuelle réédition de l’ouvrage.
Manipulation de données avec Pandas
Vous trouverez une liste d’instructions Pandas accompagnée de petits exemples syntaxiques au chapitre Aide-mémoire, à la fin de l’ouvrage.
1. Introduction à Pandas
En 2023, sur le site de pandas, on pouvait lire (en anglais, traduction des auteurs) : « Pandas est un outil open source d’analyse et de manipulation de données rapide, puissant, flexible et facile à utiliser, basé sur le langage de programmation Python. ».
Par ailleurs, les deux caractéristiques suivantes étaient mises en avant :
-
Pandas procure : « Un objet DataFrame rapide et efficace pour la manipulation des données avec indexation intégrée » ;
-
Pandas procure : « Des outils pour lire et écrire des données entre des structures de données en mémoire et différents formats : fichiers CSV et texte, Microsoft Excel, bases de données SQL et le format rapide HDF5 ».
2. Lecture d’un fichier csv et transformation via Pandas
Nous allons donc essayer de lire un fichier .csv (fichier qui est accessible sur le site ENI, mais vous pouvez facilement créer un fichier équivalent).
Pour créer ce fichier, nous avons extrait les données textuelles d’une page du site FUN (France Université Numérique) ; cette action de collecte du texte d’une page web est souvent dénommée scraping. Le résultat n’étant pas très lisible, nous utilisons Pandas pour nettoyer rapidement le contenu du fichier. C’est l’occasion d’utiliser un minimum de Pandas et un peu de programmation fonctionnelle.
Il existe divers packages dédiés au scraping comme Beautiful Soup et scrapy, qui vous aident à sélectionner et nettoyer les données acquises sur les pages web. Le code suivant n’a pas pour objet de se substituer à ces solutions professionnelles.
# pandas, csv, transformations par map sur un fichier
# de scraping du site FUN
# lire un csv via pandas, traiter le dataframe, sauver et contrôler le résultat
import pandas as pd
path_csv = "dataFUN.csv"
df = pd.read_csv(path_csv...
Valider et affecter des types simples en toute sécurité
Nous allons utiliser un package assez ancien, de façon très partielle, en invoquant les contrôles de type qu’il procure : le package hug.
# !pip install hug
# Affectation, validation et casting de types simples :
# import des types
from hug import types as typ_h
Créons une fonction générique qui valide, affecte et traduit une valeur dans le format recherché. Via l’utilisation des instructions try, except et raise, nous « cassons » le programme si la valeur proposée n’est pas conforme. Cette technique correspond à une autre façon de ce que nous avions appelé « mourir vite » plus haut.
def valide(x,f_type) :
try :
x = f_type(x)
return x
except :
lib = "type invalide, il faut un : " + f_type.__doc__
print(lib)
raise Exception(lib)
Nous allons tester le fait qu’une valeur représente un entier valide.
# affectation d'un nombre entier valide
x = valide(10,typ_h.number)
print(x, type(x))
--| 10 <class 'int'>
x = valide("100",typ_h.number) ...
Gestion des exceptions, en bref
La gestion des exceptions (try … except), qui vous permet de « mourir vite », est utilisée, d’une part, au début du processus de codage pour effectivement contrôler le bon fonctionnement du programme, d’autre part, plus loin dans le processus pour capter ces exceptions, les traiter et les enregistrer sans casser le programme déjà auparavant solidement débogué. Ainsi, le programme ne casse pas pendant son exploitation réelle alors que l’on avait favorisé le comportement contraire pendant sa mise au point. La beauté de cela, c’est que la même technique de gestion des exceptions s’applique pendant les deux phases du processus (développement et mise en conditions opérationnelles).
Python gère une hiérarchie d’erreurs communes, désignée sous le vocable exception hierachy dans sa documentation. Si vous soupçonnez que votre code puisse être affecté par un de ces types d’erreur, vous pouvez les traiter individuellement. Le code suivant capte six types d’erreurs.
try:
# code testé
pass # ne fait rien, c'est un placeholder où vous mettez votre
# propre code
except (RuntimeError,
ValueError, ...
Tri récursif d’un vecteur de données (liste)
Nous allons implémenter le tri d’une liste. Évidemment, les listes possèdent une méthode de tri, qui trie la liste « sur place », c’est-à-dire que l’ordre d’origine de la liste est perdu (mais elle n’est pas dupliquée, ce qui est économe).
L’idée est la suivante : on prend le premier élément de la liste et l’on positionne tous les éléments plus petits avant et les autres après, ce après avoir effectué la même opération sur ces deux listes (celle des plus petits et celle des plus grands). Comme on appelle notre fonction au sein d’elle-même, on est dans un processus récursif. Le danger d’un tel processus serait qu’il ne s’arrête jamais. Pour le stopper, nous positionnons un critère, une exception ; ici, un test sur la longueur de la liste. La récursivité se stoppera donc quand la liste sera vide.
Ce qui nous donne l’algorithme classique suivant :
def tri_R(liste):
if len(liste) > 1:
e_ = liste[0] # valeur premier...
Gérer les dates de façon normalisée et efficace, datetime & pytz
On peut accéder aux dates en gérant les timezones et les manipuler de différentes façons.
from datetime import datetime as dt
import pytz
d = dt.now()
print("format complet : ",d)
--| format complet : 2023-10-22 00:58:47.016094
print("en chaîne de caractères avec séparateur espace : ", d.isoformat(sep=" "))
--| en chaîne de caractères avec séparateur espace : 2023-10-22 00:58:47.016094
print("le jour de la semaine : ", d.isoweekday())
--| le jour de la semaine : 7
print("version Unix de l'heure, utile pour des calculs : ",d.timestamp())
--| version Unix de l'heure, utile pour des calculs : 1697929127.016094
UTC = pytz.utc
d_utc = dt.now(UTC)
print("la date et l'heure en référence utc : ", d_utc.isoformat(sep=" "))
--| la date et l'heure en référence utc : 2023-10-21 22:58:51.613521+00:00
S’il y a une ou plusieurs heures de décalage entre l’heure locale et l’heure UTC, vous pouvez alors le gérer conformément aux exigences de votre application.
L’heure...
Un programme utilisable en ligne de commande
Il existe diverses techniques permettant de passer des paramètres à un programme Python utilisé en ligne de commande. Nous vous proposons d’utiliser le package click pour cela. Ses fonctionnalités sont implémentées au travers de décorateurs, ce qui permet de découper votre travail en deux temps : créer la fonctionnalité que vous voulez exposer, puis la mettre à disposition en ligne de commande en ajoutant une aide éventuelle.
Le programme suivant met en majuscule la première lettre d’un mot ou d’une phrase que vous saisissez à sa demande.
# Documentation click :
# https://click.palletsprojects.com/en/8.1.x/
import click
@click.command()
@click.option('--expression',
prompt='Expression dont on veut mettre la première lettre en majuscules ',
help='La première lettre sera mise en majuscule, essayez le mot : évaluer')
def cap(expression):
click.echo(f'Voici le résultat : \n{expression.capitalize()}')
if __name__ == '__main__':
cap()
Voici le dialogue interactif que vous pouvez obtenir via la ligne de commande (lancer l’exécution du fichier python click_cap.py...