Initiation Python
Initiation Python
Wilson Toussile
Introduction
Avantages
Anaconda : distribution la plus répandue, cross-plateform, Elle inclue plus de 100 librairies pré-installées
et en propose 600 de plus en téléchargement.
WinPython : distribution Python qui est entièrement libre mais spécifique à Windows.
Python Anywhere : offre un environnement Python hébergé en ligne et donc accessible de toute part.
Python (x,y) : offre un environnement de développement libre pour le calcul scientifique, basé sur Python
Qt et Spyder
Enthought Canopy : propose une distribution Python et un environnement d'analyse intégré (un peu
comme MatLab).
Démarrer Python
python # ou python3
ipython # on ipython3
print("Hello world)
print("Bonjour Mr/Mme {}".format("Jacques"))
x = 9
print("La valeur de {} = {}.format("x", x))
Les nombres
Quelques conteneurs
In [5]: import IPython.core.display as di # Pour formater les sorties
Exemples de listes
Le contenu de list1 = [1, 7, 'X', 3, [0, 2]]
La longueur de list1 = 5
L'élément d'indice 0 de list1 est 1
Exemples d'ensembles
Le contenu de set1 = {'c', 9, 2, 6, 7}. Remarquer qu'il n'y a pas de doublo
ns.
Exemple de Tuple
Le contenu de t1 = (8, 5, 60, [0, 1], 8) et sa longueur = 5. Le nombre de 8
= 2
Exemple de Dictionnaire
Le contenu de d1 = {'d': [3, 7, 'x'], 'b': 8, 'c': 5, 'a': 0} et sa longueu
r = 4. L'élement 'd'= [3, 7, 'x']
Exercice d'application
1. Créer une liste a contenant les entiers naturels pairs $\leq 100$. Indication : Utiliser la fonction range .
2. Créer une liste b contenant les racines carrées des éléments de a .
# Première question
a = [i for i in range(0, 101, 2)]
print("a = {}".format(a))
# Deuxième question
import math
b = [math.sqrt(i) for i in a]
print("b = {}".format(b))
1. Pour afficher les attributs et les méthodes d'un objet x , on exécute dir(x) .
2. Pour lire l'aide d'une méthode meth de x , on exécute help(x.meth) .
3. Pour appliquer une méthode meth de x , on exécute x.meth(...) où ... représente les
arguments.
4. L'accès à un attribut att de x se fait par x.att .
# Longueur de c
print("c est une liste de {} d'éléments".format(len(c)))
# Code 1
a = 3
b = 2
if a < b:
print("a = {} est strictement inférieur à b = {}".format(a, b))
elif a > b:
print("b = {} est strictement inférieur à a = {}".format(b, a))
else:
print("a = {} est égal à b = {}".format(a, b))
# Code 2
statement1 = a < b
statement2 = a > b
if statement1: # On peut ne pas écrire "is True"
print("a est strictement inférieur à b")
elif statement2:
print("b est strictement inférieur à a")
else:
print("b est égal à a")
Même question :
statement1 = False
statement2 = False
if statement1:
print("statement1 is True")
elif statement2:
print("statement2 is True")
else: print("statement1 and statement2 are False")
Boucles
Exemple 1 de boucle for :
for x in range(4):
print("x = {}".format(x))
Exemple de while :
i = 0
while i < 5:
print("i = {}".format(i))
i = i + 1
print("Fin de la bouble avec i = {}".format(i))
Fonctions python
Une fonction est une suite d'instructions que l'on peut appeler avec un nom.
Bref:
-----
Écrire "Hello word !"
Sortie:
-------
Aucune sortie
'''
print("Hello word !")
return
Exécution :
hello_word()
Conseils :
1. Utiliser un éditeur approprié pour écrire les fonctions dans des fichiers que l'on peut importer par la
commande
import mon_fichier
2. Noter que lorsqu'un module a déjà été importer, la commande précédente n'a aucun effet. Si vous
modifiez votre fichier et souhaite importer à nouveau, il tout d'abord supprimer le module par
del(mon_fichier)
help(hello_word)
Ma première fonction avec argument
Arguments:
----------
nom : le nom de celui à qui dire bonjour. La valeur par défaut est "".
Sortie:
-------
Aucune sortie.
'''
if len(nom) == 0:
nom = "Mme ou Mr"
print("Bonjour {}!".format(nom))
return
bonjour()
bonjour("Toussile")
def parametres(*param):
'''
Les paramètres sont renseignés séparés par des virgules.
'''
for idx, x in enumerate(param):
print("param[{}] = {}".format(idx, x))
return
Exemple :
print(ma_fiche("Jean", "Pierre"))
param['b'] = 2
param['c'] = 3
param['a'] = 1
In [12]: import numpy as np
def my_norm(**args):
if len(args) == 0:
return(np.random.normal(loc = 0, scale = 1, size = 1))
if len(args) == 1:
return(np.random.normal(loc = args["mu"], scale = 1, size = 1))
if len(args) == 2:
return(np.random.normal(loc = args["mu"], scale = args["std"], size
= 1))
if len(args) == 3:
return(np.random.normal(loc = args["mu"], scale = args["std"], size
= args["n"]))
else:
print("Invalide argument!")
return
In [15]: my_norm(std = 1, n = 5, mu = 0)
Une variable déclarée à la racine d'un module est visible dans tout ce module. On parle alors de variable
globale au module.
Une variable déclarée dans une fonction ne sera visible que dans cette fonction. On parle alors de
variable locale.
Les listes se comportent différemment : une liste en argument d'une fonction se comporte comme une
référence.
In [13]: x = 2
def ajouter_x_a(a):
x = a
print("Valeur locale de x = {}.".format(x))
return(a)
ajouter_x_a(5)
print("Valeur globale de x = {}.".format(x))
Valeur locale de x = 5.
Valeur globale de x = 2.
Les classes
La notion de classe va en quelque sorte permettre de généraliser la notion de type afin de créer de
nouvelles structures de données.
Une classe définit des attributs et des méthodes.
Un objet est une instance d'une classe.
Exemple
class Point:
'''
Classe Point
============
Point géométrique dans le plan muni d'un repère orthonormé.
'''
Les attributs sont publiques (on peut les rendre privés par le biais des properties).
Exemple de classe (Suite)
class Point:
'''
Point géométrique dans le plan muni d'un repère orthonormé.
'''
def __init__(self, x = 0, y = 0):
'''
Construteur
'''
self.x = x
self.y = y
return
def __str__(self):
'''
Une méthode utilisée par la fonction 'print'
'''
return("A.x = " + str(self.x) + ", A.y = " + str(self.y))
class Point:
'''
Point géométrique dans le plan muni d'un repère orthonormé.
'''
def __init__(self, x = 0, y = 0):
'''
Construteur
'''
self.__x = x
self.y = y
return
def __str__(self):
'''
Une méthode utilisée par la fonction 'print'
'''
return("A.__x = " + str(self.__x) + ", A.y = " + str(self.y))
B = Point(1, 2) # Instanciation
B.deplacer(3, 5.5) # deplacer le point à l'aide de la méthode 'deplacer'
print(B.__x) # N'est plus publique
print(B.y) # Est toujours publique
Les properties pour encapsuler des attributs
class Point:
'''
Point géométrique dans le plan muni d'un repère orthonormé.
'''
def __init__(self, x = 0, y = 0):
'''
Construteur
'''
self.__x = x
self.y = y
return
@property
def x(self):
return(self.__x) # Get self.__x
@x.setter
def x(self, x): # Set self.__x
self.__x = x
return
def __str__(self):
'''
Une méthode utilisée par la fonction 'print'
'''
return("__x = " + str(self.__x) + ", y = " + str(self.y))
A = Point(1,2)
print(A.x) # Afficher l'attribut __x
A.x = 10 # Modifier l'attribut __x
Les modules et les packages en python
Nous avons réussi jusqu'à présent à créer des petits morceaux de code sans grand intérêt car très peu
ambitieux. Le problème de l'interpréteur c'est qu'une fois celui-ci fermé votre travail est perdu.
L'idée d'un programme c'est d'enregistrer votre travail dans un fichier et ensuite de l'exécuter. Cela
augmente votre productivité mais possède de nombreux avantages comme le copier-coller massif ou tout
simplement le travail collaboratif.
Lorsque du code est enregistré dans un fichier exécutable on parle de script.
#!/usr/bin/python3.5
#-*- coding: utf-8 -*-
print("Bonjour Mr ou Mme")
python /chemin_vers_votre_script/fiche.py
Pour les projets les plus ambitieux il sera vite important d'organiser son travail.
Les fonctions vont se multiplier et il faudra les enregistrer dans des fichiers distincts pour plus de
flexibilité.
Créons un autre fichier que nous nommons 'fonctions.py' dans le même dossier que le fichier 'fiche.py'
Créons un autre fichier que nous nommons 'fonctions.py' dans le même dossier que le fichier 'fiche.py'
#!/usr/bin/python3.5
#-*- coding: utf-8 -*-
def dire_bonjour(nom):
'''
Donner votre nom et je vous gentillement bonjour.
'''
print("Bonjour Mr ou Mme {}!".format(nom))
return
Créer un package
1. Créer un dossier portant le nom de votre package. Dans notre exemple, nous le nommerons
"monPackage". Faites le par exemple dans le même dossier que celui contenant les fichiers précédents.
2. Dans ce dossier, créer fichier fichier nommé 'init.py', cela indique à python qu'il s'agit d'un package. Ce
fichier peut être vide, seule sa présence est importante.
3. Créer un "module" nommé 'operations.py' dans le dossier 'monPackage'.
4. Éditer le fichier 'operations.py' et ajouter :
Créer un package (suite)
#!/usr/bin/python3.5
#-*- coding: utf-8 -*-
import monPackage
from monPackage.operations import addition
La bibliothèque NumPy (http://www.numpy.org/) permet d’effectuer des calculs numériques avec Python. Elle
introduit une gestion facilitée des tableaux de nombres.
import numpy as np
Les bases
#Tableau de dimension 2
b = np.array([[1, 2, 3], [4, 5, 6]])
print("b = {} ; dim(b) = {}".format(b, b.shape))
pi = 3.141592653589793.
Contenu de a = [ 0 3 4 6 8 10]. type(a) = <class 'numpy.ndarray'>. Les
dimensions de a = (6,)
Changer de dimension en (3,2):
a = [[ 0 3]
[ 4 6]
[ 8 10]]
b = [[1 2 3]
[4 5 6]] ; dim(b) = (2, 3)
Attention à l'affection!
x = [0 1 2 3 4 5 6 7 8 9]
y = [0 1 2 3 4 5 6 7 8 9]
Nouveau y = [0 0 0 0 0 5 6 7 8 9]
Nouveau x = [0 0 0 0 0 5 6 7 8 9]
Copier un tableau
Nouveau x = [1 1 1 1 1 1 1 1 1 1]
z = [0 0 0 0 0 5 6 7 8 9]
In [20]: di.display_html("<h5>Produit matriciel</h5>", raw = True)
M = np.matrix([[1,2], [3,4]])
b = np.matrix(np.arange(0,2).reshape(2, 1))
print("M*b = {}".format(M*b))
print("M.dot(b) = {}".format(M.dot(b)))
Produit matriciel
M*b = [[2]
[4]]
M.dot(b) = [[2]
[4]]
Autres opérations
import numpy as np
from numpy import linagl # Module pour l'Algèbre linéaire
linalg.det(M) # Déterminent de M
linalg.trace(M) # Trace de M
M.transpose() # Transposée de M
linalg.inv(M) # Inverse de M
linalg.eig(M) # Valeurs propres et vecteurs propres
linalg.solve(M,b) # Résolution du système linéaire MX = b
Package matplotlib (https://matplotlib.org/index.html)
Introduction
- Via des appels de fonctions, avec pyplot : plus simple. pyplot fournit ain
si des raccourcis qui évitent la formulation objet plus longue à écrire.
Permet de faire des graphes qui peuvent être comlètement adaptés si besoin. Sur une figure, on peut
tracer plusieurs graphes.
permet aussi de dessiner.
matplotlib rend ainsi possible la création de graphes à l'intérieur d'applications complexes autorisées par
le langage python, et ceci sans quitter le langage python.
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(np.arange(0, 81, 10))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))
plt.show()
My first barplot
In [23]: di.display_html("<h5>My first pie</h5>", raw = True)
labels = ['Frogs', 'Hogs', 'Dogs', 'Logs']
fracs = [15, 30, 45, 10]
My first pie
x = np.linspace(-5, 5, 100)
plt.subplot(212)
plt.plot(x, np.cos(x), color = "red", linewidth = 2, label = "cos")
plt.legend()
plt.show()
In [25]: import random # Package pour simuler selon certaines loi de probabilité
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure(figsize=(19,6))
ax = fig.add_subplot(1, 2, 2, projection='3d')
p = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewid
th=0, antialiased=False)
cb = fig.colorbar(p, shrink=0.75)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
Un autre package pour les graphiques : Seaborn
(https://seaborn.pydata.org/)
Seaborn est une bibliothèque pour créer des graphiques statistiques attrayants et informatifs en Python.
Il est construit au-dessus de matplotlib (https://matplotlib.org/) et étroitement intégré avec la pile PyData
(https://pydata.org/downloads.html), y compris le support des structures de données NumPy
(http://www.numpy.org/) et pandas (https://pandas.pydata.org/) et des routines statistiques de scipy
(https://www.scipy.org/) et statsmodels (http://www.statsmodels.org/stable/index.html).
Plusieurs thèmes intégrés pour le stylisme des graphiques matplotlib
Des outils pour choisir des palettes de couleurs
Des fonctions de visualisation de distributions univariées et bivariées ou de comparaison entre sous-
ensembles de données
Des outils pour adapter et visualiser les modèles de régression linéaire pour différents types de variables
indépendantes et dépendantes
Des fonctions qui visualisent des matrices de données et utilisent des algorithmes de clustering pour
découvrir la structure de ces matrices
Une fonction pour les graphiques des séries chronologiques avec une estimation flexible et une
représentation de l'incertitude autour de l'estimation
Des abstractions de haut niveau pour structurer des grilles de tracés qui vous permettent de construire
facilement des visualisations complexes.
Boxplot et Violinplot
sns.violinplot(data=data)
sns.despine(offset=10, trim=True)
plt.show()
PairPlot
In [48]: sns.set(style="ticks")
A fast and efficient DataFrame object for data manipulation with integrated indexing;
Tools for reading and writing data between in-memory data structures and different formats: CSV and text
files, Microsoft Excel, SQL databases, and the fast HDF5 format;
Intelligent data alignment and integrated handling of missing data: gain automatic label-based alignment
in computations and easily manipulate messy data into an orderly form;
Flexible reshaping and pivoting of data sets;
Time series-functionality: date range generation and frequency conversion, moving window statistics,
moving window linear regressions, date shifting and lagging. Even create domain-specific time offsets and
join time series without losing data;
Intelligent label-based slicing, fancy indexing, and subsetting of large data sets;
Python with pandas is in use in a wide variety of academic and commercial domains, including Finance,
Neuroscience, Economics, Statistics, Advertising, Web Analytics, and more.
...
Structures de données
Structure de
Dimension Description
données
First operations
import pandas as pd
Séries temporelles
In [50]: ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', period
s=1000))
plt.figure(figsize=(10, 6))
ts.plot(color = "coral")
plt.show()
<matplotlib.figure.Figure at 0x7fb3ece31588>
Module Scikit-Learn (http://scikit-
learn.org/stable/index.html)
boston = datasets.load_boston()
X = pd.DataFrame(boston.data, columns = boston.feature_names)
y = np.array(boston.target)
lm = linear_model.LinearRegression()
predicted = cross_val_predict(lm, boston.data, y, cv=10)# Par validation cro
isée 10-folds
R2 = lm.fit(X, y).score(X, y) # Sur toutes les données
def f(x):
return(2*np.log(2*x))
n = 200
X = np.array([np.random.uniform(1, 30) for i in range(n)])
y = f(X) + np.random.normal(0, 0.25, n)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.4)
idx_best = accuracy_test.argmin()
In [54]: xx = np.arange(1, 30, 0.1)
yy = regressors[idx_best].predict(np.c_[xx])
plt.show()
plt.close()
iris = datasets.load_iris()
tab = pd.DataFrame(iris.data, columns = iris.feature_names)
tab["species"] = iris.target
iris = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,
test_size = 0.3)
Classifier Accuracy
LDA 1.0
QDA 1.0
10-nn 0.933333333333
Tree 0.911111111111
plt.figure(figsize=(10,10))
f, axes = plt.subplots(10, 10)
for i, ax in enumerate(axes.reshape(100)):
ax.imshow(images[idx[i]])
ax.axis('off')
plt.show()
plt.close()
<matplotlib.figure.Figure at 0x7fb3f45ee940>
In [34]: from sklearn.decomposition import PCA
from sklearn.preprocessing import scale # Pour centrer et réduire
import seaborn as sns
#np.random.seed(42)
data = scale(digits.data)
pca = PCA(n_components=2); pca.fit(data)
data_pca = pca.fit_transform(data)
groups = data_pd.groupby('digits')
# Plot
plt.figure(figsize=(10, 10))
for name, group in groups:
plt.plot(group.pca1, group.pca2, marker='o', linestyle='', ms=12, label=
name)
plt.legend(loc = "best")
plt.show()
Classification non-supervisée (clustering)
Reprenons les données 'digits' et considérons les deux axes prinipaux de l'ACP précédente.
Nous appliquons l'algorithme Kmeans.
# Plot the decision boundary. For that, we will assign a color to each
x_min, x_max = data_pca[:, 0].min() - 1, data_pca[:, 0].max() + 1
y_min, y_max = data_pca[:, 1].min() - 1, data_pca[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# Obtain labels for each point in mesh. Use last trained model.
Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])