Table,csv,tri

Manipulation de tables

Introduction

Une des utilisations principales de l’informatique de nos jours est le traitement de quantités importantes de données dans des domaines très variés : un site de commerce en ligne peut avoir à gérer des bases données pour des dizaines de milliers (voire plus) d’articles en vente, de clients, de commandes, un hopital doit pouvoir accéder efficacement à tous les détails de traitements de ses patients, etc. Mais si les logiciels de traitement de base de données sont des programmes hautement spécialisés pour effectuer ce genre de tâches le plus efficacement possible, il est facile de mettre en œuvre les opérations de base dans un langage de programmation comme Python. Nous allons en illustrer quelque unes.


Le format csv

Le format csv (pour comma separated values, soit en français valeurs séparées par des virgules) est un format très pratique pour représenter des données structurées. Dans ce format, chaque ligne représente un enregistrement et, sur une même ligne, les différents champs de l’enregistrement sont réparés par une virgule (d’où le nom). En pratique, on peut spécifier le caractère utilisé pour séparer les différents champs et on utilise fréquemment un point-virgule, une tabulation ou deux points pour cela (pour savoir comment sont séparés les champs, il suffit d'ouvrir le fichier via le bloc note). Notons enfin que la première ligne d’un tel fichier est souvent utilisée pour indiquer le nom des différents champs. Dans ce cas, le premier enregistrement apparaîssant en deuxième ligne du fichier. On trouve énormément de données sur internet. Une partie de ces données sont publiques, par exemple le site data.gouv.fr ou kaggle.com récence un grand nombre de données publiques. Ces données sont librement réutilisables.


Dans la suite, nous allons utiliser un fichier nommé emission_ges.csv. Cet ensemble de données contient les données d’émission de gaz à effet de serre (en tonnes) de différents pays de 1750 à 2017. En voici les premières lignes ( que vous pouvez lire en ouvrant le fichier via bloc note ou visualstudio code) :


                Country,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017
Afghanistan,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14656,98928,190528,282128,388384,494640,648528,831728,1124848,1454608,1839179,2253063,2743861,3432455,4139191,4977742,5984658,7075817,8357682,9581072,10522304,12192701,14086633,15617799,17255042,19170720,21295245,23279471,25666216,27821636,30056540,31813562,33792934,35888474,38408565,41230980,44732874,47866946,50981106,53838190,56603078,59205485,61631971,63013493,64347330,65629819,66860958,68026093,69110567,70140029,70949598,71717793,72529867,73593942,74781013,75722468,77042718,78685964,80954308,85152637,91912951,100365175,112591192,123333249,133333663,143122849,153230277,165488185,178502925
Africa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21984,58624,106256,153888,234496,366400,663184,959968,1439952,3238976,5671872,9009776,13267344,18045200,24094464,29612448,31942752,35852240,41678000,49573920,58488432,68747632,80465104,93395360,106798272,122183408,139594736,156460128,174413728,194019792,213570896,233176960,256428704,281772592,306500928,331947408,359998992,387984624,411958176,441006368,471637408,503818320,538256256,572093296,606864656,642672928,676374400,705843952,732473904,760976160,793516144,829430672,868455936,910302480,954325440,1001184336,1050835200,1104868208,1163697392,1223823632,1290471792,1358002976,1426171696,1494124240,1565869024,1643223392,1738164960,1839368304,1949793936,2061872032,2179512080,2309041808,2444302032,2586054864,2734824256,2882665399,3039232467,3201226721,3367561508,3543896251,3737535480,3951169761,4172251736,4409296748,4666578852,4944494661,5247118415,5578986587,5930864378,6308876953,6697285297,7084592465,7504779055,7937798099,8400306507,8899345945,9435008665,9983549771,10555231206,11149714412,11798923169,12464569744,13154157563,13843743194,14568340496,15266086644,15923936796,16610791075,17280348214,17989891459,18710122956,19485633617,20279206383,21091886368,21927216344,22755551690,23640083267,24519201998,25403353837,26365325805,27398417645,28442492860,29526291008,30652623962,31830766884,33019042498,34212826270,35411199285,36645041459,37895685023,39186174236,40475177493,41785833882,43117573841
Albania,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7328,14656,32976,161216,458000,806080,1238432,1930928,2557472,3301264,3762928,3916816,4037728,4521376,5448368,6151856,7166784,7463568,7866608,8240336,8654368,9156336,9819520,10658576,12164480,13366272,14809888,16832416,19111424,21573632,23654784,25669984,27842736,30392880,33071264,36141696,39384336,43125280,47474448,53113344,58400496,62742336,67333328,72279728,77995568,84484512,92065328,97231568,104566896,111869248,119494032,127313008,135186944,143236752,150674672,157995344,166972144,172482800,176766016,179279520,181613488,183537088,185621904,187637104,189179648,190931040,193913536,196932672,200153328,203901600,208192144,212354448,216604688,220499520,224423664,228794816,233169632,237764288,243000144,247906240,252966224,258678400,264626124,270898982,277278189
                        

Comme nous pouvons le constater, c'est très agréable à lire:-) ici, nous remarquons que les champs sont séparés par des virgules. Nous constatons qu'un fichier CSV peut contenir une quantité très importante de données, pour faciliter la manipulation nous utiliserons une version simplifié du fichier: emission_ges_simple.csv(à placer dans le même dossier que le script python de cette activité)


Importation des données

Une façon de charger un fichier csv en Python est d’utiliser la bibliothèque du même nom. Voici une portion de code permettant de charger le fichier emission_ges_simple.csv .

Do it yourself


import csv
pays = []
with open('emission_ges_simple.csv', newline='') as csvfile:
    donnees = csv.reader(csvfile, delimiter=',')
    for colonne in donnees:
        pays.append(colonne)

Vérifiez dans la console ce qu'indique pays [0] puis regardez d'autres indices


On s’aperçoit que lors de la lecture du fichier, la première ligne n’a pas été utilisée comme descriptions des champs et le premier enregistrement, concernant Bhutan, apparaît dans pays[1]. PLus gênant, le lien entre les valeurs du tableau pays[1] et le nom des enregistrements, contenus dans pays[0], n’est pas direct. Pour y remédier, nous allons utiliser DictReader qui retourne un dictionnaire pour chaque enregistrement, la première ligne étant utilisée pour nommer les différents champs 1 .

Do it yourself


import csv
pays = []
with open('emission_ges_simple.csv', newline='') as csvfile:
    donnees = csv.DictReader(csvfile, delimiter=',')
    for colonne in donnees:
        pays.append(dict(colonne))

Testez le programme et comparez avec le précédent.

Cette fois, on obtient un tableau de p-uplets représentés sous forme de dictionnaire.


Exploitation des données

Nous allons donner deux types d’utilisation simples des données que l’on vient de charger : tout d’abord, l’interrogation des données pour récupérer telle ou telle information, puis le tri des données.

Interrogation

On peut traduire en Python des question simples. Par exemple, quel est le pays où les emmisions sont égales à 62304608199t/an?

Do it yourself


import csv
pays = []
with open('emission_ges_simple.csv', newline='') as csvfile:
    donnees = csv.DictReader(csvfile, delimiter=',')
    for colonne in donnees:
        pays.append(dict(colonne))
    print([p['Country'] for p in pays if p['2017'] ==  '62304608199'])

remarque: Si le résultat d'une recherche comporte des répétitions,nous pouvons les supprimer en utilisant set devant la requete.

Tri

Pour exploiter les données, il peut être intéressant de les trier. Une utilisation possible est l’obtention du classement des entrées selon tel ou tel critère. Une autre utilisation vient du fait que, comme présenté dans la partie algorithmique du programme, la recherche dichotomique dans un tableau trié est bien plus efficace que la recherche séquentielle dans un tableau quelconque.


Tri selon un unique critère

On ne peut pas directement trier le tableau pays… car cela ne veut rien dire. Il faut indiquer selon quels critères on veut effectuer ce tri. Pour cela, on appelle la fonction sorted ou la méthode sort avec l’argument supplémentaire key qui est une fonction renvoyant la valeur utilisée pour le tri 2 .
Rappel : la méthode sort trie la liste en place, alors que la fonction sorted renvoie une nouvelle liste correspondant la liste trié, la liste initiale étant laissée intacte

Par exemple, si l’on veut trier les pays par leur emission en 2017, on doit spécifier la clé '2017'. Pour cela, on définit une fonction appropriée :

Do it yourself


import csv
pays = []
with open('emission_ges_simple.csv', newline='') as csvfile:
    donnees = csv.DictReader(csvfile, delimiter=',')
    for colonne in donnees:
        pays.append(dict(colonne))
def clé_emission2017(p):
    return p['2017']
pays.sort(key=clé_emission2017, reverse=True)

Quel est le podium des pollueurs?
Ici , nous pouvons remarquer que pour obtenir un tri décroissant, nous avons utilisé la fonction reverse.
N'y a t-il pas un problème? où sont les plus gros pollueurs? La raison est que lors de l’import, tous les champs sont considérés comme des chaînes de caractères, et le tri utilise l’ordre du dictionnaire. Pour remédier à cela, on modifie la fonction de clé :


import csv
pays = []
with open('emission_ges_simple.csv', newline='') as csvfile:
    donnees = csv.DictReader(csvfile, delimiter=',')
    for colonne in donnees:
        pays.append(dict(colonne))
def clé_emission2017(p):
    return float(p['2017'])
pays.sort(key=clé_emission2017, reverse=True)

Il est possible de trier selon plusieurs critères


Pour aller plus loin

Exploitez une base de données que vous choisirez dans les sites indiqués en début d'activité.

Vous pouvez également vous appuyer sur les données Pokemon pour effectuer des traitements

Conclusion

Nous l’avons vu, il est assez facile d’écrire en Python des commandes simples pour exploiter un ensemble de données. Cependant, une utilisation plus poussée va vite donner lieu à des programmes fastidieux. Dans un autre document, nous présenterons la bibliothèque pandas qui permet une gestion plus efficace de ce genre de traîtement.