Python; cours accéléré

Il existe de nombreux langages de programmation (R, MATLAB, SAS, Java, C/C++, Julia …etc.), alors pourquoi Python est si populaire ces dernières années? Python est un langage de programmation de haut niveau et polyvalent qui est utilisé dans un large éventail de domaines. Sur le site de Python, nous retrouvons un bref résumé de ce langage.

Python is an interpreted, object-oriented, high-level programming language with dynamic semantics. Its high-level built in data structures, combined with dynamic typing and dynamic binding, make it very attractive for Rapid Application Development, as well as for use as a scripting or glue language to connect existing components together. Python’s simple, easy to learn syntax emphasizes readability and therefore reduces the cost of program maintenance. Python supports modules and packages, which encourages program modularity and code reuse. The Python interpreter and the extensive standard library are available in source or binary form without charge for all major platforms, and can be freely distributed.

Ceci décrit assez bien pourquoi il est devenu si populaire aujourd’hui. En effet, il est utilisé aussi bien par les programmeurs débutants que par les développeurs experts dans plusieurs domaines techniques, scientifique ou académique.

L’écosystème du python

Une caractéristique majeure de Python en tant qu’écosystème, par rapport au simple fait d’être un langage de programmation, est la disponibilité d’un grand nombre de librairies. Ces dernières doivent généralement être importés lorsque cela est nécessaire (par exemple, une bibliothèque pour les graphiques). Importer signifie mettre un paquet à la disposition de l’espace de noms actuel et du processus d’interprétation Python actuel, comme nous l’avons déjà vu en R dans le cours ACT3035.

Types de données de base

Dans cette section, nous allons passer en revue les types de données simples en Python. Ce sont quelques-uns des éléments de base essentiels pour le traitement de l’information en Python. Les types de données que nous apprendrons sont les nombres entiers, les nombres décimaux, le Booléen, les chaînes de caractères.

Il y a un dicton qui dit que

everything in Python is an object.

En effet, Python est un language de programmation orienté objet (OOP).

Integers

L’un des types de données les plus fondamentaux en Python est le nombre entier, ou int :

a=10
a
Copy to clipboard
10
Copy to clipboard
type(a)
Copy to clipboard
int
Copy to clipboard
a.bit_length()
Copy to clipboard
4
Copy to clipboard
googol = 10 ** 100
googol.bit_length()
Copy to clipboard
333
Copy to clipboard

Les opérations arithmétiques sur les nombres entiers sont également faciles:

1+5
Copy to clipboard
6
Copy to clipboard
1/4
Copy to clipboard
0.25
Copy to clipboard
type(1/4)
Copy to clipboard
float
Copy to clipboard

L’ajout d’un point à une valeur entière, comme dans 1. ou 1.0, fait que Python interprète l’objet comme une valeur décimale.

1.9/4
Copy to clipboard
0.475
Copy to clipboard
type(1.9/4)
Copy to clipboard
float
Copy to clipboard

Booleans

L’évaluation d’une comparaison ou d’une expression logique (telle que 4 > 3, 4.5 <= 3.25 ou (4 > 3) et (3 > 2)) donne un True ou un False comme résultat, deux mots-clés Python.

import keyword
keyword.kwlist
Copy to clipboard
['False',
 'None',
 'True',
 'and',
 'as',
 'assert',
 'async',
 'await',
 'break',
 'class',
 'continue',
 'def',
 'del',
 'elif',
 'else',
 'except',
 'finally',
 'for',
 'from',
 'global',
 'if',
 'import',
 'in',
 'is',
 'lambda',
 'nonlocal',
 'not',
 'or',
 'pass',
 'raise',
 'return',
 'try',
 'while',
 'with',
 'yield']
Copy to clipboard
4 >= 3
Copy to clipboard
True
Copy to clipboard
4 == 3
Copy to clipboard
False
Copy to clipboard
4 != 3
Copy to clipboard
True
Copy to clipboard
True and True
Copy to clipboard
True
Copy to clipboard
True and False
Copy to clipboard
False
Copy to clipboard
False and False
Copy to clipboard
False
Copy to clipboard
not True
Copy to clipboard
False
Copy to clipboard
(4 > 3) and (2 > 3)
Copy to clipboard
False
Copy to clipboard
(not (4 != 4)) and (2 == 3)
Copy to clipboard
False
Copy to clipboard
int(True)
Copy to clipboard
1
Copy to clipboard

Strings

cours="vous êtes dans le cours ACT6100"
Copy to clipboard
cours.capitalize()
Copy to clipboard
'Vous êtes dans le cours act6100'
Copy to clipboard

Conteneurs de données

Dans cette section, nous expliquerons les conteneurs de données, qui contiennent plusieurs points de données. Il convient toutefois de noter que ces conteneurs sont également des types de données. Python a quelques conteneurs communs : des variables, des listes et des dictionnaires.

Tuples

t=("ACT", 6, 100)
Copy to clipboard
type(t)
Copy to clipboard
tuple
Copy to clipboard
t="ACT", 6, 100
Copy to clipboard
type(t)
Copy to clipboard
tuple
Copy to clipboard
t[0]
Copy to clipboard
'ACT'
Copy to clipboard
t.count("ACT")
Copy to clipboard
1
Copy to clipboard
t.index(100)
Copy to clipboard
2
Copy to clipboard

Lists

l=["ACT", 6, 100]
Copy to clipboard
type(l)
Copy to clipboard
list
Copy to clipboard
list(t)
Copy to clipboard
['ACT', 6, 100]
Copy to clipboard
type(list(t))
Copy to clipboard
list
Copy to clipboard

Ajoutez l’objet de la liste à la fin.

l.append([4,3])
l
Copy to clipboard
['ACT', 6, 100, [4, 3]]
Copy to clipboard

Ajoutez des éléments de l’objet liste

import math
Copy to clipboard
l.extend([13.0, 3.14, math.pi])
Copy to clipboard
l
Copy to clipboard
['ACT', 6, 100, [4, 3], 13.0, 3.14, 3.141592653589793]
Copy to clipboard
l.insert(5, 'Tesla')
Copy to clipboard
l
Copy to clipboard
['ACT', 6, 100, [4, 3], 13.0, 'Tesla', 3.14, 3.141592653589793]
Copy to clipboard
l.remove("Tesla")
Copy to clipboard
l
Copy to clipboard
['ACT', 6, 100, [4, 3], 13.0, 3.14, 3.141592653589793]
Copy to clipboard
len(l)
Copy to clipboard
7
Copy to clipboard

Structure de contrôl

Ici nous intégrons un exemple sur les boucles for et les condition if. Une boucle est un moyen d’itération sur des objets Python, couramment utilisés avec des listes. Une boucle for loop indique : “Pour chaque chose de cette liste de choses, faites quelque chose”. Le premier mot utilisé après for est la variable qui va contenir chaque objet de la liste (ou autre objet itérable). Le code situé sous la boucle for utilise cette variable pour effectuer d’autres fonctions ou calculs sur l’objet.

for element in l[4:7]: 
    print(element ** 2)
Copy to clipboard
169.0
9.8596
9.869604401089358
Copy to clipboard
for i in range(1, 10) :
    if i % 2 == 0 :  
        print("%d est pair" % i)
    elif i % 3 == 0 :
        print("%d est un multiple de 3" % i)
    else :
        print("%d is impair" % i)
Copy to clipboard
1 is impair
2 est pair
3 est un multiple de 3
4 est pair
5 is impair
6 est pair
7 is impair
8 est pair
9 est un multiple de 3
Copy to clipboard

Les fonctions

Une fonction est un bloc de code organisé et réutilisable qui est utilisé pour effectuer une action quelconque. Les fonctions offrent une meilleure modularité qui peut être réutilisable dans votre code.

def pair(x):
    return x%2==0
Copy to clipboard
pair(3)
Copy to clipboard
False
Copy to clipboard
list(map(pair, range(10)))
Copy to clipboard
[True, False, True, False, True, False, True, False, True, False]
Copy to clipboard

Les fonctions peuvent également être utilisées pour filtrer un objet de la liste. Dans l’exemple suivant, le filtre renvoie les éléments d’un objet de liste qui correspondent à la condition booléenne telle que définie par la fonction pair :

list(filter(pair, range(15)))
Copy to clipboard
[0, 2, 4, 6, 8, 10, 12, 14]
Copy to clipboard

Dictionnaire

Les objets dict sont des dictionnaires, mais aussi des séquences mutables, qui permettent de récupérer des données par des clés (qui peuvent, par exemple, être des objets str). Ce sont ce qu’on appelle des “key-value stores”. Alors que les objets de liste sont ordonnés et triables, les objets dict sont en général non ordonnés et non triables.

d={
    "Nom" : "François Legault",
    "Voiture_mrq": "Honda",
    "Voiture_mdl": "Civic",
    "Profession":"Premier ministre",
    "Âge" : 64
}
Copy to clipboard
type(d)
Copy to clipboard
dict
Copy to clipboard
print(d['Nom'], d['Âge'])
Copy to clipboard
François Legault 64
Copy to clipboard
d.keys()
Copy to clipboard
dict_keys(['Nom', 'Voiture_mrq', 'Voiture_mdl', 'Profession', 'Âge'])
Copy to clipboard
d.values()
Copy to clipboard
dict_values(['François Legault', 'Honda', 'Civic', 'Premier ministre', 64])
Copy to clipboard
d.items()
Copy to clipboard
dict_items([('Nom', 'François Legault'), ('Voiture_mrq', 'Honda'), ('Voiture_mdl', 'Civic'), ('Profession', 'Premier ministre'), ('Âge', 64)])
Copy to clipboard
for item in d.items(): 
    print(item)
Copy to clipboard
('Nom', 'François Legault')
('Voiture_mrq', 'Honda')
('Voiture_mdl', 'Civic')
('Profession', 'Premier ministre')
('Âge', 64)
Copy to clipboard
d['Âge'] += 1
Copy to clipboard
for item in d.items(): 
    print(item)
Copy to clipboard
('Nom', 'François Legault')
('Voiture_mrq', 'Honda')
('Voiture_mdl', 'Civic')
('Profession', 'Premier ministre')
('Âge', 65)
Copy to clipboard

Numpy

numpy.ndarray est une classe construite dans le but spécifique de manipuler des tableaux de n-dimensions de manière pratique et efficace.

import numpy as np
Copy to clipboard
a = np.array([0, 1/2, 1, 3/2, 2])
Copy to clipboard
a.sum()
Copy to clipboard
5.0
Copy to clipboard
a.std()
Copy to clipboard
0.7071067811865476
Copy to clipboard
a.cumsum()
Copy to clipboard
array([0. , 0.5, 1.5, 3. , 5. ])
Copy to clipboard
a**2
Copy to clipboard
array([0.  , 0.25, 1.  , 2.25, 4.  ])
Copy to clipboard
2**a
Copy to clipboard
array([1.        , 1.41421356, 2.        , 2.82842712, 4.        ])
Copy to clipboard
np.exp(a)
Copy to clipboard
array([1.        , 1.64872127, 2.71828183, 4.48168907, 7.3890561 ])
Copy to clipboard
b = np.array([a, a * 2])
Copy to clipboard
b
Copy to clipboard
array([[0. , 0.5, 1. , 1.5, 2. ],
       [0. , 1. , 2. , 3. , 4. ]])
Copy to clipboard
b[0, 2]
Copy to clipboard
1.0
Copy to clipboard
b[:, 1]
Copy to clipboard
array([0.5, 1. ])
Copy to clipboard
b.sum()
Copy to clipboard
15.0
Copy to clipboard
b.sum(axis=0)
Copy to clipboard
array([0. , 1.5, 3. , 4.5, 6. ])
Copy to clipboard
b.sum(axis=1)
Copy to clipboard
array([ 5., 10.])
Copy to clipboard
g = np.arange(15)
Copy to clipboard
g.shape
Copy to clipboard
(15,)
Copy to clipboard
g.reshape((3, 5))
Copy to clipboard
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
Copy to clipboard
h = g.reshape((5, 3))
Copy to clipboard
h
Copy to clipboard
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]])
Copy to clipboard
h.T
Copy to clipboard
array([[ 0,  3,  6,  9, 12],
       [ 1,  4,  7, 10, 13],
       [ 2,  5,  8, 11, 14]])
Copy to clipboard
h.transpose()
Copy to clipboard
array([[ 0,  3,  6,  9, 12],
       [ 1,  4,  7, 10, 13],
       [ 2,  5,  8, 11, 14]])
Copy to clipboard

Pandas

Le DataFrame est une classe conçue pour traiter efficacement les données sous forme de tableaux, c’est-à-dire les données caractérisées par une organisation en colonnes. À cette fin, la classe DataFrame fournit, par exemple, un étiquetage des colonnes ainsi que des capacités d’indexation flexibles pour les lignes (opbservations) de l’ensemble de données, comme un tableau dans une base de données relationnelle ou une feuille de calcul Excel.

import pandas as pd
Copy to clipboard
pi=math.pi
Copy to clipboard
pi
Copy to clipboard
3.141592653589793
Copy to clipboard
df = pd.DataFrame([pi, pi/2, pi*2, pi**2],  
                  columns=['pi'],  
                  index=['a', 'b', 'c', 'd'])
Copy to clipboard
df
Copy to clipboard
pi
a 3.141593
b 1.570796
c 6.283185
d 9.869604
df.index
Copy to clipboard
Index(['a', 'b', 'c', 'd'], dtype='object')
Copy to clipboard
df.columns
Copy to clipboard
Index(['pi'], dtype='object')
Copy to clipboard
df.loc['c']
Copy to clipboard
pi    6.283185
Name: c, dtype: float64
Copy to clipboard
df.loc[['a', 'd']]
Copy to clipboard
pi
a 3.141593
d 9.869604
df.iloc[1:3]
Copy to clipboard
pi
b 1.570796
c 6.283185
df.sum()
Copy to clipboard
pi    20.865179
dtype: float64
Copy to clipboard
df.apply(lambda x: x ** 2)
Copy to clipboard
pi
a 9.869604
b 2.467401
c 39.478418
d 97.409091
df**2
Copy to clipboard
pi
a 9.869604
b 2.467401
c 39.478418
d 97.409091
df['floats'] = (1.5, 2.5, 3.5, 4.5)
df
Copy to clipboard
pi floats
a 3.141593 1.5
b 1.570796 2.5
c 6.283185 3.5
d 9.869604 4.5
df.describe() 
Copy to clipboard
pi floats
count 4.000000 4.000000
mean 5.216295 3.000000
std 3.669041 1.290994
min 1.570796 1.500000
25% 2.748894 2.250000
50% 4.712389 3.000000
75% 7.179790 3.750000
max 9.869604 4.500000
df.mean()
Copy to clipboard
pi        5.216295
floats    3.000000
dtype: float64
Copy to clipboard
df.mean(axis=0)
Copy to clipboard
pi        5.216295
floats    3.000000
dtype: float64
Copy to clipboard
df.mean(axis=1)
Copy to clipboard
a    2.320796
b    2.035398
c    4.891593
d    7.184802
dtype: float64
Copy to clipboard
df.cumsum()
Copy to clipboard
pi floats
a 3.141593 1.5
b 4.712389 4.0
c 10.995574 7.5
d 20.865179 12.0

Visualization

At their best, graphics are instruments for reasoning.
– Edward Tufte

La visualisation efficace des données est un aspect important de la science des données, pour au moins trois raisons distinctes :

  • Analyse exploratoire des données: Ici, on veut avoir un apperçu sur nos données..

  • Analyse des modèles et leur performance: Ici, on cherche à avoir un apperçu de notre modèle, on cherche à détecter les possibles erreurs.

  • La communication: Une fois nos modèles sont validés, on veut les communiquer et/ou les partager.

from pylab import plt, mpl  
plt.style.use('seaborn')  
mpl.rcParams['font.family'] = 'serif'  
%matplotlib inline
Copy to clipboard
df.cumsum().plot(figsize=(10, 6));
Copy to clipboard
../_images/Python_101_127_0.png
df.plot.bar(figsize=(10, 6)); 
Copy to clipboard
../_images/Python_101_128_0.png

Group et concat

Cette matière a déjà été vue dans le cours ACT3035 sous le chapitre dplyr de R. C’est exactement la même chose!

Vecteurs et Matrices

De manière abstraite, les vecteurs sont des objets qui peuvent être additionnés ensemble (pour former de nouveaux vecteurs) et qui peuvent être multipliés par des scalaires (c’est-à-dire des nombres), également pour former de nouveaux vecteurs.

Concrètement (pour nous), les vecteurs sont des points dans un espace à dimension finie. Même si vous ne considérez pas vos données comme des vecteurs, elles constituent un bon moyen de représenter des données numériques.

Par exemple, si vous avez la taille, le poids et l’âge d’un grand nombre de personnes, vous pouvez traiter vos données comme des vecteurs tridimensionnels (taille, poids, âge). Si l’on a quatre examens dans le cours ACT6100 à faire, vous pouvez traiter les notes d’étudiants comme des vecteurs quadridimensionnels (examen1, examen2, examen3, examen4). L’approche la plus simple consiste à représenter les vecteurs sous forme de listes de nombres.

Calculons 2I+3AAB for $A=[1317]B=[5212]oùI$ est une matrice identité de taille 2 :

import numpy as np
import scipy.linalg as la
Copy to clipboard
A = np.array([[1,3],[-1,7]])
print(A)
Copy to clipboard
[[ 1  3]
 [-1  7]]
Copy to clipboard
B = np.array([[5,2],[1,2]])
print(B)
Copy to clipboard
[[5 2]
 [1 2]]
Copy to clipboard
I = np.eye(2)
print(I)
Copy to clipboard
[[1. 0.]
 [0. 1.]]
Copy to clipboard
2*I + 3*A - A@B
Copy to clipboard
array([[-3.,  1.],
       [-5., 11.]])
Copy to clipboard

multiplication matrice

Il n’y a pas de symbole pour les puissances matricielles et nous devons donc importer la fonction matrix_power:

from numpy.linalg import matrix_power as mpow
Copy to clipboard
M = np.array([[3,4],[-1,5]])
print(M)
Copy to clipboard
[[ 3  4]
 [-1  5]]
Copy to clipboard
mpow(M,2)
Copy to clipboard
array([[ 5, 32],
       [-8, 21]])
Copy to clipboard
mpow(M,5)
Copy to clipboard
array([[-1525,  3236],
       [ -809,    93]])
Copy to clipboard
M @ M @ M @ M @ M
Copy to clipboard
array([[-1525,  3236],
       [ -809,    93]])
Copy to clipboard

Transpose

print(M)
Copy to clipboard
[[ 3  4]
 [-1  5]]
Copy to clipboard
print(M.T)
Copy to clipboard
[[ 3 -1]
 [ 4  5]]
Copy to clipboard

Remarquez que MMT est une matrice symétrique :

M @ M.T
Copy to clipboard
array([[25, 17],
       [17, 26]])
Copy to clipboard

Inverse

print(A)
Copy to clipboard
[[ 1  3]
 [-1  7]]
Copy to clipboard
la.inv(A)
Copy to clipboard
array([[ 0.7, -0.3],
       [ 0.1,  0.1]])
Copy to clipboard

A linear system of equations is a collection of linear equations

a0,0x0+a0,1x2++a0,nxn=b0a1,0x0+a1,1x2++a1,nxn=b1am,0x0+am,1x2++am,nxn=bm

In matrix notation, a linear system is Ax=b where

A=[a0,0a0,1a0,na1,0a1,1a1,nam,0am,1am,n],x=[x0x1xn],b=[b0b1bm]
N = 1000
A = np.random.rand(N,N)
b = np.random.rand(N,1)
Copy to clipboard
# Regardons les premières observations
A[:4,:3]
Copy to clipboard
array([[0.91430299, 0.77985506, 0.49013321],
       [0.49253285, 0.92236314, 0.34642134],
       [0.00162082, 0.05763338, 0.46917428],
       [0.96175421, 0.66257052, 0.27640879]])
Copy to clipboard
b[:4,:]
Copy to clipboard
array([[0.39189543],
       [0.33885905],
       [0.34093499],
       [0.40880476]])
Copy to clipboard
x = la.solve(A,b)
Copy to clipboard
x[:4,:]
Copy to clipboard
array([[ 3.07023193],
       [-1.13442351],
       [ 0.55661619],
       [ 3.32424416]])
Copy to clipboard