Académique Documents
Professionnel Documents
Culture Documents
Utilisation pour la
data science et le
traitement des
données
“
Attention:
Dans ce module, vous allez apprendre à utiliser deux librairies Python les plus populaires pour le
traitement des données que l'on utilisera dans les modules suivante de machine learning. Nous ne
pouvons pas tout apprendre dans ces deux librairies, et aucun des data scientists connait tout dans le
monde.
- les méthodes montrées ne sont pas complètes, vous devez savoir consulter
les ressources pour identifier la bonne méthode à utiliser afin de pouvoir
résoudre votre problème
- Pour une méthode donnée, sa manière d'utilisation montrée n'est pas
complète. Nous avons appris qu'une méthode python acceptent des paramètres
optionnels qui ont une valeur par défaut non visible. Vous devez savoir
saisir le bon paramètre en fonction de votre besoin.
Pour ce faire, vous devez bien maitriser Python et analyser l'erreur de log(savoir debug), et faire un
pas d'effort pour aller chercher dans Google par exemple en tapant le nom de la méthode.
Donc il y aura une grande partie d'apprentissage des nouvelles connaissances à acquérir à travers les
exercices du cours(non pas une simple révision).
1 Rappel
Python est un excellent langage de programmation à usage général en soi, mais avec l'aide de quelques
bibliothèques populaires (numpy, scipy, matplotlib), il devient un environnement puissant pour le calcul
scientifique. Avant de rentrer en détail de cette nouvelle utilisation de Python, on va faire d'abord quelques
révisions des notions, des syntaxes et d'utilisation de Python
Python
Python est un langage de programmation multiparadigm de haut niveau, typé dynamiquement. On dit
souvent que le code Python ressemble presque au pseudocode, car il permet d'exprimer des idées très
puissantes en très peu de lignes de code tout en étant très lisible. À titre d'exemple, voici une
implémentation de l'algorithme de tri rapide classique en Python:
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)
print(quicksort([3,6,8,10,1,2,1]))
# Prints "[1, 1, 2, 3, 6, 8, 10]"
Comme la plupart des langages, Python a un certain nombre de types de base, notamment des entiers, des
flottants, des booléens et des chaînes. Ces types de données se comportent de manière familière avec les
autres langages de programmation.
1.1.1 Nombres:
les nombres entiers et les nombres flottants fonctionnent comme vous vous en attendez dans d'autres
langues:
x = 3
print(type(x)) # Prints "<class 'int'>"
print(x) # Prints "3"
print(x + 1) # Addition; prints "4"
print(x - 1) # Subtraction; prints "2"
print(x * 2) # Multiplication; prints "6"
print(x ** 2) # Exponentiation; prints "9"
x += 1
print(x) # Prints "4"
x *= 2
print(x) # Prints "8"
y = 2.5
print(type(y)) # Prints "<class 'float'>"
print(y, y + 1, y * 2, y ** 2) # Prints "2.5 3.5 5.0 6.25"
1.1.2 Booléens
t = True
f = False
print(type(t)) # Prints "<class 'bool'>"
print(t and f) # Logical AND; prints "False"
print(t or f) # Logical OR; prints "True"
print(not t) # Logical NOT; prints "False"
print(t != f) # Logical XOR; prints "True"
Python comprend plusieurs types de conteneurs intégrés: lists, dictionaries, sets, and tuples..
1.2.1 Lists
Une liste est l'équivalent Python d'un tableau, mais elle est redimensionnable et peut contenir des éléments
de différents types:
En plus d'accéder aux éléments de liste un par un, Python fournit une syntaxe concise pour accéder aux
sous-listes; c'est ce qu'on appelle le "slicing (tranchage)":
Boucles: vous pouvez parcourir les éléments d'une liste comme ceci:
nums = [0, 1, 2, 3, 4]
squares = [x ** 2 for x in nums]
print(squares) # Prints [0, 1, 4, 9, 16]
1.2.2 Dictionaries
Un dictionnaire stocke des paires (clé, valeur). Vous pouvez l'utiliser comme ceci:
d = {'cat': 'cute', 'dog': 'furry'} # Create a new dictionary with some data
print(d['cat']) # Get an entry from a dictionary; prints "cute"
print('cat' in d) # Check if a dictionary has a given key; prints "True"
d['fish'] = 'wet' # Set an entry in a dictionary
print(d['fish']) # Prints "wet"
# print(d['monkey']) # KeyError: 'monkey' not a key of d
print(d.get('monkey', 'N/A')) # Get an element with a default; prints "N/A"
print(d.get('fish', 'N/A')) # Get an element with a default; prints "wet"
del d['fish'] # Remove an element from a dictionary
print(d.get('fish', 'N/A')) # "fish" is no longer a key; prints "N/A"
Si vous souhaitez accéder aux clés et à leurs valeurs correspondantes, utilisez la méthode des éléments:
nums = [0, 1, 2, 3, 4]
even_num_to_square = {x: x ** 2 for x in nums if x % 2 == 0}
print(even_num_to_square) # Prints "{0: 0, 2: 4, 4: 16}"
1.2.3 Sets
Un Set(ensemble) est une collection non ordonnée d'éléments distincts. À titre d'exemple simple,
considérez ce qui suit:
Boucles: l'itération sur un set a la même syntaxe que l'itération sur une list; cependant, comme les sets ne
sont pas ordonnés, vous ne pouvez pas faire d'hypothèses sur l'ordre dans lequel vous visitez les éléments
de l'ensemble
1.2.4 Tuples
Un tuple est une liste ordonnée (immuable) de valeurs. Un tuple est à bien des égards similaire à une liste;
l'une des différences les plus importantes est que les tuples peuvent être utilisés comme clés dans les
dictionnaires et comme éléments d'ensembles, contrairement aux listes. Voici un exemple trivial:
1.3 Functions
Les fonctions Python sont définies à l'aide du mot-clé def. Par exemple:
def sign(x):
if x > 0:
return 'positive'
elif x < 0:
return 'negative'
else:
return 'zero'
1.4 Classes
class Greeter(object):
# Constructor
def __init__(self, name):
self.name = name # Create an instance variable
# Instance method
def greet(self, loud=False):
if loud:
print('HELLO, %s!' % self.name.upper())
else:
print('Hello, %s' % self.name)
Numpy est la bibliothèque de base pour le calcul scientifique en Python. Il fournit un objet de tableau
multidimensionnel hautes performances et des outils pour travailler avec ces tableaux.
Pourquoi Numpy ?
En Python, nous avons des listes qui servent à des tableaux, mais elles sont lentes à traiter. NumPy vise à
fournir un objet tableau jusqu'à 50 fois plus rapide que les listes Python traditionnelles. L'objet tableau dans
NumPy s'appelle ndarray , il fournit de nombreuses fonctions de support qui facilitent le travail avec
ndarray . Les tableaux sont très fréquemment utilisés dans la science des données, où la vitesse et les
ressources sont très importantes.
NumPy est une bibliothèque Python et est écrite partiellement en Python, mais la plupart des parties qui
nécessitent un calcul rapide sont écrites en C ou C ++.
Les tableaux NumPy sont stockés à un endroit continu de la mémoire contrairement aux listes, de sorte que
les processus peuvent y accéder et les manipuler très efficacement. Ce comportement est appelé localité de
référence en informatique. C'est la raison principale pour laquelle NumPy est plus rapide que les listes. Il est
également optimisé pour fonctionner avec les dernières architectures CPU.
2.1 Arrays
Un array(tableau) numpy est une grille de valeurs, toutes du même type, et est indexée par un tuple
d'entiers non négatifs. Le nombre de dimensions est le rang du tableau; la forme d'un tableau est un tuple
d'entiers donnant la taille du tableau le long de chaque dimension.
Nous pouvons initialiser des tableaux numpy à partir de listes Python imbriquées et accéder aux éléments
en utilisant des crochets:
import numpy as np
import numpy as np
import numpy as np
Slicing: Semblable aux listes Python, les tableaux numpy peuvent être tranchés. Étant donné que les
tableaux peuvent être multidimensionnels, vous devez spécifier une tranche pour chaque dimension du
tableau:
import numpy as np
# Use slicing to pull out the subarray consisting of the first 2 rows
# and columns 1 and 2; b is the following array of shape (2, 2):
# [[2 3]
# [6 7]]
b = a[:2, 1:3]
Vous pouvez également mélanger l'indexation d'entiers avec l'indexation de tranches. Cependant, cela
donnera un tableau de rang inférieur au tableau d'origine
import numpy as np
# Two ways of accessing the data in the middle row of the array.
# Mixing integer indexing with slices yields an array of lower rank,
# while using only slices yields an array of the same rank as the
# original array:
row_r1 = a[1, :] # Rank 1 view of the second row of a
row_r2 = a[1:2, :] # Rank 2 view of the second row of a
print(row_r1, row_r1.shape) # Prints "[5 6 7 8] (4,)"
print(row_r2, row_r2.shape) # Prints "[[5 6 7 8]] (1, 4)"
Dans l'exemple précédent, row_r1 et col_r1 sont devenus des vecteurs (dim = 1)
Integer array indexing (Indexation de tableau d'entiers): lorsque vous indexez dans des tableaux numpy en
utilisant le découpage, la vue de tableau résultante sera toujours un sous-tableau du tableau d'origine. En
revanche, l'indexation de tableaux d'entiers vous permet de construire des tableaux arbitraires en utilisant
les données d'un autre tableau. Voici un exemple:
import numpy as np
# When using integer array indexing, you can reuse the same
# element from the source array:
print(a[[0, 0], [1, 1]]) # Prints "[2 2]"
Une astuce utile avec l'indexation de tableau d'entiers consiste à sélectionner ou à muter un élément de
chaque ligne d'une matrice:
import numpy as np
Boolean array indexing: vous permet de sélectionner des éléments arbitraires d'un tableau. Souvent, ce
type d'indexation est utilisé pour sélectionner les éléments d'un tableau qui satisfont à certaines conditions.
Voici un exemple:
import numpy as np
2.3 Datatypes
Chaque tableau numpy est une grille d'éléments du même type. Numpy fournit un grand ensemble de types
de données numériques que vous pouvez utiliser pour construire des tableaux. Numpy essaie de deviner un
type de données lorsque vous créez un tableau, mais les fonctions qui construisent des tableaux incluent
généralement également un argument facultatif pour spécifier explicitement le type de données. Voici un
exemple:
import numpy as np
Les fonctions mathématiques de base fonctionnent élément par élément sur les tableaux et sont
disponibles à la fois en tant que surcharges d'opérateur et en tant que fonctions dans le module numpy:
import numpy as np
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)
* est une multiplication élémentaire, pas une multiplication matricielle. Nous utilisons à la place la fonction
dot pour calculer les produits internes des vecteurs, pour multiplier un vecteur par une matrice et pour
multiplier les matrices. dot est disponible à la fois comme fonction dans le module numpy et comme
méthode d'instance d'objets de tableau:
import numpy as np
x = np.array([[1,2],[3,4]])
y = np.array([[5,6],[7,8]])
v = np.array([9,10])
w = np.array([11, 12])
Nous avons souvent besoin de remodeler ou de manipuler autrement les données dans les tableaux.
L'exemple le plus simple de ce type d'opération est la transposition d'une matrice; pour transposer une
matrice, utilisez simplement l'attribut T d'un objet tableau:
import numpy as np
x = np.array([[1,2], [3,4]])
print(x) # Prints "[[1 2]
# [3 4]]"
print(x.T) # Prints "[[1 3]
# [2 4]]"
Numpy fournit de nombreuses fonctions utiles pour effectuer des calculs sur des tableaux.
import numpy as np
x = np.array([[1,2],[3,4]])
de la même manière comme sum , vous trouvez les fonctions courantes prod , sqrt , sign ,
absolute , power , positive , maximum les fonctions trigonométriques ( sin , cos , etc),
les fonction d'arrondi ( around , floor ceil , trunc ), les fonctions exponentielles et logarithmes
( exp , log , log10 )
Exercice du cours: tester toutes les fonctions listées ci-dessus
2.6 Broadcasting
“
le mécanisme le plus important de Numpy
La diffusion(Broadcasting) est un mécanisme puissant qui permet à numpy de travailler avec des tableaux
de différentes formes lors de l'exécution d'opérations arithmétiques. Souvent, nous avons un tableau plus
petit et un tableau plus grand, et nous voulons utiliser le plus petit tableau plusieurs fois pour effectuer une
opération sur le plus grand tableau.
Par exemple, supposons que nous voulions ajouter un vecteur constant à chaque ligne d'une matrice. Nous
pourrions le faire comme ceci:
import numpy as np
# Add the vector v to each row of the matrix x with an explicit loop
for i in range(4):
y[i, :] = x[i, :] + v
Cela marche.
Toutefois, lorsque la matrice x est très grande, le calcul d'une boucle explicite en Python peut être lent.
Notez que l'ajout du vecteur v à chaque ligne de la matrice x équivaut à former une matrice vv en empilant
plusieurs copies de v verticalement, puis en effectuant une sommation élémentaire de x et vv. Nous
pourrions implémenter cette approche comme ceci:
import numpy as np
La diffusion de Numpy nous permet d'effectuer ce calcul sans créer réellement plusieurs copies de v.
Considérez cette version, en utilisant la diffusion:
import numpy as np
La ligne y = x + v fonctionne même si x a la forme (4, 3) et v a la forme (3,) en raison de la diffusion; cette
ligne fonctionne comme si v avait réellement la forme (4, 3), où chaque ligne était une copie de v, et la
somme était effectuée élément par élément.
import numpy as np
“
Attention! il faut éviter de faire des boucles sur les arrays(ou les matrix) de la classe Numpy,
contairement à une liste, car les fonctions définies sur Numpy sont déjà applicable élément par
élément. Essaie toujours de faire des calculs en tant que vecteur ou matrice en utilisant le mécanisme
de diffusion tant que c'est possible.