TP Intro Python
TP Intro Python
2.1 1 Introduction
2.1.1 1.1 Prérequis
Ce calepin introduit le langage libre Python et décrit les premières commandes nécessaires au
pré-traitement des données avant l’utilisation de méthodes statistiques avec ce langage. Pour une
présentation plus détaillée, de très nombreuses ressources pédagogiques sont disponbiles dont le
tutoriel officiel de Python 3.4., les sites [Link], [Link], le livre de Sheppard
(2014) qui présentent une introduction à Python pour l’Econométrie et la Statistique et celui de
Mac Kinney (2013), principal auteur de la bibliothèque pandas.
1
2.2 2 Utilisation de Python
Dans cette UE, on choisit d’utiliser le langage Python pour exécuter des programmes ou scripts
à l’aide d’un interprète de commande (IDLE) de manière interactive. En situation pédagogique,
c’est l’utilisation et la réalisation d’un notebook Jupyter (calepin) qui est privilégiée à partir d’un
simple navigateur .
2
3.7.3 (default, Mar 27 2019, [Link])
[Clang 4.0.1 (tags/RELEASE_401/final)]
Out[3]: Gender TV
0 f 3.4
1 f 3.5
2 m 2.6
3 f 4.7
4 m 4.1
5 m 4.0
6 f 5.1
7 m 4.0
8 f 3.7
9 m 2.1
3
In [5]: help(randn)
Parameters
----------
d0, d1, ..., dn : int, optional
The dimensions of the returned array, should be all positive.
If no argument is given a single Python float is returned.
4
Returns
-------
Z : ndarray or float
A ``(d0, d1, ..., dn)``-shaped array of floating-point samples from
the standard normal distribution, or a single such float if
no parameters were supplied.
See Also
--------
standard_normal : Similar, but takes a tuple as its argument.
Notes
-----
For random samples from :math:`N(\mu, \sigmaˆ2)`, use:
Examples
--------
>>> [Link]()
2.1923875335537315 #random
In [7]: # Comparaison
a==b
Out[7]: False
Out[8]: int
5
In [9]: # Chaîne de caractère
a='bonjour '
b='le '
c='monde'
a+b+c
Out[10]: 3
Out[11]: [1, 2, 3]
Out[12]: 1
In [13]: liste_C[-2]
Out[13]: 'hi'
Out[14]: [0, 3]
Out[15]: [0, 2, 5]
6
[1, 2, 3, 4]
In [17]: [Link]('hi')
print(List)
[1, 2, 3, 4, 'hi']
In [18]: [Link]([7,8,9])
print(List)
[1, 2, 3, 4, 'hi', 7, 8, 9]
In [19]: [Link]([10,11,12])
print(List)
Dictionnaire Un dictionnaire est similaire à une liste mais chaque entrée est assignée par une clé
/ un nom, il est défini avec des accolades. Cet objet est utilisé pour la construction de l’index des
colonnes (variables) du type DataFrame de la librairie pandas.
Out[20]: 31
In [21]: [Link]()
In [22]: [Link]()
In [23]: [Link]()
7
Structure conditionnelle
0
0
Structure itérative
1
3
5
7
In [28]: # Aide
help(pythagorus)
pythagorus(x, y)
Calcule l'hypotenuse d'un triangle
8
2.5 5. Calcul scientifique
Voici quelques librairies indispensables au calcul scientifique
Matplotlib Celle-ci propose des fonctions de visualisation / graphs avec des commandes
proches de celles de Matlab. Aussi connue sous le nom de pylab. La gallerie de cette librairie
propose tout un ensemble d’exemples de graphiques avec le code Python pour les générer.
In [29]: # Importation
import numpy as np
from pylab import *
gaussian = lambda x: [Link](-(0.5-x)**2/1.5)
x=[Link](-2,2.5,0.01)
y=gaussian(x)
plot(x,y)
xlabel("x values")
ylabel("y values")
title("Gaussian function")
show()
9
SciPy Cette librairie est un ensemble très complet de modules d’algèbre linéaire, statistiques et
autres algorithmes numériques. Le site de la documentation en fournit la liste.
In [30]: # Importation
import numpy as np
my_1D_array = [Link]([4,3,2])
print(my_1D_array)
my_2D_array = [Link]([[1,0,0],[0,2,0],[0,0,3]])
print(my_2D_array)
my_2D_array[1]
[4 3 2]
[[1 0 0]
[0 2 0]
[0 0 3]]
In [31]: [Link](5)
In [32]: [Link](3)
In [33]: [Link]((3,4))
10
In [34]: [Link](3)
In [36]: D=[Link]([1,2,4,3])
print(D)
print([Link](D))
[[1 0 0 0]
[0 2 0 0]
[0 0 4 0]
[0 0 0 3]]
[1 2 4 3]
Le module [Link] fournit toute une liste de fonctions pour la génération de matrices
aléatoires.
In [39]: v=[Link](1000)
import [Link] as plt
h=[Link](v,20) # histogramme à 20 pas
show()
11
In [40]: A=[Link](64,64)
[Link](A,interpolation="nearest")
[Link]
[Link]()
12
In [41]: # Sauver, écrire dans un fichier, lire un fichier
M=[Link](10,10)
[Link]('[Link]',M,fmt='%2.2f',delimiter=',')
Slicing
In [43]: v=[Link]([1,2,3,4,5])
print(v)
[1 2 3 4 5]
In [44]: v[1:4]
In [45]: v[Link]
In [46]: v[::]
13
Out[47]: array([1, 3, 5])
In [48]: v[ : 3]
Out[48]: array([1, 2, 3])
In [49]: v[3 :] # à partir de l'indice 3
Out[49]: array([4, 5])
In [50]: v[-1] # dernier élément
Out[50]: 5
In [51]: v[-2 :] # deux derniers éléments
Out[51]: array([4, 5])
In [52]: M=[Link](4,3)
print(M)
[[0.03853487 0.94442594 0.29656618]
[0.15282854 0.08915877 0.93003404]
[0.4545388 0.20564332 0.98704284]
[0.53526022 0.30220972 0.67219439]]
In [53]: ind=[1,2]
M[ind] # lignes d'indices 1 et 2
Out[53]: array([[0.15282854, 0.08915877, 0.93003404],
[0.4545388 , 0.20564332, 0.98704284]])
In [54]: M[:,ind] # colonnes d'indices 1 et 2
Out[54]: array([[0.94442594, 0.29656618],
[0.08915877, 0.93003404],
[0.20564332, 0.98704284],
[0.30220972, 0.67219439]])
In [55]: M[[0,2],[1,2]] # renvoie M[0,1] et M[2,2]
Out[55]: array([0.94442594, 0.98704284])
In [56]: M[np.ix_([0,2],[1,2])]
Out[56]: array([[0.94442594, 0.29656618],
[0.20564332, 0.98704284]])
In [57]: (M>0.5)
Out[57]: array([[False, True, False],
[False, False, True],
[False, False, True],
[ True, False, True]])
In [58]: M[M>0.5]
Out[58]: array([0.94442594, 0.93003404, 0.98704284, 0.53526022, 0.67219439])
14
Autres fonctions
In [59]: a=[Link]([[0,1],[2,3],[4,5]])
[Link](a) # Nombre de dimensions)
Out[59]: 2
Out[60]: 6
Out[61]: (3, 2)
Out[64]: (0, 0)
Quelques manipulations:
15
In [70]: [Link](6).reshape(3,2)
In [71]: A=[Link]([[1,2],[3,4]])
[Link](A,(3,2)) # Répétition de la matrice A
In [72]: A=[Link]([[1,2],[3,4]])
B=[Link]([[11,12],[13,14]])
#Concaténation en ligne
[Link]((A,B),axis=0)
In [73]: # Equivalent à
[Link]((A,B))
In [75]: # Equivalent à
[Link]((A,B))
16
Opérations sur les arrays
In [76]: # somme
a=[Link](6).reshape(3,2)
b=[Link](3,9).reshape(3,2)
c=[Link](b)
a+b
In [79]: [Link](a,2)
In [80]: [Link](2,a)
In [81]: a/3
In [82]: # Importation
import numpy as np
from scipy import linalg
A = [Link]([[1,2],[3,4]])
[Link](A)
17
Out[82]: array([[-2. , 1. ],
[ 1.5, -0.5]])
In [83]: [Link](A)
Out[83]: -2.0
(-0.3722813232690143+0j) (5.372281323269014+0j)
[-0.82456484 0.56576746]
In [86]: # SVD de A
U,s,V = [Link](A)
print(s**2)
[29.86606875 0.13393125]
In [87]: [Link]([Link]([Link](A),A))
18
Cette partie est basée sur la documentation en ligne qui inclut également des tutoriels à exé-
cuter pour compléter et approfondir les possibilités de traitement de données avec la librairie
pandas.
A titre d’illustration, on utilise des données issues d’une compétition du site Kaggle: Titanic:
Machine learnic from Disaster. Le concours est terminé mais les données sont toujours disponibles
sur le site avec des tutoriels utilisant Excel, Python ou R.
Une des raisons du drame, qui provoqua la mort de 1502 personnes sur les 2224 passagers et
membres d’équipage, fut le manque de canots de sauvetage. Il apparaît que les chances de survie
dépendaient de différents facteurs (sexe, âge, classe. . . ). Le but du concours est de construire un
modèle de prévision (classification supervisée) de survie en fonction de ces facteurs. Les données
sont composées d’un échantillon d’apprentissage (891) et d’un échantillon test (418) chacun décrit
par 11 variables dont la première indiquant la survie ou non lors du naufrage.
19
# liste des colonnes
[Link]
Out[89]: Index(['state', 'year', 'pop'], dtype='object')
In [90]: # valeurs d'une colonnes
frame["state"]
Out[90]: 0 Ohio
1 Ohio
2 Ohio
3 Nevada
4 Nevada
Name: state, dtype: object
In [91]: [Link]
Out[91]: 0 2000
1 2001
2 2002
3 2001
4 2002
Name: year, dtype: int64
In [92]: # "imputation"
frame2["debt"] = 16.5
frame2
Out[92]: year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5
In [93]: # créer une variable
frame2["eastern"] = [Link] == "Ohio"
frame2
Out[93]: year state pop debt eastern
one 2000 Ohio 1.5 16.5 True
two 2001 Ohio 1.7 16.5 True
three 2002 Ohio 3.6 16.5 True
four 2001 Nevada 2.4 16.5 False
five 2002 Nevada 2.9 16.5 False
In [94]: [Link]
Out[94]: Index(['year', 'state', 'pop', 'debt', 'eastern'], dtype='object')
In [95]: # supprimer une variable
del frame2[u"eastern"]
[Link]
Out[95]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
20
2.6.2 6.2 Exemple
Les données du naufrage du Titanic illustrent l’utilisation de pandas.
In [96]: # Importations
import pandas as pd
import numpy as np
# Chargement des données
path='./'
df = pd.read_csv(path+'[Link]',nrows=5)
df
In [97]: [Link]()
21
Parch Ticket Fare Cabin Embarked
0 0 A/5 21171 7.2500 NaN S
1 0 PC 17599 71.2833 C85 C
2 0 STON/O2. 3101282 7.9250 NaN S
3 0 113803 53.1000 C123 S
4 0 373450 8.0500 NaN S
La librairie pandas, inclut un type category assez proche de celui factor de R. Il de-
vrait normalement être déclaré dans un dictionnaire au moment par exemple de la lecture
(dtype={"Surv":[Link]...}) mais ce n’est pas le cas, c’est donc le type objet qui est
22
déclaré puis modifié. Il est vivement recommandé de bien affecter les bons types à chaque vari-
able ne serait-ce que pour éviter de faire des opérations douteuses, par exemple arithmétiques sur
des codes de modalités.
In [100]: df=pd.read_csv(path+"[Link]",skiprows=1,header=None,usecols=[1,2,4,5,9,11]
names=["Surv","Classe","Genre","Age","Prix","Port"],dtype={"Surv":object,
"Classe":object,"Genre":object,"Port":object})
[Link]()
In [101]: [Link]
In [102]: df["Surv"]=[Link](df["Surv"],ordered=False)
df["Classe"]=[Link](df["Classe"],ordered=False)
df["Genre"]=[Link](df["Genre"],ordered=False)
df["Port"]=[Link](df["Port"],ordered=False)
[Link]
23
In [103]: df["AgeQ"]=[Link]([Link],3,labels=["Ag1","Ag2",
"Ag3"])
df["PrixQ"]=[Link]([Link],3,labels=["Pr1","Pr2",
"Pr3"])
df["PrixQ"].describe()
6.3.2 Modifier / regrouper des modalités Le recodage des variables qualitatives ou renommage
en clair des modalités est obtenu simplement.
In [104]: df["Surv"]=df["Surv"].cat.rename_categories(
["Vnon","Voui"])
df["Classe"]=df["Classe"].cat.rename_categories(
["Cl1","Cl2","Cl3"])
df["Genre"]=df["Genre"].cat.rename_categories(
["Gfem","Gmas"])
df["Port"]=df["Port"].cat.rename_categories(
["Pc","Pq","Ps"])
In [105]: [Link]()
24
5 Bacon 8.0
6 pastrami 3.0
7 honey ham 5.0
8 nova lox 6.0
In [107]: meat_to_animal = {
"bacon": "pig",
"pulled pork": "pig",
"pastrami": "cow",
"corned beef": "cow",
"honey ham": "pig",
"nova lox": "salmon"
}
# Eviter les mélanges de majuscules minuscules
# en mettant tout en minuscule
data["animal"] = data["food"].map(
[Link]).map(meat_to_animal)
data
Out[108]: 0 pig
1 pig
2 pig
3 cow
4 cow
5 pig
6 cow
7 pig
8 salmon
Name: food, dtype: object
key data1
0 b 0
25
1 b 1
2 a 2
3 c 3
4 a 4
5 b 5
Out[109]: a b c
0 0 1 0
1 0 1 0
2 1 0 0
3 0 0 1
4 1 0 0
5 0 1 0
In [110]: help(pd.get_dummies)
Parameters
----------
data : array-like, Series, or DataFrame
prefix : string, list of strings, or dict of strings, default None
String to append DataFrame column names.
Pass a list with length equal to the number of columns
when calling get_dummies on a DataFrame. Alternatively, `prefix`
can be a dictionary mapping column names to prefixes.
prefix_sep : string, default '_'
If appending prefix, separator/delimiter to use. Or pass a
list or dictionary as with `prefix.`
dummy_na : bool, default False
Add a column to indicate NaNs, if False NaNs are ignored.
columns : list-like, default None
Column names in the DataFrame to be encoded.
If `columns` is None then all the columns with
`object` or `category` dtype will be converted.
sparse : bool, default False
Whether the dummy-encoded columns should be be backed by
a :class:`SparseArray` (True) or a regular NumPy array (False).
drop_first : bool, default False
Whether to get k-1 dummies out of k categorical levels by removing the
first level.
.. versionadded:: 0.18.0
26
dtype : dtype, default np.uint8
Data type for new columns. Only a single dtype is allowed.
.. versionadded:: 0.23.0
Returns
-------
dummies : DataFrame
See Also
--------
[Link].get_dummies
Examples
--------
>>> s = [Link](list('abca'))
>>> pd.get_dummies(s)
a b c
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
>>> pd.get_dummies(s1)
a b
0 1 0
1 0 1
2 0 0
>>> pd.get_dummies([Link](list('abcaa')))
27
a b c
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
4 1 0 0
6.3.3 Variables indicatrices Générer des indicatrices des modalités ou dummy variables.
Out[112]: 0 1 2 3
1 4 5 6 7
3 12 13 14 15
28
4 16 17 18 19
0 0 1 2 3
2 8 9 10 11
6.3.5 Transformations, opérations Les opérations arithmétiques entre Series et DataFrame sont
possibles au même titre qu’entre array. Si les index ne correspondent pas, des valeurs man-
quantes (NAN) sont créées à moins d’utiliser des méthodes d’arithmétique flexible (add, sub,
div, mul) autorisant la complétion par une valeur par défaut, généralement 0.
Une fonction quelconque (lambda) peut être appliquée avec une même commande qu’apply
de R.
6.3.6 Tri et rangs Trier une table selon les valeurs d’une variable ou d’un index.
Out[115]: d a b c
one 4 5 6 7
three 0 1 2 3
In [116]: frame.sort_index(axis=1)
Out[116]: a b c d
three 1 2 3 0
one 5 6 7 4
29
In [117]: frame.sort_index(axis=1, ascending=False)
Out[117]: d c b a
three 0 3 2 1
one 4 7 6 5
In [118]: frame.sort_values(by="b")
Out[118]: d a b c
three 0 1 2 3
one 4 5 6 7
La commande rank remplace les valeurs par leur rang dans l’ordre des lignes ou des colonnes.
Out[119]: b a c
0 3.0 2.0 1.0
1 3.0 1.0 2.0
2 1.0 2.0 3.0
3 3.0 2.0 1.0
In [120]: [Link](axis=0)
Out[120]: b a c
0 3.0 1.5 2.0
1 4.0 3.5 3.0
2 1.0 1.5 4.0
3 2.0 3.5 1.0
In [121]: [Link]
In [122]: [Link]()
30
Out[122]: Age Prix
count 714.000000 891.000000
mean 29.699118 32.204208
std 14.526497 49.693429
min 0.420000 0.000000
25% 20.125000 7.910400
50% 28.000000 14.454200
75% 38.000000 31.000000
max 80.000000 512.329200
In [123]: [Link]()
In [125]: df["Age"].hist()
[Link]()
In [126]: df["Age"].plot(kind="box")
[Link]()
31
In [127]: df["Prix"].plot(kind="hist")
[Link]()
32
In [128]: # qualitatif
df["Surv"].value_counts()
Out[128]: Vnon 549
Voui 342
Name: Surv, dtype: int64
In [129]: df["Classe"].value_counts()
Out[129]: Cl3 491
Cl1 216
Cl2 184
Name: Classe, dtype: int64
In [130]: df["Genre"].value_counts()
Out[130]: Gmas 577
Gfem 314
Name: Genre, dtype: int64
In [131]: df["Port"].value_counts()
Out[131]: Ps 644
Pc 168
Pq 77
Name: Port, dtype: int64
33
In [133]: # afficher une sélection
df[df["Age"]>60][["Genre","Classe","Age","Surv"]]
In [134]: [Link](column="Age",by="Classe")
[Link]()
34
In [135]: [Link](column="Prix",by="Surv")
[Link]()
35
In [136]: # table de contingence
table=[Link](df["Surv"],df["Classe"])
print(table)
In [138]: mosaic(df,["Surv","Classe"])
[Link]()
36
6.4.3 Imputation de données manquantes La gestion des données manquantes est souvent un
point délicat. De nombreuses stratégies ont été élaborées, et nous ne décrivons ici que les plus
élémentaires à mettre en oeuvre avec pandas.
Il est ainsi facile de supprimer toutes les observations présentant des données manquantes
lorsque celles-ci sont peu nombreuses et majoritairement regroupées sur certaines lignes ou
colonnes.
df = [Link](axis=0) df = [Link](axis=1)
Pandas permet également de faire le choix pour une variable qualitative de considérer [Link]‘
comme une modalité spécifique ou d’ignorer l’observation correspondante.
Autres stratégies: * Cas quantitatif: une valeur manquante est imputée par la moyenne ou la
médiane. * Cas d’une série chronologique: imputation par la valeur précédente ou suivante ou
par interpolation linéaire, polynomiale ou encore lissage spline. * Cas qualitatif: modalité la plus
fréquente ou répartition aléatoire selon les fréquences observées des modalités.
La variable âge contient de nombreuses données manquantes. La fonction fillna présente
plusieurs options d’imputation.
37
25% 22.000000 7.910400
50% 28.000000 14.454200
75% 35.000000 31.000000
max 80.000000 512.329200
<class '[Link]'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 8 columns):
Surv 891 non-null category
Classe 891 non-null category
Genre 891 non-null category
Age 891 non-null float64
Prix 891 non-null float64
Port 889 non-null category
AgeQ 714 non-null category
PrixQ 891 non-null category
dtypes: category(6), float64(2)
memory usage: 19.8 KB
<class '[Link]'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 8 columns):
Surv 891 non-null category
Classe 891 non-null category
Genre 891 non-null category
Age 891 non-null float64
Prix 891 non-null float64
Port 891 non-null category
AgeQ 891 non-null category
PrixQ 891 non-null category
dtypes: category(6), float64(2)
memory usage: 19.8 KB
Ces imputations sont pour le moins très rudimentaires et d’autres sont à privilégier pour des
modélisations plus soignées. . .
38
In [141]: # tables
df1 = [Link]({"key": ["b", "b", "a", "c",
"a","a", "b"],"data1": range(7)})
df2 = [Link]({"key": ["a", "b", "d"],
"data2": range(3)})
[Link](df1,df2,on="key")
La gestion des clefs manquantes est en option: entre autres, ne pas introduire de ligne (ci-
dessus), insérer des valeurs manquantes ci-dessous.
In [143]: # tables
df1 = [Link]({"key": ["b", "b", "a", "c",
"a", "a", "b"],"var": range(7)})
df2 = [Link]({"key": ["a", "b", "d"],
"var": range(3)})
# concaténation verticales
[Link]([df1,df2],axis=0)
39
6 b 6
0 a 0
1 b 1
2 d 2
40