Les fondamentaux des sciences du numérique pour les chimistes
Objectifs
- Introduction de numpy, matplotlib et pandas
- Manipulation des fichiers CSV et JSON
- Analyse des données
Evaluation
Chaque exercice a un niveau de difficulté. Les exercices faciles et de difficulté moyenne vous aident à comprendre les fondamentaux. Il est recommandé de finir ces exercices avant de commencer les exercices difficiles. Le niveau de difficulté de l'exercice et le nombre d'étoiles associées sont montrés par la suite:
- ★: Facile
- ★★: Moyen
- ★★★: Difficile
Exercice 2.1 ★
Nous avons déjà vu comment utiliser une liste en Python. Il est possible de créer un tableau de tableau (une matrice à deux dimensions) ou tableau de tableau de tableau (une matrice à trois dimensions) etc. en utilisant les listes. Mais, les opérations intégrées en Python pour travailler sur ces listes (ou matrices) sont très limitées. C'est pourquoi, nous utiliserons prochainement une bibliothèque appelée Numpy.
1. Version de numpy
Testez le code ci-dessous afin de vérifier si numpy est déjà installé sur votre machine. Le code importe la bibliothèque et ensuite affiche la version installée.
import numpy
print(numpy.__version__)
Au lieu d'écrire numpy à chaque fois, vous pouvez importer la bibliothèque et lui donner un nom que vous voulez utiliser dans tout votre code. Le mot-clé as vous permet de donner un nom de votre préférence comme indiqué ci-dessous.
import numpy as np
print(np.__version__)
2. Tableau
Notre prochain objectif est de déclarer une variable pour stocker un tableau numpy d'entiers. Voyez bien l'affichage de type de données pour ce code.
import numpy as np
a = np.array([1, 2, 3, 4])
print(a)
print(type(a))
Vous pouvez voir la taille du tableau numpy en utilisant l'attribut shape.
import numpy as np
a = np.array([1, 2, 3, 4])
print(a.shape)
3. Tableau à deux dimensions
Vous pouvez également créer un tableau numpy à deux dimensions comme indiqué ci-dessous. Regardez bien la sortie de shape.
import numpy as np
a = np.array([[1, 2, 3, 4], [5,6,7,8]])
print(a.shape)
4. Tableau à trois dimensions
Voyez le code ci-dessous qui créer un tableau numpy en trois dimensions.
import numpy as np
a = np.array([[[1, 2], [5,6]], [[1, 2], [5,6]]])
print(a.shape)
Afin de vérifier le nombre de dimensions d'un tableau numpy, utilisez l'attribut dim.
import numpy as np
a = np.array([[[1, 2], [5,6]], [[1, 2], [5,6]]])
print(a.ndim)
Utilisez l'attribut dtype pour savoir le type de données stockées dans le tableau numpy.
import numpy as np
a = np.array([[[1, 2], [5,6]], [[1, 2], [5,6]]])
print(a.dtype)
Retestez le code au-dessus, mais cette fois, nous stockerons les nombres réels dans le tableau numpy.
import numpy as np
a = np.array([[[1.1, 2.2], [5.3,6.4]], [[1.4, 2.5], [5.5,6.4]]])
print(a.dtype)
Vérifiez l'affichage du code ci-dessous.
import numpy as np
a = np.array([[[1.1, 2.2], [5.3,6.4]], [[1.4, 2.5], [5.5,6.4]]])
print(a.ndim)
Afin de vérifier le nombre de membres dans un tableau, utilisez l'attribut itemsize
import numpy as np
a = np.array([[[1.1, 2.2], [5.3,6.4]], [[1.4, 2.5], [5.5,6.4]]])
print(a.itemsize)
5. Opérations
Voyez le code ci-dessous qui démontre les différentes opérations sur les tableaux numpy.
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[4, 5], [6, 7]])
# addition
c = a + b
print(c)
# soustraction
c = a - b
print(c)
# multiplication
c = a * b
print(c)
# multiplication tableau
d = np.dot(a, b)
print(d)
Comparez les deux dernières opérations de multiplication. Quelle est la différence?
Vous pouvez également comparer les deux tableaux numpy.
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[4, 5], [6, 7]])
# comparaison
c = a == b
print(c)
6. Forme
Vous pouvez changer la forme d'un tableau numpy en utilisant la méthode reshape
import numpy as np
a = np.array([1,2,3,4,5,6,7,8])
print(a)
print(a.shape)
b = a.reshape(4,2)
print(b)
print(b.shape)
b = a.reshape(2,4)
print(b)
print(b.shape)
b = a.reshape(2,2,2)
print(b)
print(b.shape)
Quelle est votre observation?
7. Données hétérogénes
Jusque là, nous avons utilisé les tableaux numpy pour stocker les nombres. Pourtant, il est possible de les utilisez pour stocker des données hétérogénes. Voyez ci-dessous le code qui stocke différents types de données. Par exemple, nous stockerons les données concernant chaque personne (le nom et l'age) dans un tuple.
import numpy as np
a = np.array([("Kevin", 40), ("Pierre", 24), ("Jonathan", 34)])
print(a)
Il est possible de spécifier et nommer les colonnes d'un tableau numpy.
import numpy as np
valeurs = [("Kevin", 40), ("Pierre", 24), ("Jonathan", 34)]
dtypes = [('nom', 'S10'), ('age', int)]
a = np.array(valeurs, dtype=dtypes)
print(a)
8. Tri
Il est possible de trier un tableau numpy en utilisant la méthode sort comme indiqué ci-dessous.
import numpy as np
a = np.array([[4, 1, 2], [7, 3, 4]])
a.sort()
print(a)
Si vous avez déjà rénommé les colonnes de votre tableau numpy, vous pouvez préciser la colonne que vous voulez utiliser pour le tri. Par exemple, ci-dessous, vous demandez de trier en utilisant la colonne age. Nous passerons l'argument order dans la méthode sort.
import numpy as np
valeurs = [("Kevin", 40), ("Pierre", 24), ("Jonathan", 34)]
dtypes = [('nom', 'S10'), ('age', int)]
a = np.array(valeurs, dtype=dtypes)
a.sort(order='age')
print(a)
Modifiez le code au-dessus et utlisez la fonction sorted que nous avons utilisé pendant premier exercice et triez les colonnes en utilisant
- nom
- age
Exercice 2.2 ★★
1. Graphique avec matplotlib
En travaillant avec les grandes ou petites volumes de données, il est intéréssant de visualiser ces données pour voir les anomalies ou les régularités. Notre prochain objectif est de visualiser des données. Nous utiliserons la bibliothèque matplotlib pour le faire. Ci-dessous est en code simple qui démontre les données sur 2 axes en utilisant le graphique linéaire. Regarder bien les données sur l'axe X et l'axe Y.
import matplotlib.pyplot as plt
import numpy as np
a = np.array([1,2,3,4,5,6,7,8])
b = np.array([1,2,3,4,5,6,7,8])
plt.plot(a,b)
Un deuxième exemple en utilisant le même type du graphique.
import matplotlib.pyplot as plt
import numpy as np
a = np.array([1,2,3,4,5,6,7,8])
b = np.array([1,4,9,16,25,36,49,64])
plt.plot(a,b)
2. Lecture de fichiers CSV et tracer les données.
Un fichier CSV stocke les informations ligne par ligne. Chaque ligne stocke des informations en utilisant des séparateurs comme virgule (,). C'est pourquoi, nous appelons ces fichiers CSV (comma separated values en Anglais ou valeurs séparées par des virgules). Vous pouvez utilisez les méthodes open, read, close pour travailler avec ces fichiers. Mais, vous avez déjà vu pendant votre premier exercice les difficultés en traitant ces fichiers. Ci-dessous, nous verrons comment utiliser la bibliothèque numpy pour la lecture d'un fichier CSV et stocker les informations dans un tableau numpy.
Copier ce fichier CSV dans votre répertoire. Le fichier contient la population entre 1901 et 2016.
import numpy as np
dataset = np.loadtxt("population.csv", dtype={'names': ('year', 'population'), 'formats': ('i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
print(dataset)
Notez bien les différents arguments au-dessus, par exemple, l'argument delimiter (séparateur).
Exécutez le code ci-dessous et comparez la différence.
import numpy as np
year, population = np.loadtxt("population.csv", dtype={'names': ('year', 'population'), 'formats': ('i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8", unpack= True)
print(year)
En utilisant matplotlib, nous verrons l'évolution de la population d'une ville.
import numpy as np
import matplotlib.pyplot as plt
year, population = np.loadtxt("population.csv", dtype={'names': ('year', 'population'), 'formats': ('i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8", unpack= True)
plt.plot(year, population)
plt.show()
3. Diagramme en barres
Vous pouvez également tester des autres types de graphiques, par exemple, le diagramme en barres.
import numpy as np
import matplotlib.pyplot as plt
year, population = np.loadtxt("population.csv", dtype={'names': ('year', 'population'), 'formats': ('i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8", unpack= True)
plt.bar(year, population)
plt.show()
Vous pouvez préciser la couleur des lignes de votre graphique.
import matplotlib.pyplot as plot
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [0, 1, 0, 0, 1, 0, 1, 1, 1, 0]
plot.plot(x, y, linewidth=3, drawstyle="steps", color="#1B80CF")
plot.show()
Nous réutiliserons le code au-dessus afin de les voir comme un escalier.
import numpy as np
import matplotlib.pyplot as plt
year, population = np.loadtxt("population.csv", dtype={'names': ('year', 'population'), 'formats': ('i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8", unpack= True)
plt.plot(year, population, linewidth=3, drawstyle="steps", color="#1B80CF")
plt.show()
Modifiez le code au-dessus et testez le graphique en utilisant les couleurs: red (rouge), green(vert), blue(bleu) etc.
Testez le code en modifiant la valeur de l'argument linewidth.
Exercice 2.3 ★★
1. Manipulation des données
Notre prochain objectif est de manipuler des données dans un fichier CSV: accèder des colonnes, sélectionner les valeurs etc. Voyez le code ci-dessous qui affiche les valeurs de chaque colonne du fichier CSV.
import numpy as np
dataset = np.loadtxt("population.csv", dtype={'names': ('year', 'population'), 'formats': ('i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
print(dataset[:]['year'])
print(dataset[:]['population'])
Vous pouvez également sélectionner quelques valeurs d'une colonne. Par exemple, ci-dessous nous afficherons les 10 premières valeurs de la colonne 'year'.
import numpy as np
dataset = np.loadtxt("population.csv", dtype={'names': ('year', 'population'), 'formats': ('i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
print(dataset[0:10]['year'])
2. Analyse des données
Afin de faire l'analyse sur les valeurs de la colonne, vous pouvez utiliser les différentes méthodes de numpy comme expliqué par la suite.
- max: pour obtenir la valeur maximum
- min: pour obtenir la valeur minimum
- mean: pour calculer la moyenne
- std: pour calculer l'écart type
- sum: pour calculer la somme totale
import numpy as np
dataset = np.loadtxt("population.csv", dtype={'names': ('year', 'population'), 'formats': ('i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
population = dataset[:]['population']
print(population.max())
print(population.min())
print(population.mean())
print(population.std())
print(population.sum())
Question 1: Nous avons déjà vu comment stocker et traiter les informations des étudiants en Python sans utiliser les biblothèques. Mais cette fois, nous aimerons bien utiliser numpy pour le faire. Créez un fichier CSV qui contient les informations suivantes pour 10 étudiant.e.s.
- Nom d'étudiant.e
- Age
- Les notes dans 5 modules
Codez en Python le programme en utilisant la bibliothèque numpy pour lire les informations suivantes et les stocker dans un tableau numpy.
Une fois que vous avez eu toutes les informations, calculez les valeurs suivantes pour chaque module et affichez les résultats suivants en utilisant les méthodes numpy que nous avons vus précédemment:
- la moyenne de la classe
- la note minimum
- la note maximum
3. Base de données ouvertes
Notre prochain objectif est de voir comment télécharger les données d'une base de données ouvertes et comment traiter ces données. Pour le faire, nous utiliserons le site web Wikidata qui contient des données ouvertes et structurées.
Voici une requête SPARQL pour récupérer l'année et la population de différents pays du monde.
SELECT DISTINCT ?countryLabel ?year ?population
WHERE {
?country wdt:P31 wd:Q6256; #Country
p:P1082 ?populationStatement;
rdfs:label ?countryLabel. #Label
?populationStatement ps:P1082 ?population; #population
pq:P585 ?date. #period in time
FILTER(lang(?countryLabel)="en") #Label in English
BIND(YEAR(?date) as ?year)
FILTER(?year>2000)
}
ORDER by ?countryLabel ?year
Exécutez cette requête sur https://query.wikidata.org et téléchargez les résultats en format CSV en nommant le fichier payspopulation.csv.
Affichez les données téléchargées en utilisant le code ci-dessous.
import numpy as np
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
print(dataset)
4. pandas
Nous utiliserons une autre bibliothèque appelée pandas afin de faire les analyses avancées. Nous commencerons en lisant les données. Ensuite, nous préparons un DataFrame qui nous permet à manipuler, sélectionner et analyser ces données facilement.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
print(dataframe)
Vous pouvez également les colonnes et les types de données associées en utilisant les méthodes columns et dtypes respectivement.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
print(dataframe.columns)
print(dataframe.dtypes)
Vous pouvez voir la prémiere et la dernière ligne de vos données en utilisant les méthodes head et tail respectivement.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
print(dataframe.head())
print(dataframe.tail())
Une autre possibilité avec les méthodes head et tail est de passer un entier. Par exemple, si vous passez 10 comme argument aux méthodes, vous pouvez voir les dix premières et les dix dernières lignes.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
print(dataframe.head(10))
print(dataframe.tail(10))
5. Sélection de données
Pandas nous fournit une méthode value_counts qui retourne les valeurs distinctes d'une colonne et les nombre de fois elles apparaissent dans la colonne en considération. Ci-dessous, nous regarderons les différentes valeurs de l'année et de la population ainsi que leurs comptes.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
print(dataframe['year'].value_counts())
print(dataframe['countryLabel'].value_counts())
En utilisant la méthode loc, nous pouvons également sélectionner les lignes que satisfaient notre condition ou nos conditions. Voyez le code ci-dessous où l'on sélectionne toutes les lignes correspondant de l'année 2017.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
print(dataframe.loc[dataframe['year']==2017])
Voyez le code ci-dessous où l'on sélectionne toutes les lignes correspondant du pays 'Suède' (Sweden).
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
print(dataframe.loc[dataframe['countryLabel'] =="Sweden"])
Voyez le code ci-dessous où l'on sélectionne toutes les lignes correspondant du pays 'Suède' (Sweden) et de l'année 2017.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
swedenpopulation = dataframe.loc[dataframe['countryLabel'] =="Sweden"]
swedenpopulation2017 = swedenpopulation.loc[swedenpopulation['year'] == 2017]
print(swedenpopulation2017)
Voyez ci-dessous une autre façon de sélectionner toutes les lignes correspondant du pays 'Suède' (Sweden) et de l'année 2017.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
print(dataframe.loc[(dataframe['year']==2017) & (dataframe['countryLabel'] =="Sweden")])
Quelle est votre observation?
6. Tri de données
Vous pouvez facilement trier un DataFrame en utilisant la méthode sort_values. Ci-dessous, nous passerons l'argument by avec la valeur 'population' afin de trier ces données par la population. Ensuite, nous afficherons la première et la dernière ligne du DataFrame, pour récupérer la population minimum et maximum respectivement.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
population = dataframe.sort_values(by='population')
print(population.head(1))
print(population.tail(1))
6. Analyse de données
Vous pouvez également utiliser la méthode describe afin d'afficher toutes les calculs intégrés: le compte, la valeur maximum et minimum, l'écart type, la moyenne, les centiles etc.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
dataframe2015 = dataframe.loc[dataframe['year']==2015]
print(dataframe2015)
print(dataframe2015.describe(include=[np.int32])['population'])
Exercice 2.4 ★★★
1. Groupement de résultat
Il est possible de regrouper des lignes par une ou plusieurs colonnes en utilisant la méthode groupby.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
groups = dataframe.groupby(['countryLabel']).groups
print(groups.keys())
Utilisez les méthodes first et last afin d'afficher la prémiere et la dernière ligne de chaque groupe.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
groups = dataframe.groupby(['countryLabel'])
print(groups.first())
print(groups.last())
Utilisez les méthodes max et min afin d'afficher les valeurs maximum et minimum de colonnes de chaque groupe.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
groups = dataframe.groupby(['countryLabel'])
print(groups['population'].max())
print(groups['population'].min())
Vous pouvez utiliser la méthode agg pour trouver les valeurs maximum et minimum.
import numpy as np
import pandas as pd
dataset = np.loadtxt("payspopulation.csv", dtype={'names': ('countryLabel', 'year', 'population'),
'formats': ('<U100', 'i4', 'i')},
skiprows=1, delimiter=",", encoding="UTF-8")
dataframe = pd.DataFrame(dataset, columns=['countryLabel', 'year', 'population'])
groups = dataframe.groupby(['countryLabel'], as_index=False)
print(groups.agg({'population' : max}))
print(groups.agg({'population' : min}))
Question 1: Exécutez le requête SPARQL ci-dessus sur Wikidata et cette fois téléchargez les résultats en format JSON en nommant le fichier payspopulation.json. Codez en Python en utilisant pandas afin d'avoir les résultats suivants:
- Calculez la population maximum, minimum et moyenne de chaque pays en 2015
- Calculez la population moyenne, maximum et minimum de chaque pays
- Calculez la population maximum, minimum et moyenne de chaque année pour les pays dont les noms commencent par 'A'
- Tracez un graphique montrant la population de tous les pays en 2015
- Tracez un graphique montrant la population de tous les pays
Indices