Voici une liste des commandes de base pour commencer à travailler avec Matplotlib et Pandas et Numpy.

1. Charger un dataset

On charge un dataset basic (fleurs Iris très connu). On s’en sert ensuite dans l’affichage d’un nuage de points avec Matplotlib.

from sklearn.datasets import load_iris
iris = load_iris()

n_samples, n_features = iris.data.shape
print(n_samples)
print(n_features)

# 150
# 4

2. Afficher un nuage de points (scatter plot)

On considère travailler avec un array (150,4). Voir point 1.

# La commande qui suit permet de ne pas avoir de problème avec l'affichage de graphiques dans Jupyter Notebook 
%matplotlib inline

Affichage du scratter plot:

from matplotlib import pyplot as plt

x_index = 1
y_index = 3

# Ce formateur permet de remplacer les index des classes d'iris par leur nom dans la légende
formatter = plt.FuncFormatter(lambda i, *args: iris.target_names[int(i)])

plt.scatter(iris.data[:, x_index], iris.data[:, y_index], c=iris.target)
plt.colorbar(ticks=[0, 1, 2], format=formatter)
plt.xlabel(iris.feature_names[x_index])
plt.ylabel(iris.feature_names[y_index])

Résultat:

image


3. Manipuler des Numpy Arrays

3.1. Générer un tableau aléatoire

import numpy as np

X = np.random.random((3,5))
print(X)

Résultat:

[[0.74271281 0.89627097 0.95309957 0.48770972 0.3841344 ]
 [0.32855405 0.11656708 0.63427992 0.51111629 0.53846283]
 [0.99568791 0.44366564 0.0842925  0.12422041 0.38149375]]

3.2. Accéder à des éléments d’un numpy array

# Accéder à un seul élément
print(X[0,0])

# Accéder à une ligne
print(X[0,:]) ou print(X[0])

# Accéder à une colonne
print(X[:,0]

Résultat:

0.7427128108295802
[0.74271281 0.89627097 0.95309957 0.48770972 0.3841344 ]
[0.74271281 0.32855405 0.99568791]

3.3. Faire une transposée de Matrice (les lignes deviennent les colonnes)

print(X.T)

Résultat:

[[0.74271281 0.32855405 0.99568791]
 [0.89627097 0.11656708 0.44366564]
 [0.95309957 0.63427992 0.0842925 ]
 [0.48770972 0.51111629 0.12422041]
 [0.3841344  0.53846283 0.38149375]]

3.4. Faire un range sans être gêné par le dernier élement

Cette méthode permet d’obtenir un tableau à une dimension allant d’une valeur de départ à une valeur de fin avec un nombre donné d’éléments.

# la fonction linspace(premier, dernier, n) évite tout désagrément
np.linspace(1., 4., 6)

Résultat:

# array([ 1. ,  1.6,  2.2,  2.8,  3.4,  4. ])

3.5. Incrémenter la dimension d’un array (Permet également de convertir explicitement un array à 1 dimension en un vecteur ligne ou vecteur colonne.)

A = np.array([2, 0, 1, 8])
print(A)
A.shape

# [2 0 1 8]
# (4,)


B = A[np.newaxis, :]
print(B)
B.shape

# [[2 0 1 8]]
# (1, 4)

C = A[:, np.newaxis]
print(C)
C.shape

# [[2]
  [0]
  [1]
  [8]]
# (4,1)

Alternatives:

np.expand_dims(A, 1)  # équivaut à A[:, np.newaxis]
np.expand_dims(A, 0)  # équivaut à A[np.newaxis, :]

ou

A.reshape(A.shape + (1,))  # équivaut à A[:, np.newaxis]
A.reshape((1,) + A.shape)  # équivaut à A[np.newaxis, :]

3.6. Convertir une liste Python en Numpy Array

ma_liste = [1,2,3]
x = np.array(ma_liste)

3.7. Créer un tableau de 20 zéros

np.zeros(20)

3.8. Créer un tableau de 20 uns

np.ones(20)

3.9. Créer un tableau de 20 neuf

np.ones(20) * 9

3.10. Créer un tableau d’entiers de 20 à 50

np.arange(20,51)

3.11. Créer un tableau d’entiers pairs entre 20 et 50

np.arange(20,51,2)

3.12. Créer une matrice 3x3 avec les valeurs de 0 à 8

np.arange(0,9).reshape(3,3)

3.13. Créer une matrice identité 3x3

np.eye(3)

3.14. Générer un nombre aléatoire entre 0 et 1

np.random.rand(1)

3.15. Générer un tableau de 25 nombres aléatoires échantillonnés à partir d’une distribution normale standard

np.random.randn(25)

3.16. Créer un tableau de 50 points espacés linéairement entre 0 et 1

np.linspace(0,1,20)

3.17. Calculer la somme de toutes les colonnes d’une matrice

ma_matrice.sum(axis=0)

3.18. Calculer l’écart-type des valeurs d’une matrice

ma_matrice.std()

4. Manipuler des Scipy Sparse Matrices

Ces matrices sont parfois utiles lorsque le dataset est extrèmement grand (millions de features) et qu’il n’y a presque que des 0 pour un échantillon donné.

On crée une matrice avec des données aléatoires

from scipy import sparse

X = np.random.random((10, 5))
print(X)

Résultat:

[[0.74668664 0.28468523 0.31235423 0.85889384 0.44178508]
 [0.42935032 0.12811469 0.10010876 0.44757517 0.85568623]
 [0.52500676 0.81764407 0.32380153 0.41696393 0.46913849]
 [0.38276909 0.93648265 0.19733164 0.42392672 0.75220776]
 [0.71149141 0.21479105 0.93260534 0.44922132 0.1069613 ]
 [0.81701    0.85721634 0.43327147 0.07404298 0.00268589]
 [0.41816508 0.45835663 0.13466681 0.65741327 0.19939561]
 [0.87886815 0.90599216 0.60680106 0.52665484 0.69824682]
 [0.75469648 0.89312007 0.10350947 0.48109062 0.61979146]
 [0.90195641 0.48118575 0.95517067 0.86300827 0.36144463]]

On fixe la majorité des éléments à 0

X[X < 0.7] = 0
print(X)

Résultat:

 [[0.74668664 0.         0.         0.85889384 0.        ]
 [0.         0.         0.         0.         0.85568623]
 [0.         0.81764407 0.         0.         0.        ]
 [0.         0.93648265 0.         0.         0.75220776]
 [0.71149141 0.         0.93260534 0.         0.        ]
 [0.81701    0.85721634 0.         0.         0.        ]
 [0.         0.         0.         0.         0.        ]
 [0.87886815 0.90599216 0.         0.         0.        ]
 [0.75469648 0.89312007 0.         0.         0.        ]
 [0.90195641 0.         0.95517067 0.86300827 0.        ]]

On convertit X en une Matrice CSR (Compressed-Sparse-Row)

X_csr = sparse.csr_matrix(X)
print(X_csr)

Résultat:

  (0, 0)	0.7466866354064811
  (0, 3)	0.858893836600347
  (1, 4)	0.8556862339513924
  (2, 1)	0.8176440715795563
  (3, 1)	0.9364826540107359
  (3, 4)	0.7522077587621511
  (4, 0)	0.7114914132345445
  (4, 2)	0.9326053405778985
  (5, 0)	0.8170100021133657
  (5, 1)	0.8572163407003378
  (7, 0)	0.8788681533625899
  (7, 1)	0.9059921645080171
  (8, 0)	0.7546964834006666
  (8, 1)	0.893120069181746
  (9, 0)	0.9019564067395904
  (9, 2)	0.9551706684658897
  (9, 3)	0.8630082740227074

On rétablit la Matrice Sparse en numpy array

print(X_csr.toarray())

Résultat:

[[0.74668664 0.         0.         0.85889384 0.        ]
 [0.         0.         0.         0.         0.85568623]
 [0.         0.81764407 0.         0.         0.        ]
 [0.         0.93648265 0.         0.         0.75220776]
 [0.71149141 0.         0.93260534 0.         0.        ]
 [0.81701    0.85721634 0.         0.         0.        ]
 [0.         0.         0.         0.         0.        ]
 [0.87886815 0.90599216 0.         0.         0.        ]
 [0.75469648 0.89312007 0.         0.         0.        ]
 [0.90195641 0.         0.95517067 0.86300827 0.        ]]

5. Visualisation des données avec Matplotlib

5.1. Afficher une fonction simple

import matplotlib.pyplot as plt

# Afficher une ligne
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x))

Résultat:

image


5.2. Afficher un nuage de points (scatter plot)

import matplotlib.pyplot as plt

x = np.random.normal(size=500)
y = np.random.normal(size=500)
plt.scatter(x, y)

Résultat:

image


5.3. Tracer une image

import matplotlib.pyplot as plt

x = np.linspace(1, 12, 100)
y = x[:, np.newaxis]

im = y * np.sin(x) * np.cos(y)

plt.imshow(im)

Résultat:

image


5.4. Tracer les contours

import matplotlib.pyplot as plt

x = np.linspace(1, 12, 100)
y = x[:, np.newaxis]

im = y * np.sin(x) * np.cos(y)

plt.contour(im)

Résultat:

image


5.5. Gallerie d’exemples

Des centaines d’exemples sont disponibles sur le site de Matplotlib. En exécutant la commande suivante dans votre notebook, le code source sera téléchargé. Vous n’aurez plus qu’à le ré-excuter pour qu’un graphique s’affiche.

%load http://matplotlib.org/mpl_examples/pylab_examples/ellipse_collection.py

5.6. Graphique 3D

# 3D 
from mpl_toolkits.mplot3d import Axes3D

ax = plt.axes(projection='3d')
xgrid, ygrid = np.meshgrid(x, y.ravel())
ax.plot_surface(xgrid, ygrid, im, cmap=plt.cm.jet, cstride=2, rstride=2, linewidth=0)

Résultat:

image


5.7. Afficher matplotlib dans Jupyter Notebook et tracer un chart façon objet

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np
x = np.arange(0,100)
y = x*2
z = x**2

fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.plot(x,y)

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('title')

Résultat:

image


5.8. Afficher une petit chart à l’intérieur d’un (grand) chart

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np
x = np.arange(0,100)
y = x*2
z = x**2

fig = plt.figure()

ax1 = fig.add_axes([0,0,1,1])
ax1.plot(x,y,color='r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')

ax2 = fig.add_axes([.2,.5,.2,.2])
ax2.plot(x,y,color='r')
ax2.set_xlabel('x')
ax2.set_ylabel('y')

Résultat:

image


5.9. Zoomer sur une partir du chart

ax2.set_xlim([20,22])
ax2.set_ylim([30,50])

5.10. Afficher 2 charts les uns à côté des autres

fig, axes = plt.subplots(nrows=1, ncols=2,figsize=(12,2))

axes[0].plot(x,y,color="purple", lw=3, ls='-')
axes[1].plot(x,z,color="red", lw=3, ls='--')

6. Pandas

6.1. Charger, convertir un CSV en dataframe et afficher ses 5ère lignes

import pandas as pd
df = pd.read_csv('mon_dataset.csv')
df.head()

6.2. Afficher le nom des colonnes du dataframe

df.columns

6.3. Afficher le nombre d’éléments uniques d’une colonne d’un dataframe

len(df['colonne_name'].unique())
# Or
df['colonne_name'].nunique()

6.4. Afficher les éléments uniques d’une colonne d’un dataframe

df['colonne_name'].unique()

6.5. Afficher les 5 groupes de données ayant le plus d’éléments dans la colonne X

df.groupby("GroupByGroupe").count().sort_values('X', ascending=False).iloc[:5]['X']

6.6. Afficher le nombre de fois que des valeurs sont retournées dans les éléments d’une colonne

df['ma_colonne'].value_counts()
# Pour afficher le top 5
df['ma_colonne'].value_counts().iloc[:5]

6.7. Combien de ligne d’un dataframe n’ont pas la string “blabla” dans les valeurs de la colonne ma_colonne

sum(df['ma_colonne'].apply(lambda nom: 'blabla' not in nom))

6.8. Afficher le nombre de lignes que possède un dataframe ayant la valeur “toto” dans la colonne ma_colonne

df[df["ma_colonne"] == "toto"]

6.9. Pour une série temporelle, combien d’éléments y a-t-il dans notre dataframe avec une date supérieure à l’annéee 2020

sum(pd.to_datetime(df['date']).apply(lambda date: date.year) == 2020)

6.10. Exploser le dict d’une colonne d’un dataframe

Pour exploser un dictionnaire présent dans une colonne de son dataframe et ajouter les éléments du dictionnaire en tant que nouvelles colonnes dans le même DataFrame d’origine, on peut utiliser le code suivant:

df = pd.concat([df, df['ma_colonne'].apply(pd.Series)], axis=1)
df.drop('ma_colonne', axis=1, inplace=True)

6.11. Exploser un JSON imbriqué avec un structure hiérarchique

# Utilisez json_normalize pour exploser le dictionnaire dans un nouveau dataframe
new_df = pd.json_normalize(df['ma_colonne'])

# Ajoutez les colonnes résultantes à votre DataFrame d'origine
df = pd.concat([df, new_df], axis=1)

# Eventuellement supprimez la colonne d'origine contenant le dictionnaire
df.drop('ma_colonne', axis=1, inplace=True)

6.12. Renommer des colonnes

df.rename(
    columns={
        "ma_ma_colonne1": "ma_colonne1",
        "ma_ma_colonne2": "ma_colonne2",
    },
    inplace=True,
)

6.13. Retourner la première ligne d’un dataframe dont la valeur est supérieur à 0

import pandas as pd
condition = df['ma_colonne'] > 0

# la méthode "loc" permet d'obtenir les lignes qui remplissent la condition
# puis iloc permet de retourner la première
first_row = df.loc[condition].iloc[0]

Debugging Misc

“Dumper” un objet

def dump(obj):
   for attr in dir(obj):
       if hasattr( obj, attr ):
           print( "obj.%s = %s" % (attr, getattr(obj, attr)))

Afficher des couleurs dans le terminal

print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')

image

Voir toutes les couleurs disponibles:

def print_format_table():
    """
    prints table of formatted text format options
    """
    for style in range(8):
        for fg in range(30,38):
            s1 = ''
            for bg in range(40,48):
                format = ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
            print(s1)
        print('\n')

print_format_table()

Voici quelques examples:

image