Recherche dans une table

Traitement des données en tables

Plan

La bibliothèque pandas

La bibliothèque pandas va nous permettre d'effectuer plus de tâches sur les fichiers CSV que les commandes incluses dans la bibliothèque csv. Pour pouvoir utiliser cette bibliothèque, il faudra probablement l'installer. Pour cela ouvrir cmd de windows, se placer dans votre répertoire Python à l'aide de la commande cd (change directory) puis, le dossier Scripts (le dossier qui contient pip) et taper la commande: pip install pandas. Si vous avez installé Anaconda et que vous êtes sous Jupyter, pandas est probablement installé, si non, tapez juste pip install pandas.
result = pandas.read_csv('ClasseurMetalPointVirgule.csv',sep=';', encoding='latin-1')

Nous allons voir comment retrouver rapidement un élèment dans un fichier csv. A noter que pour afficher toute une colonne ou ligne d'un fichier csv, la bibliothèque pandas n'est pas utile.

On pourrait aussi ne pas utiliser la bibliothèque pandas et programmer nous même ces recherches. Tout d'abord parce que les bibliothèques sont programmées en python et qu'en plus c'est réalisable à notre niveau. Il suffit de mettre le fichier csv dans une liste de liste, ou liste de dictionnaires comme vu au chapitre précédent puis d'écrire des fonctions de recherche. Nous ferons cela en exercice!

Les élèves se demandent souvent "A quoi bon coder quelque chose qui existe déjà?". La réponse est pour moi évidente. Toutes ces bibliothèques et même certaines commandes python sont d'excellents pretextes pour travailler dans un contexte simple des notions capitales pour avoir de bonnes bases en informatique: supprimer un élèment d'une liste, trier une liste, etc...car viendra un jour où vos données seront probablement plus complexes que de simples nombres et aucune procédure de tri ne sera déjà créée...vous n'aurez pas le choix!

Recherche dans un fichier CSV

Voici un code commenté qui vous montre comment rechercher des données, trier selon un critère. Pour n'afficher que certaines colonnes, on peut se contenter d'indiquer dans une liste le nom des champs que l'on souhaite sur l'objet pandas. Pour des tris plus élaborés, on utilise la commande loc de la bibliothèque pandas. Cette commande necessite en paramètre, une liste de deux élèments: l'identifiant (qui est ici un nombre ou une liste de nombres représentant la ligne de l'enregistrement) et le champs de recherche.

monObjetPandas.loc(liste de nombres ou nombre,champs concernés ou liste de champs)

La réponse est une DataFrame: une matrice; chaque colonne est une serie et est de même type (nombre, date, texte), elle peut contenir des valeurs manquantes (NaN).Pour faire des recherches conditionnelles, comme par exemple 'afficher les albums sortis après 1990', on effectue le test sur l'objet pandas récupéré. Ce test "result['année']>1990 donne une liste avec les index et un booléen. On n'a plus qu'à utiliser ensuite la commande loc sur ce résultat pour afficher les champs réponses. On peut même réutiliser loc sur ce résultat pour n'afficher que ce qui nous interesse, comme par exemple ici, les titres.

import pandas
#on charge le fichier
result = pandas.read_csv('ClasseurMetalPointVirgule.csv',sep=';', encoding='latin-1')
#on affiche la colonne Album
print(result['Album'])
#pour pouvoir affiner l'affichage, on utilise
#la méthode loc
print("ligne 1 à 3",result.loc[1:3])


#on peut aussi récupérer la réponse dans une variable !
info=result.loc[1,'groupe'] #on veut le nom du groupe d'index 1
print("groupe :",info) #on affiche le nom du groupe

info=result.loc[2,:] #toutes les infos de la fiche 2
print("info ",info)


#certaines lignes et les colonnes de Album et année
info=result.loc[[1,2,4],['Album','année']]
print("info",info)

#certaines lignes et les colonnes de Album à année
info=result.loc[[1,2,4],slice('Album','année')]
print("info",info)

#toutes les lignes gràce au slice :
#toutes les colonnes de Album à année
#si le slice : ne fonctionne pas...on utilise la commande slice
print("Rep2 ",result.loc[:,slice('Album','année')])

#Maintenant avec des conditions
a=result.loc[result['année']>1990]
print(a['Album'])
print(result.loc[(result['année']>1990) & (result['année'] < 2000) & (result['groupe']=='Metallica')] )

Pour tenir compte des champs vides, représentés textuellement par NaN. On ne peut pas faire result['Album']=='Nan'. Pour trouver les champs vides on utilise isnull(). Pour vérifier un champs non nul, on utilise notna().

#afficje les lignes dont Album est NaN
print(result['Album'].isnull())
#afficher les lignes dont Album n'est pas Nan
print(result['Album'].notna())

Pour afficher les lignes dont le contenu d'un champs commence par certains caractères:

print(result['Album'].str.startswith('L')])

Pour sauvegarder un dataframe on utilise la commande pandas: to_csv

	
result.to_csv("nom_du_fichier",sep=';',encoding='utf-8', index=False)
	

Les doublons

On dit qu'il y a doublon lorsque l'on trouve plusieurs fois la même ligne dans un fichier CSV. Cela peut être génant. Cela peut se produire lors de la fusion de deux fichiers csv. Il peut aussi y avoir doublon sur certains champs uniquement. Cela peut être normal ou non. Voyons comment gérer cela. Par défaut la commande drop-duplicates garde le premier des doublons. (drop-duplicate = jette les doublons).

result = pandas.read_csv('ClasseurMetalPointVirgule.csv',sep=';', encoding='latin-1')
#lignes redondantes (strictement identiques, supprimées
plusDeDoublons=pandas.DataFrame(result).drop_duplicates()
print(plusDeDoublons)
#lignes redondantes (identiques sur Album, supprimées)
plusDeDoublonsAlbum=pandas.DataFrame(result).drop_duplicates(subset = ['Album'])
print(plusDeDoublonsAlbum)
#lignes redondantes (identiques sur nom groupe, supprimées mais on garde le dernier
plusDeDoublonsGroupe=pandas.DataFrame(result).drop_duplicates(subset = ['Album'], keep='last')
print(plusDeDoublonsGroupe)

Tests de cohérence

Comme dit plus haut, le type du contenu de chaque champ doit rester fixe. Par exemple si un champ doit contenir des dates, il faudra qu'il n'y ait que des dates et toutes au même format. De même, si un champs est un nombre, on n'attend pas une chaine de caractère.

Exercices

  1. Pour manipuler pandas. Créez votre propre csv avec les champs et valeurs de votre choix. Au moins trois champs et 5 valeurs, plus quelques doublons. Faites afficher à l'aide de pandas, la 2nde colonne. Faites afficher la 3ème ligne. Uniquement les lignes 2 et 3 avec les colonnes 1 et 3. Faites afficher les lignes pour lesquelles la 2ème colonne a une valeur inférieure à un critère de votre choix.

  2. Ecrire un programme qui n'utilise pas Pandas et qui permet de lire toutes les lignes dont la deuxième colonne est inférieure à un critère de votre choix. (Vous voyez ce n'est pas si difficile).

  3. Ecrire un programme qui n'utilise pas Pandas et qui permet de trouver les doublons et de les effacer (on parle de doublons parfaits, identiques sur tous les champs)

  4. Ecrire un programme qui n'utilise pas Pandas et qui permet de trouver les doublons sur le premier champs, qui affiche les deux lignes en doublon et demande si l'on veut le conserver ou l'effacer.

  5. En python la commande type renvoie le type de la variable. Par exemple:
    
    print(type(3))
    print(type("3"))
    a=3
    b="3"
    print(type(a)==type(b))
    
    En utilisant cette commande, ecrire un programme qui va vérifier que tous les éléments d'une colonne sont bien du même type. Renvoie True si pas de soucis, False sinon. On améliore ensuite ce programme pour indiquer, uniquement sur les colonnes à problème, les différents types rencontrés.

Android

De la programmation pour pc à la programmation pour téléphone.

A finir

Pas eu le temps de tout faire.....