0% ont trouvé ce document utile (0 vote)
184 vues43 pages

Formation Python Pour La Data Science - 3 - Introduction À Numpy

Transféré par

tdiouf
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
184 vues43 pages

Formation Python Pour La Data Science - 3 - Introduction À Numpy

Transféré par

tdiouf
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 43

Formation Python pour

la data science
Numpy et pandas

1
Introduction à numpy

2
NUMPY : présentation

 numpy est un bibliothèque Python spécialement adaptée à la


manipulation de matrices ou de tableaux multidimensionnels et
possédant des fonctions mathématiques opérant sur ces tableaux

 Généralement pour simplifier l’appel aux fonctions numpy, on


utilise :

 Elle est installée par défaut dans la suite Anaconda


Créez un nouveau Notebook dans lequel
3

vous chargez la bibliothèque numpy.


NumPy et les arrays
 Les arrays sont des structures centrales pour travailler en data science. Les
arrays de NumPy sont utilisées comme des vecteurs ou des matrices
 On crée un array en utilisant la commande np.array, on peut créer un array
à partir d’une liste ou de plusieurs listes
 Les array ne se compose que d’un type de données
 Pour connaître la taille d’un array, on utilise la fonction .shape
 Pour connaître le type de données dans l’array, on utilise .dtype

Pour plus de détails : Créez à partir d’une liste un array


http://docs.scipy.org/doc/numpy/reference/index.html unidimensionnel et vérifiez sa taille et ce
qu’il comporte.
4
Un peu de vocabulaire

 Les dimensions sont appelées axis


 Le nombre de dimensions est appelé ndim
 La taille (size) est le nombre total d’éléments d’un array

5
NumPy et les arrays
Attention les arrays
 On peut générer des arrays de manière simple en Python sont
 np.array([ ], dtype=float) toujours indexés à 0

 np.zeros(5) pour créer un array de taille 5 rempli de 0


 np.ones((5,5)) pour créer un array de taille 5 x 5 rempli de 1
 np.empty(5)
 np.eye(5) pour créer une matrice identité de taile 5
 np.full( , val) pour créer un array rempli avec la valeur val

Générez des arrays remplis de 0 et de 1 de


taille 10.
6
 np.arange(5) pour créer un array de taille 5 avec des valeurs de
0 à 4, on peut utilise start=, stop= et step=
 On peut utiliser arange avec des float mais on préfère
généralement np.linspace
 Cette fonction génère un nombre donné de valeur équidistante
entre deux bornes
 np.linspace(0, 5, 10)

7
Premières opérations arithmétiques
 Les opérations arithmétiques de bases se font terme à terme
 *, +, -, /, **

Créez un array bidimensionnel avec des


valeurs quelconques, calculer le cube de
cet array

8
Attention lorsqu’on sélectionne et
modifie des sous-parties d’un array,

Manipulation des arrays on modifie l’array initial aussi, il faut


utiliser la fonction .copy() pour
copier l’array dans un nouvel array

 L’indexation des arrays est similaire à celle des listes :


 Accéder à un élément : [i]
 Si on veut plusieurs éléments, on peut utiliser [i:j]
 On peut aussi fixer des valeurs pour plusieurs éléments : array[i:j]=100
 On peut aussi modifier toutes les valeurs de l’array : array[:]=100
 Si on veut garder l’array initial on utilise .copy()

Générer un array avec des valeurs entre 0


et 8, afficher les éléments 1 à 6 puis
modifiez les élément 6 à 8 en leur fixant la
valeur de 22.
9
Passage au niveau bi-dimensionnel

 On est dans le cas d’une matrice


 Pour fixer une valeur pour tous les éléments d’une ligne, on utilise
array[i]=22
 Pour fixer une valeur pour un seul élément, on utilise array[i][j]=22
 On peut aussi sélectionner des sous-parties d’un array à 2 dimensions

10
Opérations matricielles sur les arrays

 On peut créer une matrice (un array) en utilisant la fonction


.reshape :
 Pour créer une matrice 4 x 5 à partir d’une suite de 20 nombres, on utilise :
np.arange(20).reshape((4,5))
 Transposée : .T
 Produit matriciel np.dot()
Construire une matrice rectangulaire de
taille 3 x 2 avec une suite de nombres
commençant à 5, calculer le produit de la
transposée par la matrice.

11
Les fonctions universelles sur les arrays

 Il existe d’autres fonctions :  Sur des booléens :


 np.where(condition, A, B)  np.any() au moins un true
permet de faire une condition de
manière simple  np.all() tous true

 np.sum()  Les tris :


 np.mean()  np.sort()
 np.std()  Sur des chaînes :
 np.var()  np.unique() permet d’obtenir
chaque valeur unique
 np.median()
 np.in1d(,) permet de vérifier si
 np.percentile() les éléments du 1er membre se
trouvent dans le second

Générer un array de nombres aléatoires puis remplacer les 12

valeurs plus petites que 0 par 0. Trier l’array obtenu


Autres fonctions

 Il existe un grand nombre de fonctions appelées Universal Array


Function :
 np.sqrt()
 np.exp()
 np.maximum(A,B)
 np.add
 np.random.randn() générer des nombres aléatoires d’une distribution
normale
 … Générer un array de nombres aléatoires
tirés d’une loi normale et en calculer
l’exponentielle 13
sauvegarder et charger des arrays

 On utilise :
 np.save(‘mon_array’,mon_array) pour sauver un array
 np.load(‘mon_array.npy’) pour charger un array
 np.savez(‘ziparray.npz’, x=mon_array, y=mpn_array2)
sauvegarder en zip plusieurs arrays
 np.savetxt(‘textfile.txt’, mon_array, delimiter=‘;’) pour
sauvegarder un array dans un fichier texte
 np.loadtxt(‘textfile.txt’, delimiter=‘;’) pour charger un array
depuis un fichier texte
Générer une matrice simple et
sauvegarder cette matrice dans array.npy
14
puis dans array.txt
Introduction à pandas

15
Un nouvel objet : series

 On utilise en général numpy et pandas pour ce type d’analyses

 Les Series sont indexées, c’est leur avantage sur les arrays de NumPy
 On peut utiliser les fonctions .values et .index pour voir les différentes parties de chaque
Series
 On définit une Series par Series([,], index=[‘’,’’,])
 On peut appeler un élément avec ma_serie[‘France’]
 On peut aussi faire des conditions :
 ma_serie[ma_serie>5000000]
 ‘France’ in ma_serie
 Les objets Series peuvent être transformés en dictionnaires en utilisant :
 .to_dict()
Définir un objet Series comprenant la
population de 5 pays puis afficher les pays 16

ayant une population > 50’000’000.


D’autres opérations sur les objets series

 Pour trouver des données manquantes, on peut utiliser


pd.isnull() ou pd.notnull()
 On peut faire la somme de deux séries, dans ce cas pandas ajoute
les valeurs présentes et agrandit l’objet si nécessaire
 Pour définir le nom de l’objet, on utilise .name
 Pour définir le titre de la colonne des observations, on utilise
.index.name
Définir les noms de l’objet et de la colonne
des pays pour la Series précédente

17
Les dates avec pandas

 Le format des dates en Python est le suivant : '2011-01-01 00:00:00‘


 On peut générer des dates avec la fonction pd.date_range() avec
différente fréquences freq=
 On peut utiliser ces dates comme index dans un DataFrame ou dans un
objet Series
 On peut changer la fréquence en utilisant .asfreq()
 Pour transformer une chaine de caractère en date, on utilise
to_datetime avec l’option dayfirst à True si on est dans le cas
français
 On pourra aussi spécifier un format pour accélérer le
processus ‘%Y%m%d’ Créez un objet Series et ajoutez des
dates partant du 3 octobre 2017 par
18
jour jusqu’à aujourd’hui.
Aller plus loin avec les dates

 On peut définir avec pandas des fuseaux horaires


 On utilise .tz_localize("France/Paris")
 On peut changer de fuseau horaire avec .tz_convert()
 On peut aussi travailler sur des périodes plutôt que sur des dates
 On utilise pd.period_range()

Créez un objet Series avec des


résultats par trimestres à partir de
2012.
19
Les dataframe – un petit air de R
En Python, on peut copier/coller des
tableaux du web par exemple en utilisant
la fonction pd.read_clipboard()

 Les DataFrame sont des objets très souples pouvant être construits de
différentes façon
 On peut les construire en récupérant des données copier / coller, où
directement sur Internet, ou en entrant les valeurs manuellement
 Les DataFrame se rapprochent des dictionnaires et on peut construire
ces objets en utilisant DataFrame(dico)
 De nombreux détails sur la création des DataFrame se trouve sur ce site
 http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.html
Construire un dictionnaire avec des
produits et des prix puis afficher le
DataFrame obtenu en transformant
20 ce
dictionnaire
Opérations simples sur les DataFrame
Récupérez les données de Wikipédia sur
les résultats de NBA et obtenir les
 Affichage du nom des colonnes : .columns statistiques descriptives pour les variables
 On peut afficher une seule colonne avec mon_frame[‘nom_colonne’] quantitatives.
 On peut utiliser mon_frame.nom_colonne dans certaines On utilisera plutôt Chrome ou Firefox pour
conditions ce type de tâches (éviter IE)
 On peut afficher une seule ligne avec mon_frame.iloc[3]
 On peut supprimer une colonne
del mon_frame[‘nom colonne’]

import webbrowser
url=‘https://en.wikipedia.org/wiki/List_of_all-time_NBA_win-loss_records'
webbrowser.open(url)
#puis
pd.read_clipboard() 21
L’indexation et la réindexation
 Avec les objets pandas, l’indexation est simplifiée
 Pour afficher les libellés des lignes, on utilise .index
 Les index ne peuvent pas être modifié comme les autres
valeurs
 Pour modifier les indices, on utilise la fonction
.reindex([])
 Cette fonction permet aussi de remplir les nouvelles valeurs avec
l’option fill_value=0
 On peut aussi remplir des valeurs à partir de celles présentes en
utilisant method=‘ffill’

22
L’indexation sur les dataframes à 2 dimensions
 Sur un DataFrame à deux dimensions, on peut réindexer
les colonnes et les lignes :
 Pour les lignes, on utilise .reindex()
 Pour les colonnes, on utilise .reindex(columns= )
Construire un objet DataFrame à 2
 On peut le faire simultanément en utilisant .iloc[
liste_des_lignes, liste_des_colonnes ] dimensions avec des labels pour les lignes
et pour les colonnes.
 Pour supprimer des éléments, on peut utiliser : Ajouter une colonne en réindexant les
 .drop(‘nom_index’) ou .drop(no. index) pour une ligne colonnes puis supprimer cette colonne.
entière
Finalement, afficher les valeurs plus
 .drop(‘nom_index, axis=1) pour une colonne entière grandes que 4.
 Pour sélectionner des éléments, on utilise :
 [‘nom_index’] ou [no. index] ou [condition] pour
sélectionner par colonne
 .iloc[‘nom_index’] ou .iloc[no. index] pour sélectionner
par ligne

23
Combiner des dataframes

 Si on utilise +, on n’obtient que des résultats pour les éléments


communs
 On utilise .add avec frame1.add(frame2, fill_value=0)

Construire deux frames avec quelques


colonnes et lignes en commun puis
combinez-les.

24
Les tris

 Pour effectuer des tris, on utilise :


 .sort_index pour le tri des index
 .sort_values(inplace=True) pour le tri des données
 .rank affiche le rang des observations
Trier les données NBA en fonction de la
variable Pct.

25
Les statistiques simples
On définit une valeur manquante en
utilisant np.nan
 .sum(axis=0) permet de faire une somme par colonne
 .sum(axis=1) permet de faire une somme par ligne
 .min() et .max() donnent le minimum par colonne
 .idxmin() et .idxmax() donnent l’index du minimum et du
maximum
 .describe() affiche un tableau de statistiques descriptives par
colonne
 .corr() pour calculer la corrélation entre les colonnes
Obtenir les différentes statistiques 26
descriptives pour les données NBA.
Le traitement des données manquantes

 Les données manquantes sont identifiées par NaN


 .dropna() permet de retirer les données manquantes dans un
objet Series et l’ensemble d’une ligne dans le cas d’un
DataFrame
 Pour éliminer par colonne, on utilise .dropna(axis=1)
 Remplacer toutes les données manquantes .fillna(valeur)

27
Index multiples (aller plus loin)

 On peut avoir deux niveaux d’indices :


 ma_serie =
Series(np.random.randn(6),index=[[1,1,1,2,2,2],['a','b','c','
a','b','c']])
 On peut transformer cette série en DataFrame avec .unstack()

28
Importer des données externes
Importez le fichier demo_ventes.csv
depuis Python dans frame_ventes.

 Importer :  Exporter :
 Cas des .csv : pd.read_csv()  On utilise
 Par défaut, la première colonne est le .to_csv(‘nom_du_fichier.csv’)
nom des variables  On peut faire varier sep= et
 On peut utiliser header=None columns= pour sélectionner
quelques colonnes
 Autre méthode :
pd.read_table(‘nom_du_fichie
r.csv’, sep=‘,’)
 Pour en savoir plus :
https://docs.python.org/2/library/cs
v.html
 Pour extraire uniquement les n
premières lignes, on ajoute
nrows=n

29
D’autres types de données

 JSON par exemple.


 Les objets JSON ressemblent à des dictionnaires
 On utilise le module json puis la fonction json.loads() pour transformer une
entrée JSON en objet json

 HTML aussi.
 On utilise pd.io.html.read_html(url) et on doit installer les bibliothèques
beautifulsoup et html5lib
 On prend le premier élément de l’objet obtenu que l’on met dans un DataFrame :
dframe_list[0]
Importez un tableau en html depuis la page
http://www.fdic.gov/bank/individual/failed/banklist.html
30
Importer depuis Excel

 Utilisation des bibliothèques xlrd et openpyxl compris dans Anaconda


 On utilise pd.ExcelFile(‘fichier.xlsx’) et
xlsfile.parse('Sheet1')

Importez un fichier Excel depuis


python. On utilisera excel-data.xlsx

31
importer et exporter depuis des bases de
données
 Pandas possède une fonction read_sql() qui permet d’importer
directement des bases de données ou des queries dans des
DataFrame
 Il faut tout de même un connecteur pour accéder aux bases de
données
read_sql_table(table_name, con[, schema, ...]) Read SQL database table into a DataFrame.

read_sql_query(sql, con[, index_col, ...]) Read SQL query into a DataFrame.

read_sql(sql, con[, index_col, ...]) Read SQL query or database table into a DataFrame.

DataFrame.to_sql(name, con[, flavor, ...]) Write records stored in a DataFrame to a SQL database.

32
Bases de données SQL

 On utilise un connecteur, il s’agit d’une bibliothèque permettant


de se connecter à une base de données
 Le plus adapté à pandas est SQLalchemy

 Suivant le type de base de données, on utilisera différents codes


df = pd.read_sql_query("SELECT * from Salaries", engine)

Importez la base de données SQLite


salaries et récupérez la table
Salaries dans un DataFrame 33
Modifier des jeux de données

 Les jointures
 On veut joindre des jeux de données en utilisant des clés (variables communes)
 pd.merge permet de joindre deux DataFrame, on utilise comme options
on=‘key’
 On peut utiliser comme option how=, on peut avoir left dans ce cas, on garde
le jeu de données à gauche et pour les données de droite des valeurs
manquantes sont ajoutées. Si on utilise outer, on gardera toutes les valeurs
des deux jeux de données
 On peut avoir plusieurs clés et faire une jointure sur les deux clés
on=[‘key1’,’key2’] avec l’option how=‘outer’
 Pour plus de détails : http://pandas.pydata.org/pandas- Joindre les deux dataframes de
docs/dev/generated/pandas.DataFrame.merge.html ventes en utilisant l’id.

34
Modifier des jeux de données

 Jusqu’ici on a utilisé des clés pour joindre des jeux de données, on peut aussi utiliser des
index
 On utilise toujours pd.merge avec comme option right_index=True pour utiliser l’indice
pour le DataFrame de droite. On peut faire la même chose pour le DataFrame de gauche

 Concaténer :
 Avec NumPy : on crée des arrays et on utilise np.concatenate(, axis = 1). Ceci va permettre d’ajouter
des colonnes et d’obtenir une plus grande matrice. Si on prend axis=0, on ajoutera des lignes
 Avec pandas : on crée des Series et on utilise pd.concat(), on choisit aussi axis= et si on utilise 1,
alors les Series sont transformées en DataFrame. On peut aussi ignorer les index afin d’éviter les
répétitions d’index en utilisant ignore_index=True
 Pour plus de détails : http://padas.pydata.org/pandas-docs/stable/generated/pandas.concat.html

Créez deux Series et utilisez


pd.concat pour les concaténer par
35
colonne.
Empiler des données Créez un DataFrame 4 x 3 avec des
index sur les lignes et les colonnes.
Transformez ce DataFrame en
utilisant stack.

 Utilisation de stack et unstack


 Ces fonctions permettent de transformer des données en
colonnes en données sur une seule colonne (idéal pour les
traitements du type ANOVA) et l’inverse.
 Unstack peut prendre comme paramètre n’importe quelle variable
afin de savoir comment sera orienté le DataFrame obtenu
 Pandas va éliminer les valeurs manquantes lorsqu’on fait un stack.
Pour conserver les données manquantes, on utilse l’option
dropna=False
36
Vérifier s’il y a des lignes dupliquées

 On utilise .duplicated() ou .drop_duplicates() dans le cas où


on désire effacer les lignes se répétant
 On peut se concentrer sur une seule variables en entrant
directement le nom de la variable. Dans ce cas, c’est la première
apparition qui compte. Si on veut prendre la dernière apparition,
on utilise l’option take_last=True

37
Autres actions sur les données

 Mapping :
 Le mapping permet, entre autres, d’identifier des entrées d’un jeu de données afin
d’ajouter une nouvelle variable qui correspond à ces éléments
 Par exemple, si on a une colonne avec des noms de villes, on pourra créer un dictionnaire
associant un pays à chaque ville et en utilisant la fonction .map(), on obtiendra une
nouvelle colonne
 dframe[‘pays'] = dframe[‘ville'].map(dico_pays)
 Remplacer :
 .replace(valeur, valeur_remplacement) Créez un DataFrame avec comme
 On peut utiliser des listes ou des dictionnaires variables 4 villes de différents pays
et leur population. Créez un
 Renommer des index : dictionnaire associant chaque ville à
 .rename(index=, columns=) un pays. Ajoutez une colonne pays à
votre DataFrame en utilisant
38
.map().
Discrétiser

 Pour discrétiser, on utilise la fonction pd.cut, on va définir une liste de


points pour discrétiser et on entre cette liste comme second paramètre
de la fonction
 Une fois discrétisé, on peut afficher les modalités obtenues en utilisant
.categories
 On peut aussi compter les occurrence en utilisant pd.value_counts()
 Il est aussi possible d’entrer le nombre de segments comme second
paramètre
 Cette fonction sera utile pour les histogrammes
Créez une variable dans le
dataframe des ventes pour obtenir
 On utilisera aussi qcut() des niveaux de ventes.

39
L’utilisation de GroupBy sur des DataFrame

 .groupby permet de rassembler des observations en fonction


d’une variable dite de groupe
 Par exemple, frame.groupby(‘X’).mean() donnera les moyennes par
groupes de X
 On peut aussi utiliser .size() pour connaître la taille des groupes et
utiliser d’autres fonctions (.sum())
 On peut effectuer de nombreuses opérations de traitement avec
le groupby

40
Exemple complet

- Données sur les salaires

- On utilise le groupby() pour rassembler les types d’emploi

- Et on calcule des statistiques pour chaque type

- On peut utiliser la fonction .agg() avec par exemple ‘mean’ comme paramètre

- On utilise aussi fréquemment la fonction apply() combinée à une fonction lambda

41
L’évaluation d’expressions

 On peut utiliser la méthode .eval() pour tester une expression sur


un dataframe
 nba.eval("pts. >1000")
 nba.eval("level=(pts. >1000)")
 Pour utiliser une variable dans une expression, on utilise @ devant le nom
de la variable
 Pour faire une requête, on peut utiliser .query() avec une
expression
Sur les données NBA, essayer d’utiliser les deux approches
pour modifier une variable et ensuite extraire les valeurs
plus grandes que le quantile à 99%
42
43

Vous aimerez peut-être aussi