donnees structurées

Les données structurées

On trouve énormément de données sur internet. Une partie de ces données sont publiques, par exemple le site data.gouv.fr récence un grand nombre de données publiques. Ces données sont librement réutilisables.

À faire vous-même 1

Afin de découvrir ce qu'est "l'open data", allez sur le site data.gouv.fr. En haut et à gauche de la page d'acceuil, cliquez sur "Découvrir L’OpenData". Résumez en quelques lignes ce que vous aurez appris en lisant cette page.


À faire vous-même 2

Explorez pendant quelques minutes le site data.gouv.fr. Recherchez les données "Opérations coordonnées par les CROSS" à l'aide du moteur de recherche proposé par le site

Vous pouvez constater que ces données sont au format csv.


Le format csv est très courant sur internet, nous allons l'étudier en premier.

Voici ce que nous dit Wikipédia sur le format CSV :

Comma-separated values, connu sous le sigle CSV, est un format informatique ouvert représentant des données tabulaires sous forme de valeurs séparées par des virgules.

Un fichier CSV est un fichier texte, par opposition aux formats dits « binaires ». Chaque ligne du texte correspond à une ligne du tableau et les virgules correspondent aux séparations entre les colonnes. Les portions de texte séparées par une virgule correspondent ainsi aux contenus des cellules du tableau.

Voici un exemple du contenu d'un fichier CSV :


nom,prenom,date_naissance
Durand,Jean-Pierre,23/05/1985
Dupont,Christophe,15/12/1967
Terta,Henry,12/06/1978
		

Je pense qu'il est évident pour vous que nous avons ici 3 personnes :

  • Jean-Pierre Durand qui est né le 23/05/1985
  • Christophe Dupont qui est né le 15/12/1967
  • Henry Terta qui est né le 12/06/1978

"nom", "prenom" et "date_naissance" sont appelés des descripteurs alors que, par exemple, "Durand", "Dupont" et "Terta" sont les valeurs du descripteur "nom".

À faire vous-même 3

Donnez les différentes valeurs du descripteur "date_naissance"

ATTENTION :

La virgule est un standard pour les données anglo-saxonnes, mais pas pour les données aux normes françaises. En effet, en français, la virgule est le séparateur des chiffres décimaux. Il serait impossible de différencier les virgules des décimaux et les virgules de séparation des informations. C’est pourquoi on utilise un autre séparateur : le point-virgule (;). Dans certains cas cela peut engendrer quelques problèmes, vous devrez donc rester vigilants sur le type de séparateur utilisé.

Les tableurs, tels que "Calc" (Libre Office), sont normalement capables de lire les fichiers au format CSV. J'ai précisé "normalement" car certains tableurs gèrent mal le séparateur CSV "point-virgule" et le séparateur des chiffres décimaux "virgule".

À faire vous-même 4

Après avoir téléchargé le fichier ident_pointVirgule.csv, ouvrez ce dernier à l'aide d'un tableur.

Si par hasard votre tableur ne gère pas correctement le fichier avec le séparateur "point-virgule", voici une version "séparateur virgule" du fichier : ident_virgule.csv

Dans la suite, gardez toujours cet éventuel problème à l'esprit (surtout avec des données "made in France")


Vous devriez obtenir ceci :

Vous pouvez constater que les données sont bien "rangées" dans un tableau avec des lignes et des colonnes (voilà pourquoi on parle de données tabulaires.

Il est possible de trouver sur le web des données beaucoup plus intéressantes à traiter que celles contenues dans le fichier "ident_pointVirgule.csv" (ou "ident_virgule.csv"). Par exemple, le site sql.sh, propose un fichier csv contenant des informations sur l'ensemble des communes françaises.

À faire vous-même 5

Ouvrez le fichier ville_point_virgule.csv à l'aide d'un tableur (c’est une version légèrement modifiée de celle disponible sur le site sql.sh, j’y ai notamment ajouté des entêtes). En cas de problème avec votre tableur, voici une version "séparateur virgule" : ville_virgule.csv (attention le séparateur "décimal" est ici le point)


Comme vous pouvez le constater, nous avons 12 colonnes (et 36700 lignes si on ne compte pas l'entête !), voici la signification de ces colonnes :

  • dep : numéro de département
  • nom : nom de la commune
  • cp : code postal
  • nb_hab_2010 : nombre d'habitants en 2010
  • nb_hab_1999 : nombre d'habitants en 1999
  • nb_hab_2012 : nombre d'habitants en 2012 (approximatif)
  • dens : densité de la population (habitants par kilomètre carré)
  • surf : superficie de la commune en kilomètre carré
  • long : longitude
  • lat : latitude
  • alt_min : altitude minimale de la commune (il manque des données pour certains territoires d'outre-mer)
  • alt_max : altitude maximale de la commune (il manque des données pour certains territoires d'outre-mer)

À faire vous-même 6

En vous aidant du fichier ouvert dans le "À faire vous-même 4", déterminez l'altitude maximale et l'altitude minimale de votre commune.

Autre format de données très courant sur le "web", le JSON (JavaScript Object Notation). Le JSON fonctionne avec un système de paire clé/valeur.

Un "objet" est encadré par des accolades :


{cle_1 : val_1, cle_2 : val_2, cle_3 : val_3}
		

souvent, pour une question de lisibilité, on écrira :


{
cle_1 : val_1,
cle_2 : val_2,
cle_3 : val_3
}
		

Un fichier au format JSON peut regrouper un grand nombre d'objets :


[{
"nom" : "Durand",
"prenom" : "Jean-Pierre",
"date_naissance" : "23/05/1985"
},
{
"nom" : "Dupont",
"prenom" : "Christophe",
"date_naissance" : "15/12/1967"
},
{
"nom" : "Terta",
"prenom" : "Henry",
"date_naissance" : "12/06/1978"
}]
		

Ci-dessus, nous avons une liste (délimité par [ ]) contenant des objets.

La "valeur" d'une paire "clé/valeur" peut être une liste :


{
"nom" : "Durand",
"prenom" : "Jean-Pierre",
"date_naissance" : "23/05/1985"
"sport" : ["tennis", "football", "pétanque"]
}
		

ou même un autre objet :


{
"nom" : "Durand",
"prenom" : "Jean-Pierre",
"date_naissance" : "23/05/1985"
"adresse" : {"num":6, "rue":"impasse du rossignol", "ville":"Nogent-le-Rotrou", "cp":"28400"}
}
		 

Comme vous pouvez le constater, il est possible d'obtenir des structures de données très complexes avec le format JSON.

À faire vous-même 7

Téléchargez le fichier ident.json et ouvrez-le à l'aide d'un éditeur de texte.


De nombreux sites web proposent des services basés sur des API (Application Programming Interface). Ces sites sont capables de fournir des données aux formats JSON sur "simple demande". Souvent, ces "demandes" sont effectuées par l'intermédiaire d'une url (si vous avez besoin de vous rafraichir la mémoire à propos de la notion d'url, n'hésitez pas à reconsulter ce document).

Nous allons illustrer ce propos en utilisant l'API d'un site qui fournit des informations météo au format JSON. Vous trouverez ce site à l'adresse suivante : openweathermap.org/api

Pour profiter de ce service, il est nécessaire d'obtenir une clé (API key). Cette clé vous sera fournie par votre enseignant.

À faire vous-même 8

Ouvrez votre navigateur préféré et copiez-collez l'url suivante dans la barre d'adresse du navigateur :


http://api.openweathermap.org/data/2.5/weather?q=bonneville,fr&lang=fr&units=metric&APPID=XXXXXXXXXXXXX
		

ATTENTION : il faut remplacer les "X" par la clé (API key) qui vous aura été fournie


Au lieu d'obtenir, comme d'habitude, une page web, vous devriez obtenir uniquement quelque chose qui ressemblera à ceci :


{"coord":{"lon":6.41,"lat":46.08},"weather":[{"id":800,"main":"Clear","description":"ciel dégagé","icon":"01d"}],"base":"stations","main":{"temp":12.31,"pressure":1026,"humidity":58,"temp_min":11,"temp_max":14},"visibility":10000,"wind":{"speed":2.6,"deg":200},"clouds":{"all":0},"dt":1540373400,"sys":{"type":1,"id":5570,"message":0.0046,"country":"FR","sunrise":1540361039,"sunset":1540398737},"id":3031679,"name":"Bonneville","cod":200}
		

Comme les données sont réactualisées relativement souvent, vous n'obtiendrez pas la même chose que moi !

Avec une simple url, le site open weather renvoie des informations météo sous forme de données JSON.

Détaillons l'url :


http://api.openweathermap.org/data/2.5/weather
		

Cette partie de l'url ne changera pas (sauf si vous désirez autre chose que les conditions météo actuelles, à ce moment-là, il faudra remplacer "weather" par autre chose (consulter le site open weather pour plus d'informations)).


?q=bonneville,fr&lang=fr&units=metric&APPID=XXXXXXXXXXXXX
		

À partir du point d'interrogation, vous devez renseigner les différents paramètres qui permettront à open weather de vous renvoyer les bonnes informations. Ces paramètres sont séparés par le caractère "&".

  • "q=bonneville,fr" le paramètre "q" correspond au nom de la ville suivi du pays (fr dans notre cas)
  • "lang=fr" la langue utilisée sera le français
  • "units=metric" on désire avoir les longueurs en mètres (et les vitesses en mètre par seconde).
  • "APPID" correspond à l'API key

Il est possible de construire des requêtes beaucoup plus complexes, encore une fois, veuillez consulter le site open weather pour plus d'informations.

Intéressons-nous maintenant aux données JSON renvoyées (nous n'allons pas tout détailler) :

  • "coord":{"lon":6.41,"lat":46.08} latitude et longitude du lieu
  • "weather":[{"id":800,"main":"Clear","description":"ensoleillé","icon":"01d"}] "weather" correspond à un tableau qui contient un seul objet.
  • "main":{"temp":17.35,"pressure":1016,"humidity":59,"temp_min":16,"temp_max":19} "main" correspond à un objet qui contient différents types d'informations
  • "dt":1443975257 "dt" nous donne l'heure et la date de diffusion du bulletin au format "timestamp" (voir en bas de cette page pour plus d'informations sur le format "timestamp")
  • "sunrise":1443937018,"sunset":144397849 : respectivement heure de lever et de coucher du soleil au format timestamp

Dernier format de données que nous verrons aujourd'hui le geoJSON. Le geoJSON est un format (http://geojson.org/) qui permet d'encoder des données à "caractère géographique". Voici ce que dit Wikipédia à propos de ce format :

GeoJSON (de l'anglais Geographic JSON, signifiant littéralement JSON géographique) est un format ouvert d'encodage d'ensemble de données géospatiales simples utilisant la norme JSON (JavaScript Object Notation). Il permet de décrire des données de type point, ligne, chaîne de caractères, polygone, ainsi que des ensembles et sous-ensembles de ces types de données et d'y ajouter des attributs d'information qui ne sont pas spatiale. Le format GeoJSON, contrairement à la majorité des standards de systèmes d'informations géographiques, n'est pas écrit par l'Open Geospatial Consortium, mais par un groupe de travail de développeurs au travers d'internet.

Comme indiqué dans Wikipédia, le geoJSON est avant tout du JSON, nous retrouverons donc les mêmes caractéristiques que le JSON (système de clé/valeur).

À faire vous-même 9

Dans la barre d'adresse de votre navigateur, tapez l'adresse suivante :


http://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson
		

Vous devriez obtenir quelque chose ressemblant à ceci :


			{"type":"FeatureCollection","metadata":{"generated":1540378300000,"url":"https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson","title":"USGS Earthquakes","status":200,"api":"1.5.8","count":11084},"features":[{"type":"Feature","properties":{"mag":1.2,"place":"50km WSW of Beatty, Nevada","time":1540376291890,"updated":1540376429010,"tz":-480,"url":"https://earthquake.usgs.gov/earthquakes/eventpage/nn00662538","detail":"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=nn00662538&format=geojson","felt":null,"cdi":null,"mmi":null,"alert":null,"status":"automatic","tsunami":0,"sig":22,"net":"nn","code":"00662538","ids":",nn00662538,","sources":",nn,","types":",geoserve,origin,phase-data,","nst":25,"dmin":0.206,"rms":0.14,"gap":193.7,"magType":"ml","type":"earthquake","title":"M 1.2 - 50km WSW of Beatty, Nevada"},"geometry":{"type":"Point","coordinates":[-117.2687,36.701,6.1]},"id":"nn00662538"},
			{"type":"Feature","properties":{"mag":0.33,"place":"26km ENE of Coso Junction, CA","time":1540375448150,"updated":1540375659789,"tz":-480,"url":"https://earthquake.usgs.gov/earthquakes/eventpage/ci37402802","detail":"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=ci37402802&format=geojson","felt":null,"cdi":null,"mmi":null,"alert":null,"status":"automatic","tsunami":0,"sig":2,"net":"ci","code":"37402802","ids":",ci37402802,","sources":",ci,","types":",geoserve,nearby-cities,origin,phase-data,scitech-link,","nst":8,"dmin":0.09902,"rms":0.08,"gap":87,"magType":"ml","type":"earthquake","title":"M 0.3 - 26km ENE of Coso Junction, CA"},"geometry":{"type":"Point","coordinates":[-117.6603333,36.0935,3.59]},"id":"ci37402802"},
			{"type":"Feature","properties":{"mag":4,"place":"129km W of Aksu, China","time":1540375112280,"updated":1540376596040,"tz":480,"url":"https://earthquake.usgs.gov/earthquakes/eventpage/us1000hgfr","detail":"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us1000hgfr&format=geojson","felt":null,"cdi":null,"mmi":null,"alert":null,"status":"reviewed","tsunami":0,"sig":246,"net":"us","code":"1000hgfr","ids":",us1000hgfr,","sources":",us,","types":",geoserve,origin,phase-data,","nst":null,"dmin":1.028,"rms":1.2,"gap":76,"magType":"mb","type":"earthquake","title":"M 4.0 - 129km W of Aksu, China"},"geometry":{"type":"Point","coordinates":[78.7329,40.9744,10]},"id":"us1000hgfr"},
			{"type":"Feature","properties":{"mag":2.7,"place":"74km SW of Kaktovik, Alaska","time":1540374704504,"updated":1540375574040,"tz":-540,"url":"https://earthquake.usgs.gov/earthquakes/eventpage/ak20289736","detail":"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=ak20289736&format=geojson","felt":null,"cdi":null,"mmi":null,"alert":null,"status":"automatic","tsunami":0,"sig":112,"net":"ak","code":"20289736","ids":",ak20289736,us1000hgfn,","sources":",ak,us,","types":",geoserve,origin,phase-data,","nst":null,"dmin":null,"rms":0.93,"gap":null,"magType":"ml","type":"earthquake","title":"M 2.7 - 74km SW of Kaktovik, Alaska"},"geometry":{"type":"Point","coordinates":[-145.039,69.6714,11.9]},"id":"ak20289736"},
			{"type":"Feature","properties":{"mag":2.1,"place":"102km S of King Salmon, Alaska","time":1540374255100,"updated":1540374574201,"tz":-540,"url":"https://earthquake.usgs.gov/earthquakes/eventpage/ak20289733","detail":"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=ak20289733&format=geojson","felt":null,"cdi":null,"mmi":null,"alert":null,"status":"automatic","tsunami":0,"sig":68,"net":"ak","code":"20289733","ids":",ak20289733,","sources":",ak,","types":",geoserve,origin,","nst":null,"dmin":null,"rms":0.51,"gap":null,"magType":"ml","type":"earthquake","title":"M 2.1 - 102km S of King Salmon, Alaska"},"geometry":{"type":"Point","coordinates":[-156.5171,57.7691,139.9]},"id":"ak20289733"},
			{"type":"Feature","properties":{"mag":0.31,"place":"6km NW of The Geysers, CA","time":1540374181920,"updated":1540375082963,"tz":-480,"url":"https://earthquake.usgs.gov/earthquakes/eventpage/nc73101451","detail":"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=nc73101451&format=geojson","felt":null,"cdi":null,"mmi":null,"alert":null,"status":"automatic","tsunami":0,"sig":1,"net":"nc","code":"73101451","ids":",nc73101451,","sources":",nc,","types":",geoserve,nearby-cities,origin,phase-data,scitech-link,","nst":12,"dmin":0.009156,"rms":0.04,"gap":74,"magType":"md","type":"earthquake","title":"M 0.3 - 6km NW of The Geysers, CA"},"geometry":{"type":"Point","coordinates":[-122.8178329,38.8111649,2.38]},"id":"nc73101451"},
			{"type":"Feature","properties":{"mag":0.9,"place":"8km NNE of Borrego Springs, CA","time":1540372372650,"updated":1540372593471,"tz":-480,"url":"https://earthquake.usgs.gov/earthquakes/eventpage/ci37402794","detail":"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=ci37402794&format=geojson","felt":null,"cdi":null,"mmi":null,"alert":null,"status":"automatic","tsunami":0,"sig":12,"net":"ci","code":"37402794","ids":",ci37402794,","sources":",ci,","types":",geoserve,nearby-cities,origin,phase-data,scitech-link,","nst":30,"dmin":0.08412,"rms":0.23,"gap":123,"magType":"ml","type":"earthquake","title":"M 0.9 - 8km NNE of Borrego Springs, CA"},"geometry":{"type":"Point","coordinates":[-116.3416667,33.3238333,9.83]},"id":"ci37402794"},
			...
		 

Le site "earthquake.usgs.gov", comme le site "http://openweathermap.org/", propose une API qui renvoie des données à partir d'une simple url. Le site "earthquake.usgs.gov" renvoie des données au format geoJSON (c'est donc du JSON), ces données contiennent des informations sur les tremblements de terre détectés dans le monde sur une période de 30 jours. Le site vous propose différentes options pour la requête, vous trouverez une description complète de ces options ici

À faire vous-même 10

En vous aidant de la documentation présente sur le site http://earthquake.usgs.gov, écrivez une requête sous forme d'url qui permettra d'obtenir des données (au format geoJSON) sur les tremblements de terre, d'une magnitude supérieure à 5, ayant eu lieu ces 30 derniers jours partout dans le monde.

Testez votre requête en la copiant dans la barre d'adresse de votre navigateur. Une fois les données obtenues, étudiez-les afin de comprendre la structure de ces données.

ATTENTION : les dates et les heures sont fournies au format "timestamp". Le "timestamp" désigne le nombre de secondes écoulé depuis le 1er janvier 1970 à minuit UTC précise. Au lieu de donner une date et une heure pour un événement donné, il est possible de donner son "timestamp". Par exemple, au lieu de dire l'événement A à eu lieu le 24 octobre 2018 à 13h 11 minutes et 10 secondes, on pourra dire que l'événement A à pour "timestamp" 1540379470 (durée qui s'est écoulé en seconde entre le 1er janvier 1970 à minuit UTC et le 24 octobre 2018 à 13h 11 minutes et 10 secondes). Vous trouverez un convertisseur de timestamp sur ce site. Attention, dans le JSON renvoyé par le site "earthquake.usgs.gov" le timestamp est donné en milliseconde, il est donc nécessaire de diviser par 1000 la valeur que vous allez trouver dans le JSON (et garder uniquement la partie entière du résultat de votre division).


Après avoir vu différents types de données, nous allons maintenant, à l'aide du langage de programmation Python, apprendre à effectuer des traitements sur ces données.

À faire vous-même 1

Ouvrez le logiciel Spyder

Dans un Spyder vous pouvez saisir du code (partie "Editeur de texte") mais aussi, saisir des commandes (nous verrons ce concept de commande plus loin) dans la partie "Console".


Pour traiter des données, nous allons utiliser la bibliothèque Python Pandas. Une bibliothèque Python permet de rajouter des fonctionnalités par rapport au langage de base. La bibliothèque Pandas est donc très utilisée pour tout ce qui touche au traitement des données.

Pour nos premiers pas avec Pandas, nous allons utiliser des données très simples au format CSV : ces données sont contenues dans le fichier ident_virgule.csv.

À faire vous-même 2

Après avoir téléchargé le fichier ident_virgule.csv, placez-le dans le dossier de votre choix (par exemple dans un dossier nommé "act_pandas")


À faire vous-même 3

Dans la partie "Editeur de texte" de Spyder, saisissez le code Python suivant :


import pandas
iden=pandas.read_csv("ident_virgule.csv")
		

Une fois le code saisi, enregistrer le fichier contenant ce code dans le même répertoire que le fichier "ident_virgule.csv"


Le code ci-dessus est très simple :

  • Avec la première ligne, nous importons la bibliothèque pandas afin de pouvoir l'utiliser
  • À la deuxième ligne, nous créons une variable "iden" qui va contenir les données présentes dans le fichier "ident_virgule.csv"

À faire vous-même 4

Dans spyder cliquez sur le triangle vert qui permet d'exécuter le programme que vous venez de saisir. Placez ensuite le curseur de la souris dans la console de spyder juste à côté d'un "In [X]" (avec X égal à 1, 2, 3..., selon les cas, dans l'exemple ci-dessous nous avons "In [3]"). Tapez alors "iden"

Vous devriez voir apparaitre les données contenues dans la variable "iden" rangées sous la forme d'un tableau, un peu comme ce que nous obtenions en ouvrant le fichier "ident_virgule.csv" avec un tableur.


Vous avez peut-être remarqué qu'une colonne a été ajoutée par rapport à ce que nous obtenions avec le tableur :

Les nombres présents dans cette colonne sont appelés des index. Chaque ligne du tableau a un index (première ligne : index 0, deuxième ligne index 1...)

ATTENTION : les index commencent à 0 et pas à 1

Les colonnes possèdes également des index, dans notre exemple ces index correspondent au "nom" (index de la première colonne), au "prenom" (index de la deuxième colonne) et à "date_naissance" (index de la troisième colonne)

En résumé : les lignes possèdent des index (0,1,2..), les colonnes possèdent aussi des index ("nom", "prenom",...)

Il est possible de récupérer certaines données du tableau, par exemple, certaines lignes, certaines colonnes ou bien encore des valeurs uniques. Pour cela, il suffit d'utiliser l'instruction "loc" avec les index des lignes et les index des colonnes. Le principe de fonctionnement de "loc" est relativement simple puisque l'on aura une instruction de la forme "loc[index_ligne,index_colonne]"

À faire vous-même 5

Testez le programme suivant :


import pandas
iden=pandas.read_csv("ident_virgule.csv")
info=iden.loc[1,'prenom']
		

Vérifiez que la variable "info" contient bien le prénom "christophe"


À faire vous-même 6

Modifiez le programme du "À faire vous-même 4" pour que la variable info contienne "12/06/1978"


Il est possible de récupérer plusieurs toutes les lignes d'une colonne, il suffit de remplacer la partie "index_ligne" de "loc" par ":"

À faire vous-même 7

Testez le programme suivant :


import pandas
iden=pandas.read_csv("ident_virgule.csv")
info=iden.loc[:,'nom']
		

Vérifiez que la variable "info" contient bien toutes les données de la colonne d'index "nom", autrement dit, tous les noms


Il est possible de récupérer toutes les colonnes d'une ligne particulière, cette fois en remplaçant la partie "index_colonne" de "loc" par ":"

À faire vous-même 8

Testez le programme suivant :


import pandas
iden=pandas.read_csv("ident_virgule.csv")
info=iden.loc[2,:]
		

Vérifiez que la variable "info" contient bien toutes les données de la dernière ligne (index 2)


Il est aussi possible de récupérer seulement certaines lignes et certaines colonnes en utilisant la notation suivante : loc[[index_ligne_1,index_ligne_2,...],[index_colonne_1,index_colonne_2,...]]

À faire vous-même 9

Testez le programme suivant :


import pandas
iden=pandas.read_csv("ident_virgule.csv")
info=iden.loc[[0,1],['nom','date_naissance']]
		

Vérifiez que la variable "info" contient bien un tableau avec uniquement les colonnes "nom" et "date_naissance" de la première ligne (index 0) et de la deuxième ligne (index 1).


Afin d'avoir des exemples plus complexes à traiter, dans la suite, nous allons travailler sur les données contenues dans le fichier ville_virgule.csv.

À faire vous-même 10

Testez le programme suivant :


import pandas
info_villes=pandas.read_csv("villes_virgule.csv")
		

Vérifiez que la variable "info_villes" contient bien les données contenues dans le fichier ville_virgule.csv.

Comme vous pouvez le constater, il manque des données dans le tableau qui s'affiche dans la console spyder (les données manquantes sont symbolisées par des ...), en effet, le tableau contient trop données pour qu'il soit entièrement affiché dans la console spyder. Heureusement, il existe une solution :

Dans spyder, dans la fenêtre située juste au-dessus de la console, vous allez trouver un onglet "Explorateur de variables". Cliquez sur cet onglet, vous devriez alors obtenir ceci :

Double-cliquez sur "info_villes" et vous devriez alors voir apparaitre une nouvelle fenêtre qui contiendra un tableau avec l'ensemble des données.


En explorant le tableau, vous devriez, notamment dans les colonnes l'altitude mini et maxi, voir apparaitre un étrange "nan" pour les dernières villes du tableau. "nan" signifie "not a number", ici, cela veut tout simplement dire que certaines données sont manquantes.

Nous allons maintenant introduire des conditions dans la sélection des villes. Imaginez par exemple que vous désirez obtenir un tableau contenant toutes les villes qui ont une altitude minimum supérieure à 1500 m :

À faire vous-même 11

Analysez et testez le programme suivant :


import pandas
info_villes=pandas.read_csv("villes_virgule.csv")
nom_alt=info_villes.loc[info_villes["alt_min"]>1500,["nom","alt_min"]]
		

Dans le "loc", l'expression "info_villes["alt_min"]>1500" est bien avant la virgule, elle concerne donc les index des lignes du tableau. On sélectionnera uniquement les lignes qui auront la valeur du descripteur "alt_min" supérieure à 1500. Nous allons donc bien sélectionner les villes qui ont une altitude minimum supérieure à 1500 m

À faire vous-même 12

En vous inspirant de ce qui a été fait au "À faire vous-même 11", écrivez un programme qui permettra d'avoir les villes qui ont une densité d'habitant inférieure à 50 (dans le tableau ainsi créé, on aura 3 colonnes : le nom de la ville, la densité de la population et l'altitude minimum)


Il est possible de combiner plusieurs facteurs de sélection en utilisant un "et"("&") ou un "ou"("|").

À faire vous-même 13

Analysez et testez le programme suivant :


import pandas
info_villes=pandas.read_csv("villes_virgule.csv")
nom_alt=info_villes.loc[(info_villes["alt_min"]>1500) & (info_villes["dens"]>50),["nom","dens","alt_min"]]
		

Vous devriez constater qu'il y a, en France, une seule ville avec une densité de population supérieure à 50 et une altitude minimum supérieure à 1500 m.


Il est aussi possible d'effectuer des calculs sur des colonnes, par exemple des moyennes. Il suffit d'utiliser l'instruction "mean" pour effectuer une moyenne :

À faire vous-même 14

Analysez et testez le programme suivant :


import pandas
info_villes=pandas.read_csv("villes_virgule.csv")
moyenne_alt_min=info_villes.loc[:,"alt_min"].mean()
		

Vous devriez constater que l'altitude minimum moyenne est de 193 m en France. Je rappelle que dans "loc[:,"alt_min"]" le ":" signifie que l'on considère toutes les lignes du tableau. De plus le "alt_min" que le calcul de la moyenne porte bien sur les données du descripteur "alt_min".


À faire vous-même 15

Écrivez un programme permettant de calculer le nombre moyen d'habitants en 2012


Pour l'instant nous avons calculé une moyenne sur l'ensemble des lignes, il est aussi possible d'imposer une condition sur les lignes qui seront utilisées pour le calcul.

À faire vous-même 16

Analysez et testez le programme suivant :


import pandas
info_villes=pandas.read_csv("villes_virgule.csv")
nbe_hab=info_villes.loc[info_villes["alt_min"]>1500,"nb_hab_2012"].mean()
print(nbe_hab)
		

Vous devriez constater que les villes ayant une altitude minimum supérieure à 1500 m avaient en moyenne 350 habitants en 2012.


Il est aussi possible de trier le tableau en fonction des valeurs d'un descripteur. Il suffit d'utiliser l'instruction "sort_values"

À faire vous-même 17

Analysez et testez le programme suivant :


import pandas
info_villes=pandas.read_csv("villes_virgule.csv")
tri_alt_min=info_villes.sort_values(by=["alt_min"])
		

Vous devriez obtenir un nouveau tableau de données "tri_alt_min" trié dans l'ordre croissant des altitudes minimums. Quelle est la ville ayant l'altitude minimum la plus faible de France ?


Il est aussi possible de trier par ordre décroissant en ajoutant "ascending=False" :

À faire vous-même 18

Analysez et testez le programme suivant :


import pandas
info_villes=pandas.read_csv("villes_virgule.csv")
tri_alt_min=info_villes.sort_values(by=["alt_min"], ascending=False)
		

Quelle est la ville ayant l'altitude minimum la plus importante de France ?


À faire vous-même 19

Écrivez un programme permettant de répondre à la question suivante : quelle est la ville ayant la densité de population la plus forte ?