Vous êtes sur la page 1sur 163

Python

In i ti ati on

Les modules scientifiques


de Python

Tristan Colombo
Objectifs
Développer des applications effectuant :
- des calculs scientifiques
- des affichages de données sous forme de
diagrammes ou de graphiques.

Pré-requis :
- Savoir développer en Python
- Connaissances mathématiques
http://www.xkcd.com/353
Linux Pratique HS n°23
Février/Mars 2012
«  Préfère  : la beauté à la laideur,
l’explicite à l’implicite,
le simple au complexe
et le complexe au compliqué, (...) »

PEP 20 Le zen de Python


Python 2.7.3 Python 3.2.3
Modifications majeures
Cer
tain
e sa

l io r
atio
n s

Support / Maintenance
= initialement 2 ans
Duck Typing
Les Nombres Les Flottants

Quel est le résultat de : ((0.7 + 0.1) x 10) ???

8 7.99999999
Les Nombres Les Flottants
En machine : n = (-1)s x m x be
s : signe du nombre (0 : nombre positif, 1 : nombre
négatif
m : mantisse – nombre « définissant » le réel.
Ex : 12.5 = 1.25 x 101, 1.25 est la mantisse
b : la base (en machine b=2).
e : l'exposant (variation de la position de la virgule)

0.7 en machine :
0 011111110 01100110011001100110011

Conversion : 0.699999988079...
la représentation machine est un arrondi !

Idem pour 0.1 : 0.10000000149

0.7 + 0.1 = 0.799999989569


Les Nombres Les Flottants

Voir support « Aller plus loin »


Les Nombres Les Flottants

Solution : le module decimal

>>> from decimal import *


>>> ((Decimal('0.7') + Decimal('0.1')) * 10)
Les Nombres Les Flottants

Solution : le module decimal

C
Fonctions
Les fonctions originales
Définir une fonction :
def nom_fonction():
Exemple :
def affiche_hello():
print("hello")
Définir une fonction avec des paramètres :
def nom_fonction(param_1, ..., param_n):
Exemple :
def somme(a, b):
return a+b
return pour renvoyer une valeur (absence = None)
Fonctions
Les fonctions originales
Paramètres par défaut
Uniquement sur les derniers paramètres
def nom_fonction(a, b, c=2, d=3):
...

Ordre des paramètres :


Indiquer le nom des paramètres lors de l'appel
def premier(a, b):
return a

premier(b=5, a=2) -> 2


Fonctions
Les fonctions originales

Nombre de paramètres non fixé


*parametre : tuple de paramètres
**parametre : dictionnaire de paramètres
Fonctions
Les fonctions originales
Paramètres passés par REFERENCE
Certains types sont non-modifiables (int, string, etc.)

Exemples :
def exemple(a): def exemple2(liste, elt):
a=a+1 liste.append(elt)
a=1 liste=[ ]
exemple(a) exemple2(liste, 3)
=> a vaut toujours 1 => liste vaut [3]
Fonctions
Les fonctions originales

Variables locales / globales


Toute variable définie dans un bloc -> locale
Mot-clé global pour modifier
Fonctions
Création d'un module
Création d'un module
Fichier python contenant des fonctions
Import par from module import *

Exemple (fichier lib.py) :


def somme(a, b): from lib
return a+b import *
somme(2, 3)
def mult(a, b):
return a*b
...
Fonctions
Création d'un module

Effectuer une action quand appel direct


if __name__ == "__main__":
...
Fonctions
Structure d'un programme

# -*- coding:utf-8 -*-


from ... import ...
def fonction():
"documentation fonction"
...
# Programme principal
...
Quels outils ?
Python
Installation basique (Linux, Mac, Windows)

- Ajout de modules par :


- easyinstall (de setuptools)
- pip
- distribution (ex : aptitude install python-sphinx)

- Éditeur à déterminer (pycharm, spyder, vim, etc.)


Python
Principe général d'installation des modules
- Debian-like
sudo aptitude install python-<module>
- Depuis les sources
wget http://adresse/module.tar.gz
tar -zxvf module.tar.gz
cd module
python setup.py build; sudo python setup.py install
cd .. ; rm -R module
- Ou pip/easy_install :
sudo pip install -U <module>
sudo easy_install -U <module>
PythonXY
Distribution Python orientée développement
Scientifique (Windows)
http://code.google.com/p/pythonxy/

- Modules scientifiques pré-installés

- Éditeur Spyder
Spyder
Environnement de Développement Intégré
- objectif : remplacer Matlab
Enthought
Enthought Python Distribution

Distribution Python orientée développement


Scientifique (Linux, Solaris, Mac, Windows)
http://www.enthought.com/products/epd.php

- Modules scientifiques pré-installés

- Éditeur à déterminer
Numpy Scipy Matplotlib
Partie 1
m py
Nu
Math
Module standard
Pas d'installation

Traitement des réels : math

Traitement des complexes : cmath

Utilisation
import math ou import cmath
Fonctions classiques
Math
cos(x), sin(x), tan(x), asin(x), acos(x), atan(x),
hypot(x, y) = sqrt(x**2 + y**2)

log(x, base), pow(x, y),


exp(x) = e**x, sqrt(x)

degrees(x), radians(x) => conversions

Constantes
pi = 3.14159...
e = 2.71828...
Valeurs particulières
Math
En cas de dépassement mémoire
inf : Infini (mécanisme de protection)
OverflowError : Erreur de débordement
nan : N'est pas un nombre (calcul impossible)

Tests sur ces valeurs :


isinf() et isnan() pour inf et nan
Pour OverflowError :
try:
...
except OverflowError:
...
Atelier 1 math
du le
mo
Le
Le module math

Dans un interpréteur interactif, testez :

>>> x = 10 ** 200 >>> import math


>>> y = 10.0 ** 200 >>> math.isnan(t/t)
>>> x**2 >>> math.isinf(y*y)
>>> y**2 >>> math.isinf(x)
>>> y*y >>> try:
>>> t = y*y ... u = y**2
>>> t/t ... except OverflowError:
>>> isnan(t/t) ... print 'Erreur : overflow...'
...
Atelier 2 math
du le
mo
Le
Le module math

Utilisation du module math


Écrire une fonction qui renvoie une liste de n
valeurs de cos(x) entre 0 et pi (0, pi/(n-1), ..., pi)

[math.cos(x) for x in range(0, math.pi, math.pi/n)] ???


Les boucles
Random
Générateur de nombres pseudo-aléatoires

random() : flottant (0 <= n < 1)


seed(a) : initialisation du générateur (obtention de
séquences identiques pour des tests)
randint(a, b) : entier (a <= n <= b)
randrange(debut, fin, pas) : une valeur dans
l'intervalle [debut, fin[ en suivant le pas
Atelier 3random
d ule
e mo
L
Le module random

Dans un interpréteur interactif, testez :

>>> import random >>> random.seed(1)


>>> def r(): >>> r()
... for i in range(10): >>> random.seed(1)
... print random.random() >>> r()
... >>> random.randint(1, 5)
>>> r() >>> random.randrange(0, 11, 2)
>>> r()
Numpy
Bibliothèque de base pour le calcul scientifique

Calcul matriciel

Fonctionne avec Python 3.X depuis Numpy 1.5.0

Installation
Paquetage python-numpy ou python3-numpy
Source
http://sourceforge.net/projects/numpy/files/
NumPy/
Numpy
Introduit deux nouveaux types de données
- Tableaux
Opérations simultanées sur l'ensemble des
données

Traitement plus rapide que Python pur

Exemple
import numpy

a = numpy.array([1, 2, 4, 8, 16])
a**2
>> array([1, 4, 16, 64, 256])
Numpy
Quelques tableaux particuliers :
taille donnée sous forme de tuple (lignes,
colonnes) ou simple entier pour colonnes
zeros(taille)
ones(taille)
empty(taille) Exemples
identity(taille) x = numpy.ones((2, 3))
>> array([[ 1., 1., 1.],
[ 1., 1., 1.]])
x = numpy.identity(2)
>> array([[ 1., 0],
[ 0, 1.])
Numpy
Accès aux éléments comme dans une
liste (accès plus rapide)

Exemple
x = numpy.array([[1, 2, 3], [4, 5, 6]])
>> x[0][1]
2
>> x[0,1]
2
Numpy
Modification des éléments comme dans une
liste + accès direct colonnes et lignes

Exemples
x = numpy.array([[1, 2, 3], [4, 5, 6]])
>> x[0,1] = 10 # Sélection de l'élément (0,1)
>> x[0] = 0 # Sélection de la première ligne
array([[0, 0, 0],
[4, 5, 6]])
>> x[:,0] = 8 # Sélection de la première colonne
array([[8, 2, 3],
[8, 5, 6]])
Atelier 4ion
u l a t
a n i p x
M l ea u
e t a b
d
Manipulation de tableaux

En une opération, transformez le tableau A en B :

1234 13
A=5 6 7 8 B=5 7
4321 42

Solution :
A = numpy.array([[1, 2, 3, 4], [5, 6, 7, 8], [4, 3, 2, 1]])
B = A[ :,::2]
Numpy
Connaître la taille d'un tableau : shape
x = numpy.array([[1, 2, 3], [4, 5, 6]])
x.shape
>>> (2, 3)

Opérations élémentaires disponibles : +, -, *, /


a = numpy.array([[1, 2, 3], [4, 5, 6]])
b = numpy.ones((2, 3))
a+b
>>> array([[ 2., 3., 4.],
[ 5., 6., 7.]])
Numpy
- Matrices
Traitement matriciel des données
Différences minimes
Matrices/Tableaux

Exemple
import numpy

a = numpy.matrix('1, 2 ; 3, 4')


b = numpy.matrix('5, 6 ; 7, 8')
a+b
>> matrix([[6, 8], [10, 12]])
Numpy
Opérations communes tableaux/matrices :
- transposée : a.T
- produit : numpy.dot(a, b)
Si a et b de type matrix alors a * b possible
- inverse : numpy.linalg.inv(a)
Si a de type matrix alors a.I possible
- déterminant : numpy.linalg.det(a)
- somme des éléments : numpy.sum(a)
Numpy
- diagonale : numpy.diag(a, k=num_diag)
x = numpy.arange(9).reshape((3, 3))
=> array([0, 1, 2], [3, 4, 5], [6, 7, 8]])
numpy.diag(x) => array([0, 4, 8])
numpy.diag(x, k=1) => array([1, 5])
numpy.diag(x, k=-1) => array([3, 7])

- transformer une matrice en tableau et


inversement :
numpy.asarray(a)
numpy.asmatrix(a)
Atelier 5ion
u l a t
a n i p es
M a tri c
de m
Manipulation de matrices

Résoudre (méthode de Cramer) :

3x – 2y + 4z = -7
5x + 7y – 3z = 16
x+ y– z=6

Rappel : A.X = K
A matrice des coefficients
K matrice des constantes
A => A où la kième colonne est remplacée par K
Solution : x = det(A ) / det(A)
Les boucles
Numpy
Vectorisation des opérations :
Boucles implicites sur tableaux :
>>>a = numpy.arange(0, numpy.pi, numpy.pi/8).reshape((2,4))
>>> numpy.cos(a)

Même fonctionnement sur les matrices


Numpy
Découpage de matrices :
- slicing
- hsplit(a, parts) : liste de matrices colonnes
- vsplit(a, parts) : liste de matrices lignes

Exemple :
>>> a = numpy.matrix([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
>>> numpy.vsplit(a, 2)
[matrix([[0, 1, 2],
[3, 4, 5]]), matrix([[ 6, 7, 8],
[ 9, 10, 11]])]
Numpy
Types de données spécifiques dans un tableau:
- Paramètre dtype lors de la création

Étapes :
- Créer un objet dtype :
dt = numpy.dtype([('nom', 'S5'), ('age', 'i')])

- Créer la matrice :
a = numpy.matrix([('Richard', 4), ('Linus', 5)], dtype=dt)

- Accès aux données possible par sous-type :


a['nom']
Numpy
Types possibles :
- i : entier
- u : entier non signé
- f : flottant simple précision
- d : flottant double précision
- b : booléen
- D : complexe
- S : chaîne de caractères
- U : unicode
- V : Void
Atelier 6ion
u l a t
a n i p s
M n n ée
e d o s
d u r ée
r u c t
st
Manipulation de données structurées

Une étude a permis de récolter les données


suivantes :
Name Prot.
Bacillus antracis 5287
Bacillus subtilis 4145
Pseudomonas aeruginosa 5571
Yersinia pestis 4257

Créez une structure permettant de calculer


rapidement le nombre moyen de protéines.
Les boucles
Numpy
Création de vecteurs
arange(debut, fin, pas) équivalent de range mais
type déduit des arguments

linspace(debut, fin, nb) retourne nb valeurs


interpolées (de début à fin)
Ex : linspace(0, 4, 3) => array([0., 2., 4.])
Partie 2
ci py
S
Scipy
Bibliothèque pour le calcul scientifique basée sur
Numpy

Contient donc les modules Numpy et Math

Fonctionne avec Python 3.X depuis Scipy 0.9.0

Installation
Paquetage python-scipy ou python3-scipy
Source
http://sourceforge.net/projects/scipy/files/scipy/
Scipy
Boîte à outil ou couteau suisse scientifique
Contient de nombreux sous-modules
fftpack pour transformées de Fourier
linalg pour l'algèbre linéaire
signal pour le traitement du signal
Intégration, statistiques, clustering,
traitement des images, etc.
Voir http://docs.scipy.org/doc/scipy/reference/np-
modindex.html
Aide par info() :
import scipy as s
s.info('fft')
Constantes scientifiques
Scipy
import scipy
import scipy.constants as const
dir(const)

Exemple :
# Nombre d'Avogadro
print const.N_A

Dictionnaire physical_constants avec :


(valeur, unité, incertitude sur la valeur)
print const.physical_constants["electron mass"]
(9.1093825999999998e-031, ‘kg’, 1.5999999999999999e-037)
Atelier 7
ntes
ns ta
Co
Constantes

Explorez les constantes proposées par


scipy.constants
Intégration
Scipy
Résultat sous forme de tuple :
(valeur, erreur estimée sur la valeur)
import scipy
import scipy.integrate
scipy.integrate.quad(lambda x: scipy.cos(scipy.exp(x)), 2, 3)
(-0.06370848052870466, 2.4174944605656258e-14)
Bornes infinies
scipy.integrate.quad(lambda x: scipy.exp(-x*x), -scipy.inf,
scipy.inf)
(1.7724538509055159, 1.4202636897147939e-08)
Atelier 8
t ion
tégra
In
Intégration

Comment obtenir la documentation de


scipy.integrate.quad ?

import scipy
import scipy.integrate
scipy.info(scipy.integrate.quad)
Interpolation
Scipy
import scipy
import scipy.interpolate
x = scipy.linspace(0, 1, 10)
y = np.sin(2*scipy.pi*x)
linear_interp = scipy.interpolate.interp1d(x, y) #par defaut,
# interpolateur lineaire
cubic_interp = scipy.interpolate.interp1d(x, y, kind='cubic')
#interpolateur cubique
fine_x = np.linspace(0, 1, 50)
y_fromlinearinterp = linear_interp(fine_x)
y_fromcubicinterp = cubic_interp(fine_x)
Interpolation
Scipy
Matrices creuses avec Sparse
Scipy
Différents types disponibles :
- csc_matrix : Compressed Sparse Column
- coo_matrix : Coordinate
- dia_matrix : Diagonal, etc.

import scipy.sparse
import scipy
A = scipy.array([[1, 0, 2], [0, 3, 0]])
A = scipy.csc_matrix(A)
... calculs
A = A.todense()
Lecture / Ecriture de matrices
Scipy
- matrices Python

from scipy.io import mmread, mmwrite


import scipy.sparse
A = scipy.coo_matrix([[1, 0, 2], [0, 3, 0]])
mmwrite('ma_matrice.mtx', A)
...
B = mmread('ma_matrice.mtx')
Lecture / Ecriture de matrices
Scipy
- matrices Matlab

from scipy.io import loadmat, savemat


import scipy.sparse
A = scipy.csr_matrix([[1, 0, 2], [0, 3, 0]])
savemat('ma_matrice.mtx', { 'A':A })
...
m = loadmat('ma_matrice.mtx')
m['A'] # contient la matice A
Atelier 9ion
u l a t
a n i p es
M a tri c
de m
Manipulation de matrices

- Créez une matrice carrée

- Enregistrez-la dans un fichier

- Lisez cette matrice dans le fichier

- Calculez son déterminant


Les boucles
Sympy
Mathématiques symbolique avec Sympy
sudo pip install sympy
Exemple :
>>> import sympy
>>> a = sympy.Rational(1, 2)
>>> a
1/2
>>> sympy.pi**2
pi**2
>>> (sympy.pi**2).evalf()
9.86960440108936
Sympy
Utilisation d'inconnues avec sympy.Symbol()

Exemple :
>>> import sympy

>>> x = sympy.Symbol('x')
>>> y = sympy.Symbol('y')
>>> x+y+x**2+y
x**2 + x + 2*y
Sympy
Calculs algébriques
>>> sympy.expand((x+y)**3)
x**3 + 3*x**2*y + 3*x*y**2 + y**3
>>> sympy.simplify((x+x*y)/x)
y+1
>>> sympy.limit(1/x, x, 'oo')
0
>>> sympy.series(sympy.cos(x), x)
1 - x**2/2 + x**4/24 + O(x**6)
>>> sympy.solve([x + 5*y - 2, -3*x + 6*y - 15], [x, y])
{x: -3, y: 1}
Sympy
Calcul matriciel
>>> A = sympy.Matrix([[1, x], [y, 1]])
>>> A
[1, x]
[y, 1]
Atelier 10
li q ue
m bo
ul s y y
Cal c ym p
v ec S
a
Calcul symbolique avec Sympy

Testez différents exemples de calcul

Explorez le module (help('sympy') etc.)

Comment résoudre : A and not B ?

>>> from sympy.abc import A, B


>>> from sympy.logic.inference import satisfiable
>>> satisfiable(A & ~B)
{A: True, B: False}
Scikit-learn
Apprentissage automatique

sudo pip install scikit.learn

- Hidden Markov Models


- Clustering
- Voisinage
- etc.

http://scikit-learn.org/stable/

Liste des autres modules :


http://scikits.appspot.com/scikits
Mayavi2
Graphiques scientifiques en 3D

Module Python

Installation
Enthought Tools Suite
Source :
https://svn.enthought.com/enthought/wiki/Install
Commande checkout : python ets.py co
Attention : Très long !

Paquetages Debian
mayavi2
Mayavi2
Mayavi2
Exemple

x = [1, 2, 3, 4, 5, 6]
y = [0, 0, 0, 0, 0, 0]
z=y
s = [.5, .6, .7, .8, .9, 1]

from mayavi import mlab


pts = mlab.points3d(x, y, z, s)
mlab.show()
Exemple
Mayavi2
import numpy
from mayavi import mlab
n_mer, n_long = 6, 11
pi = numpy.pi
dphi = pi/1000.0
phi = numpy.arange(0.0, 2*pi + 0.5*dphi, dphi)
mu = phi*n_mer
x = numpy.cos(mu)*(1 + numpy.cos(n_long*mu/n_mer)*0.5)
y = numpy.sin(mu)*(1 + numpy.cos(n_long*mu/n_mer)*0.5)
z = numpy.sin(n_long*mu/n_mer)*0.5
mlab.plot3d(x, y, z, numpy.sin(mu), tube_radius=0.025,
colormap='Spectral')
mlab.show()
Mayavi2
Atelier 113D
ti o n
e nta
p ré s a v i
Re c M a y
a v e
Représentation 3D avec Mayavi

Testez Mayavi en affichant différents points en 3D

Testez les boutons de la fenêtre de visualisation


Networkx
Manipulation de graphes (graphes orientés,
non-orientés, affichage, calculs, ...)

Documentation :
http://networkx.lanl.gov/contents.html

Installation
sudo pip install -U networkx
Source http://pypi.python.org/packages/source/n/
networkx/
Networkx
Exemple :
import pylab as plt
import networkx as nx

G=nx.Graph()
G.add_edge(1, 2)
G.add_edge(1, 3)
G.add_node(4)
nx.draw(G)
plt.show()
Pandas
Python Data Analysis Library

http://pandas.pydata.org/

Vise à remplacer le langage R

Aspect statistique délégué à StatsModels

http://statsmodels.sourceforge.net/
Partie 3 tl i b
p lo
Ma th
Matplotlib
Graphiques scientifiques en 2D

Tentative d'imitation de Matlab

Pas de version pour Python 3.X

Installation
Paquetage python-matplotlib
Source
http://sourceforge.net/projects/matplotlib/files/
matplotlib/
Matplotlib
Import par
import pylab as pl ou from pylab import *
import matplotlib.pyplot as pl # sous-module graphes

Graphe simple
import pylab as pl

x = [i for i in range(0, 50, 1)]


pl.plot(x)
pl.show()
Atelier 12ple
e s i m
ph
Gra
Graphe simple

Écrire un script affichant la courbe de cos(x)


sur [0, 2*pi] (60 points)
Les boucles
Matplotlib
Histogramme
pl.hist(data) # Sur structure énumérable ex : [12, 24, 24, ...]
pl.bar(numero, valeur) # À répéter pour chaque barre

Exemple :
import pylab as pl

data = { 'A':40, 'B':70, 'C':30, 'D':85 }


num = 1
for key in data:
pl.bar(num, data[key])
num += 1
pl.show()
Paramètres optionnels
Matplotlib
pl.bar(numero, valeur, color, xerr, yerr)
color : chaîne de caractères réservée
(xerr, yerr) : barre d'erreur sur la barre
Exemple :
data = { 'A':40, 'B':70, 'C':30, 'D':85 }
c = [ 'red', 'yellow', 'green', 'blue' ]
num = 0
for key in data:
pl.bar(num, data[key], color=c[num], xerr=1, yerr=1)
num += 1
import pylab as pl
pl.show()
Matplotlib
Matplotlib
Modifications des étiquettes des axes
pl.xticks(positions, étiquettes) # ou étiquettes
pl.yticks(positions, étiquettes) # ou étiquettes
Exemple
import pylab as pl
import numpy as np pl.xticks(np.arange(
len(data))+0.4,
data = { 'A':40, 'B':70, 'C':30, 'D':85 }
data.keys())
c = [ 'red', 'yellow', 'green', 'blue' ]
pl.yticks(data.values())
num = 0
pl.show()
for key in data:
pl.bar(num, data[key], color=c[num],
xerr=10, yerr=10)
num += 1
Matplotlib
Atelier 13 e
m m
is to gra
H
Histogramme

Écrire un script affichant l'histogramme suivant :


Les boucles
Barres d'erreur
Matplotlib
pl.errorbar(x, y, yerr, fmt)
(x, y) : centre de la barre
yerr : erreur
fmt : format (si omis : barre seule)
Exemple :
import pylab as pl
x=[0.4, 1.4, 2.4, 3.4]
y=[20, 35, 15, 42.5]
pl.plot(x, y)
pl.errorbar(x, y, yerr=2, fmt='.-')
pl.show()
Matplotlib
Matplotlib
Camemberts
pl.pie(portions, labels=étiquettes)

Exemple
import pylab as pl

data = [ 10, 50, 25, 5, 10 ] # Adaptation à 100% auto


lbl = [ 'A', 'B', 'C', 'D', 'E' ]
pl.pie(data, labels=lbl)
pl.show()
Matplotlib
Matplotlib
Pourcentages dans les portions
pl.pie(portions, labels=étiquettes,autopct='%...%')
Mise en valeur de portions : explode=...
Liste spécifiant les fractions de rayon de décallage
Exemple
import pylab as pl

data = [ 10, 50, 25, 5, 10 ]


lbl = [ 'A', 'B', 'C', 'D', 'E' ]
expl = [ 0, 0.3, 0.1, 0, 0 ]
pl.pie(data, labels=lbl, autopct='%1.1f%%', explode=expl)
pl.show()
Matplotlib
Matplotlib
Ajouter des annotations :
pl.annotate(text, xy=coordonnées, xytext=coordonnées,
arrowprops=paramètres_flèche)

Exemple
import pylab as pl
y = [13,11,13,12,13,10,30,12,11,13,12,11,13,12]
pl.plot(y)
pl.ylim(ymax=35)
pl.annotate('Point remarquable...', xy=(6, 30),
xytext=(8,31.5), arrowprops=dict(facecolor='black',
shrink=0.05))
pl.show()
Matplotlib
shrink=espace
xy

xytext
Matplotlib
Pour afficher plusieurs courbes :
pl.plot(x, y, ...)

Pour afficher plusieurs courbes dans plusieurs


« cadres » :
- Une figure ouvre une nouvelle fenêtre :
pl.figure()
- On peut créer des sous-figures :
subplot(lignes, colonnes, numéro)
Numéro indique la position dans la matrice
Matplotlib
Exemple :
import pylab as pl # ou import matplotlib.pyplot as pl
pl.figure(1)
courbe1 = pl.subplot(2, 2, 1)
courbe1.plot(x)
courbe2 = pl.subplot(2, 2, 4)
courbe2.plot(y)
pl.figure(2)
# Deuxième figure/fenêtre
courbe3 = pl.subplot(2, 2, 1)
courbe3.plot(z)
# Si appel à pl.figure(1), retour sur la première figure
fig.show()
Matplotlib
Matplotlib
Pour afficher des légendes
Sur les axes :
xlabel("titre")
ylabel("titre")
Titre de la figure
title("titre")
Légende
legend(["titre"], shadow=True|False, fancybox=True|False)
Pour plusieurs courbes sur une même figure
legend(["titre1", "titre2", ...], ...)
Modifier des propriétés :
legend(..., prop = {'font' :'small', ...})
Matplotlib
Utilisation avec les sous-figures :
Actif sur la dernière sous-figure sélectionnée
pl.subplot(2, 2, 2)
pl.title("Courbe") => titre de la figure 2
Matplotlib
Pour changer de couleur
De nombreuses fonctions admettent un
paramètre color :
plot, xlabel, ylabel, title, etc.

Les couleurs sont données


- en anglais (red, blue, etc)
- ou au format #rrggbb
pl.title("titre", color="#aa24ee")
Matplotlib
Pour changer le style de points d'une courbe
Attribut marker dans la méthode plot()
Valeurs possibles : o, h, d, +, *, etc

Matplotlib accepte le format LaTeX


Chaîne : r"$...exp LaTeX...$"

Pour sauvegarder une figure :


pl.savefig("nom_fichier.ext", format="format")
Formats disponibles : pdf, png, svg, ps, eps
Atelier 14hes
gra p
ulti -
M
Multi-graphes

Écrire un script permettant de reproduire la figure


suivante dans un fichier pdf
Les boucles
Atelier 15tif
i tul a
é ca p
R
Multi-graphes

Tracer la courbe de sin(2pi x)e^-x et ses


asymptotes sur [0, 5] et ajouter une annotation

Tend vers 0
Les boucles
Matplotlib
Plusieurs origines possibles pour les données :
- base de données
- fichiers (CSV, etc)
- Web

Techniques de dessin identiques...


...il faut savoir récupérer les données.
Base de données
SQLite3
- Principe identique sur les autres SGBD (+
identification)
- Méthode
Connexion
import sqlite3
base = sqlite3.connect('fichierBase.db')
Création curseur
curseur = base.cursor()
Base de données
Exécution de requêtes SQL
curseur.execute("CREATE TABLE test (entier INTEGER,
texte TEXT, ...)")
curseur.execute("INSERT INTO test(entier, texte, ...)
VALUES(12, "texte", ...)")
curseur.execute("SELECT * FROM test")
Commit
base.commit()
Fermeture
curseur.close()
base.close()
Atelier 16nées
d on
e s de
B as
Base de données

Écrire un script permettant de :


- Ouvrir une base de données base.db
- Si la table bacteriae (id INTEGER PRIMARY KEY,
name TEXT, prot INTEGER) n'existe pas, la créer

- Demander à l'utilisateur un nom de bactérie puis


un nombre de protéines et insérer le résultat dans
la base
- Afficher le contenu de la base
Les boucles
Les fichiers
Fichier recherché dans répertoire courant
Changement de répertoire :
from os import chdir
chdir("/home/login/repertoire")
Nom du répertoire courant :
getcwd() du module os
Ouverture d'un fichier
'r' pour lecture
'w' pour écriture
'a' pour ajout
Autres modes : help(open)
« objet-fichier » ou descripteur : accès au fichier
Les fichiers
Importance de la représentation des données :
- utilisation d'un fichier de données
- externe (format figé)
- interne (format libre)

Structure classique :
- en-tête
- sections
- mot-clé en début de ligne
- identifiant puis valeur
- colonnes de données séparées par un caractère
Les fichiers

3 étapes
Les fichiers
1
Ouverture du fichier et création de l'objet-fichier

fic = open("nom_fichier", "mode")


où mode = r, w, ou a
Les fichiers r
ie

2 Traitement
Écriture Fin d e

a
f

î
ich
= ide
n e v
fic.write("À écrire dans le fichier") Ch
Lecture
- Tout le fichier
texte = fic.read()
- Les 10 premiers caractères
texte = fic.read(10)
- Une ligne
ligne = fic.readline()
- Toutes les lignes dans une liste
lignes = fic.readlines()
Les fichiers
3
Fermeture du fichier

fic.close()
Atelier 17 s
i er
e s f ich
L
Les fichiers

Écrire une fonction permettant d'enregistrer


dans un fichier un texte passé en paramètre (le
nom du fichier est, lui aussi, passé en paramètre).

Écrire une fonction permettant de lire et


d'afficher l'intégralité d'un fichier texte.

Utiliser ces deux fonctions depuis un autre


fichier (import d'un module).
Les fichiers
Problème du traitement des erreurs
Si le fichier à ouvrir en lecture n'existe pas
Si le fichier n'est pas accessible en écriture
...
Les fichiers
Mécanisme des exceptions
Erreur détectée par l'interpréteur :
- Arrêt du programme
- Message d'erreur
Exemple :
print(1/0)
ZeroDivisionError : int division or ...
C'est une exception ZeroDivisionError
Traitement des erreurs par :
try:
...
except:
...
Les fichiers
Pour traiter une erreur précise :
except NomException:
except (NomException1, NomException2, ...):

Pour récupérer des informations sur une exception :


except NomException as (errno, strerror):
errno : Numéro de l'erreur
strerror : Message de l'exception
Les fichiers
Exemple sur les fichiers
try:
fic = open("fichier", "r")
except IOError:
print("Le fichier n'est pas accessible")
exit(0)
print fic.read()
fic.close()
Les fichiers
Exemple sur les fichiers
try:
with open("fichier", "r") as fic:
print fic.read()
except IOError:
print("Le fichier n'est pas accessible")
exit(0)

Le close devient implicite


Les fichiers
Traitement des données :
- strip() : supprimer les caractères invisibles
Module string
- rstrip() : à droite
- lstrip() : à gauche
Ex : strip(' texte \n') => 'texte'
- split() : découper une chaîne
Ex : '12:13:45'.split(' :') => [12, 13, 45]
- join() : regoupe des éléments de liste
Ex : ':'.join([12,13,45]) => '12:13:45'
Les fichiers
Fichiers de configuration (.ini):
[web]
name = Linux Pratique
url = http://www.linux-pratique.com

[article]
author = Tristan Colombo
title = Manipulation de fichiers avec Python
Les fichiers
Utilisation du module ConfigParser :
from ConfigParser import SafeConfigParser

parser = SafeConfigParser()
parser.read('lp.ini')
print parser.get('web', 'name')
Atelier 18
e ap h r
Gr i c hi e
u n f
pui s
de
Graphe depuis un fichier

Enregistrez le fichier suivant et utilisez-le pour


tracer les courbes qu'il définit.
Fichier data.csv :
Courbe A;1.5;9;54;9;1.5
Courbe B;1;2;3;4;5
Courbe C;-5;5;-5;5;-5

Comment représenter ces données dans un fichier


de configuration ?
Données Web
1. Récupérer la page
- os.system('wget ...') puis lecture
- Modules urllib2 et lxml.html

2. Récupérer les données


- Module re pour utiliser les ER
import re
pattern = '... (..) ...'
match = re.search(pattern, chaîne)
match.group(0) => premier match, etc.

3. Matplotlib
Numpy Scipy Matplotlib
support@info2dev.com
Bibliographie