Outils pour utilisateurs

Outils du site


nsi:premiere:csv:modules_csv_et_pandas

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:premiere:csv:modules_csv_et_pandas [2022/08/29 20:12] – supprimée - modification externe (Unknown date) 127.0.0.1nsi:premiere:csv:modules_csv_et_pandas [2023/02/03 12:28] (Version actuelle) goupillwiki
Ligne 1: Ligne 1:
 +====== Modules csv et pandas ======
  
 +===== Fichier csv =====
 +
 +Vous disposez d'un fichier {{ nsi:premiere:csv:worldcities.csv |worldcities.csv}}
 +contenant les données sur un ensemble de villes.
 +
 +<WRAP tip>
 +**csv** signifie //comma separated values//, c'est un fichier où les données sont séparées par des virgules ou des points-virgules.
 +</WRAP>
 +
 +Le fichier est un simple fichier texte qui ressemble à cela :
 +
 +<code lang-none>
 +city;city_ascii;lat;lng;country;iso2;iso3;admin_name;capital;population;id
 +Tokyo;Tokyo;35.6850;139.7514;Japan;JP;JPN;Tōkyō;primary;35676000;1392685764
 +New York;New York;40.6943;-73.9249;United States;US;USA;New York;;19354922.0;1840034016
 +Mexico City;Mexico City;19.4424;-99.1310;Mexico;MX;MEX;Ciudad de México;primary;19028000;1484247881
 +...
 +</code>
 +
 +Si on l'ouvrait avec un éditeur spécialisé comme un tableur, on aurait ce type de mise en forme :
 +
 +<csv delim=;>
 +city;city_ascii;lat;lng;country;iso2;iso3;admin_name;capital;population;id
 +Tokyo;Tokyo;35.6850;139.7514;Japan;JP;JPN;Tōkyō;primary;35676000;1392685764
 +New York;New York;40.6943;-73.9249;United States;US;USA;New York;;19354922.0;1840034016
 +Mexico City;Mexico City;19.4424;-99.1310;Mexico;MX;MEX;Ciudad de México;primary;19028000;1484247881
 +</csv>
 +
 +La première ligne est une entête qui sert à préciser le contenu des colonnes.
 +
 +<WRAP box>
 +Nous aimerions ouvrir le fichier et en extraire le contenu sous une forme exploitable.
 +</WRAP>
 +
 +<WRAP important>Commencez par télécharger {{ nsi:premiere:csv:worldcities.csv |worldcities.csv}} dans un dossier. Vous placerez les scripts suivant dans le même dossier.</WRAP>
 +
 +===== Sans module =====
 +
 +<code language=python linenums:1>
 +# Fichier city0.py
 +# Exemple de chargement de fichier csv
 +# sans module
 +
 +file = open('worldcities.csv', 'r', encoding='utf8')
 +contenu = file.read()
 +file.close()
 +lines = contenu.split('\n')
 +items = [line.split(';') for line in lines]
 +
 +# à titre d'illustration, affichons le résultat :
 +for i in range(5):
 +    print(items[i])
 +</code>
 +
 +===== Avec l'objet reader du module csv =====
 +
 +<code language=python linenums>
 +# Fichier city1.py
 +# Exemple de chargement de fichier csv avec
 +# l'objet reader du module csv
 +
 +import csv
 +file = open('worldcities.csv', 'r', encoding='utf8')
 +
 +# csv fourni un objet de type reader
 +# qui est comme un tête de lecture placée
 +# sur le fichier
 +
 +reader = csv.reader(file, delimiter=';')
 +
 +villes = []
 +for row in reader:
 +    villes.append(row)
 +
 +file.close()
 +
 +
 +# à titre d'illustration, affichons le résultat :
 +for i in range(5):
 +    print(villes[i])
 +</code>
 +
 +<WRAP tip>
 +  * On n'a plus besoin de faire la découpe, ''csv.reader'' s'en charge,
 +  * le résultat ''villes'' est un tableau de tableau,
 +  * la ligne d'entête n'est pas vraiment utilisée,
 +  * si on veut accéder au nom de pays de Tokyo, il faut déjà savoir que Tokyo est à la ligne 1 puis que le nom de pays est à la colonne 4 et demander ''%%villes[1][4]%%''. Ce n'est pas tellement pratique.
 +</WRAP>
 +
 +===== Avec l'objet DictReader du module csv =====
 +
 +<code language=python linenums>
 +# Fichier city2.py
 +# Exemple de chargement de fichier csv avec
 +# l'objet DictReader du module csv
 +
 +import csv
 +file = open('worldcities.csv', 'r', encoding='utf8')
 +
 +# csv fourni un objet de type DictReader
 +# Il fournit presque des dictionnaires
 +
 +reader = csv.DictReader(file, delimiter=';')
 +
 +villes = []
 +for row in reader:
 +    villes.append(row)
 +
 +file.close()
 +
 +# à titre d'illustration, affichons le résultat :
 +print(villes[0]["country"])
 +</code>
 +
 +<WRAP tip>
 +  * Cette fois le résultat est un tableau de dictionnaires (ou presque),
 +  * la première ligne d'entête est utilisée pour servir de clés aux dictionnaires,
 +  * si on veut connaître le pays de Tokyo, il suffit de savoir que Tokyo est à la ligne d'indice ''0'' et de demander ''%%villes[0]['country']%%'',
 +  * si vous affichez le contenu de ''villes'' vous constaterez que les items ne sont pas des exactement des dictionnaires. Si cela posait un problème, on pourrait faire une conversion, en ligne 16 : ''villes.append(dict(row))''. Vous pouvez essayer et constater la différence.
 +</WRAP>
 +
 +===== Utiliser une fonction de formatage =====
 +
 +La version ''DictReader'' n'est pas mal mais dans la lecture du fichier, tout est considéré comme du texte. Si nous voulions faire des calculs avec les l’attitude, longitude... c'est gênant.
 +
 +On pourrait ajouter une fonction chargée de modifier les types.
 +
 +<code language=python linenums>
 +# Fichier city2_bis.py
 +# Utilisation d'une fonction de formatage
 +# pour que les données numériques soient bien reconnues
 +
 +import csv
 +
 +def format(item):
 +    return {
 +        'city':item['city'],
 +        'lat':float(item['lat']),
 +        'lng':float(item['lng']),
 +        'country':item['country'],
 +    }
 +
 +file = open('worldcities.csv', 'r', encoding='utf8')
 +reader = csv.DictReader(file, delimiter=';')
 +villes = []
 +for row in reader:
 +    villes.append(format(row))
 +file.close()
 +
 +# à titre d'illustration, affichons les 5 première lignes :
 +print(villes[:5])
 +</code>
 +
 +<WRAP tip>
 +  * Les données obtenues ont la bonne forme. On peut utiliser les nombres en tant que nombres.
 +  * On est libre de filtrer certaines colonnes. Dans cet exemple, la fonction ''format'' ne prend en compte que 4 colonnes.
 +  * Certains cas nécessiteront des fonctions plus souples : ici par exemple, la colonne *population* n'est pas toujours convenablement renseignée. On ne peut donc pas se contenter de ''%%int(item["population"])%%''.
 +</WRAP>
 +
 +===== Avec le module pandas =====
 +
 +Il s'agit d'un gros module qui sait faire beaucoup de choses. Ce module est très utilisé par ceux qui font de l'analyse de données. C'est la présence de module très performants comme celui-ci qui font la popularité de Python.
 +
 +<code language=python linenums>
 +# Fichier city3.py
 +# Exemple de chargement de fichier csv avec
 +# le module pandas
 +
 +import pandas
 +villes = pandas.read_csv("worldcities.csv", delimiter=";")
 +</code>
 +
 +**C'est tout !** ''%%villes%%'' n'est pas un tableau. C'est un objet défini par pandas, plus compliqué et plein de fonctionnalités. Voici quelques exemples que vous pouvez **entrer en console** après exécution du script :
 +
 +<code python>
 +>>> villes.loc[10] # affichage de l'item au rang 10
 +>>> villes.loc[10]['population'] # population de cette ville.
 +</code>
 +
 +Notez que ''%%population%%''a été converti en ''%%float%%'' automatiquement par panda ce que ne faisait pas ''%%csv%%''.
 +
 +<code python>
 +>>> villes.nlargest(10, 'population')
 +>>> villes[villes.city == "Paris"]
 +>>> villes['population'].describe()
 +</code>
 +
 +Ceci n'est qu'un aperçu, pandas a beaucoup de fonctionnalités.