mosaique (un peu de tout)#
Quand les exercices font partie d’une série d’exercices, faites les dans l’ordre, ils se servent des précédents…*
Importer numpy et pandas indiquer la version des bibliothèques
# votre code ici
Importer pyplot de matplotlib et mettez les plots en mode notebook
# votre code ici
[note importante]
avec le mode notebook, il est souvent utile de déclarer explicitement que la cellule va produire une figure avec
plt.figure() (ou autre fonction qui crée une figure ou des sous-figures)
sinon votre dessin va être inséré dans la dernière figure ouverte, souvent c’est plus haut dans le notebook…
# par exemple, faites
plt.figure()
# avant de faire
plt.plot(X, Y)
# ...
Exercices sur la suite de Syracuse#
La suite de Syracuse#
pour chaque \(n\in \mathbb{N^*}\), on définit une suite de Syracuse par:
\(u_0 = n\)
\(u_{p+1}={\begin{cases}{\dfrac {u_{p}}{2}}&{\mbox{si }}u_{p}{\mbox{ est pair,}}\\3u_{p}+1&{\mbox{si }}u_{p}{\mbox{ est impair.}}\end{cases}}\)
Les consignes#
la suite s’arrête après le premier \(1\)
lever une exception si le type de l’argument n’est pas valide (TypeError), pensez à utiliser
isinstancelever une exception si la valeur de l’argument n’est pas valide (ValueError)
pensez à mettre un message explicatif dans vos exceptions
mettez un docstring à la fonction
Implémentation de la suite de Syracuse#
implémenter une fonction syracuse qui retourne la liste de la suite des nombres de Syracuse pour un \(u_0\) donné sous les conditions précédentes
par exemple
>>> syracuse(10)
[10, 5, 16, 8, 4, 2, 1]
Exécutions:
tester votre fonction dans les cas suivants (n vaut 0, “toto”, 4 et 27) en rattrapant les exceptions levées
# EXERCICE
def syracuse(n):
# votre code ici
pass
# pour vérifier
syracuse(10) == [10, 5, 16, 8, 4, 2, 1]
False
# pour vérifier
try:
syracuse("toto")
except TypeError:
print("OK your code raises TypeError on a str")
# pour vérifier
try:
syracuse(-12)
except ValueError:
print("OK your code raises TypeError on a str")
Plotter la suite de Syracuse#
[indications]:
attention les sous-figures sont appelées axis en matplotlib.pyplot
[rappels]:
une figure peut être composée de sous-figures
les sous-figures sont appelées des Axis (pensez toujours: axis = subfigure)
créer une figure globale de titre syracuse
créer six sous-figures en une grille de 2 lignes et 3 colonnes en plottant 6 suites de syracuse - par exemple pour les entrées 4, 8, 12, 5, 10 et 20
donner la même taille aux sous-figures
donner un titre aux sous-figures
inputs = (4, 8, 12, 5, 10, 20)
# à vous
...
Ellipsis
Exercice: vectorization de fonctions#
implémenter la fonction valeur absolue sans utiliser
numpy.absni aucune fonction numpy dans le corps de la fonctioncréer un
numpy.ndarraycontenant des flottants linéairement espacés entre -100 et 100appliquez votre fonction à ce tableau
quel problème constatez-vous ?
[indications]
si vous voulez que votre fonction (\(abs: float \rightarrow float)\) puisse s’appliquer à des tableaux numpy
il faut la vectoriser en utilisant le décorateur
numpy.vectorize
# votre code ici
def abs (n):
# votre code ici
pass
# votre code ici
# x = ...
# abs(x)
# pensez à rattraper l'erreur
3D plotting#
implémentez en utilisant les opérateurs et fonctions numpy une fonction (dans le genre de) \(f(x, y) = x^2 + y^2\)
plotter votre fonction en 3D
# votre code ici
Travail sur des fichiers csv#
[consigne]
ne pas utiliser de boucles python sur les tableaux csv
Lecture de fichiers csv#
Lecture d’un (petit) csv sans noms de colonnes#
créer une pandas.DataFrame df1 à partir du (petit) fichier
data/weight_height_no_names.csvil ne comporte pas de noms de colonnes
passer lui la liste des colonnes =[“genre”, “taille”, “poids”] à la création de la DataFrame
afficher la taille de la DataFrame
# à vous
df1 = ...
df1
Ellipsis
# ceci doit afficher True
df1.shape == (7, 3)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[13], line 2
1 # ceci doit afficher True
----> 2 df1.shape == (7, 3)
AttributeError: 'ellipsis' object has no attribute 'shape'
Lecture d’un (petit) csv avec des lignes de commentaires mais sans noms de colonnes#
créer une pandas.DataFrame df2 à partir du (petit) fichier
data/weight_height_no_comments.csvles valeurs sont séparées par des ‘;’
ce fichier comporte 3 lignes de commentaires
il ne comporte pas de noms de colonnes
mettez dans la DataFrame existante la liste de colonnes: [“Gender”, “Height”, “Weight”]
# le contenu du fichier
%cat data/weight_height_no_comments.csv
ce fichier comporte le genre, la taille et le poids
de personnes, se trouve sur kaggle dans la page
https://www.kaggle.com/mustafaali96
Male;71.6408051192206;213.741169489411
Male;64.7663291334055;167.127461073476
Male;69.2830700967204;189.446181386738
Male;69.2437322298112;186.434168021239
Male;67.6456197004212;172.186930058117
Male;72.4183166259878;196.028506330482
Male;63.974325721061;172.883470208780
Male;69.6400598997523;185.983957573130
Male;67.9360048540095;182.426648013226
# à vous
df2 = ...
# ceci doit afficher True
(
df2.shape == (9, 3)
and df2.columns[0] == 'Gender'
)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[16], line 3
1 # ceci doit afficher True
2 (
----> 3 df2.shape == (9, 3)
4 and df2.columns[0] == 'Gender'
5 )
AttributeError: 'ellipsis' object has no attribute 'shape'
Lecture d’un (gros) fichier csv avec le nom des colonnes et sans commentaires#
créer une pandas.DataFrame df à partir du (gros) fichier
data/weight_height.csvles valeurs sont séparées par des ‘;’
la première ligne comporte le nom des colonnes
cette DataFrame servira dans les fonctions suivantes
# votre code ici
df = ...
df.head()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[18], line 1
----> 1 df.head()
AttributeError: 'ellipsis' object has no attribute 'head'
# ceci doit afficher True
(
df.shape == (10000, 3)
and df.columns[0] == 'Gender'
)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[19], line 3
1 # ceci doit afficher True
2 (
----> 3 df.shape == (10000, 3)
4 and df.columns[0] == 'Gender'
5 )
AttributeError: 'ellipsis' object has no attribute 'shape'
Informations générales sur une DataFrame#
on veut en savoir plus sur cette DataFrame df précédente
affichez les types des colonnes
# à vous
affichez un résumé / des informations générales
# à vous
Manipulations des colonnes de la DataFrame#
Conversions#
convertissez les tailles de inches à mètres (\(cm = in \times 2.54\))
convertissez les poids de pounds à kg (\(kg = \dfrac{lb}{2.2046}\))
# votre code ici
# et n'hésitez pas à recharger le fichier
# pour partir d'un truc propre
...
# df.head()
Ellipsis
Ajout d’une colonne#
calculer l’indice de masse corporelle \( i = \frac{weight}{height^2} \)
et rangez-le dans une colonneMass Indexde la DataFrame
# votre code ici n'hésitez pas à recharger le fichier
# pour partir d'un truc propre
df = ...
df.head()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[24], line 1
----> 1 df.head()
AttributeError: 'ellipsis' object has no attribute 'head'
Catégorisation#
ajouter une colonne “Gender-cat” dans laquelle le genre a été catégorisé (le type de la colonne doit être
category)en option, renommez les termes de cette catégorie en minuscules
maleetfemale
# votre code ici n'hésitez pas à recharger le fichier
# pour partir d'un truc propre
# df = ...
df.head()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[26], line 1
----> 1 df.head()
AttributeError: 'ellipsis' object has no attribute 'head'
df.dtypes
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[27], line 1
----> 1 df.dtypes
AttributeError: 'ellipsis' object has no attribute 'dtypes'
Calculs sur une colonne#
compter le nombre de valeurs différentes dans la colonne “Gender”
# à vous
calculez la moyenne du poids
# à vous
et l’écart-type de l’indice de masse corporelle
# à vous
Plots de colonnes de la DataFrame#
Les boxplots#
tracer le boxplot de la colonne height
tracer le boxplot de la colonne weight
# à vous
Les femmes par poids#
tracer les tailles des femmes en fonction de leurs poids
# à vous
Tri de colonnes et plots#
trier les tailles en ordre croissant et plotter les
# à vous
plotter sur une même figure les tailles par genre
# à vous
afficher en ordre croissant les personnes de plus de 180 cm
# à vous
NaN#
Lecture du csv#
lisez le fichier
data/car_sales.csv(la première ligne contient le nom des colonnes)
# à vous de jouer
cars = ...
cars.head(5)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[37], line 1
----> 1 cars.head(5)
AttributeError: 'ellipsis' object has no attribute 'head'
le nombre de lignes dans la dataframe
# votre code
nombre de colonnes dans la dataframe
# à vous
afficher les colonnes
# à vous de jouer
afficher les lignes 10 à 14 inclusivement (on compte à partir de 1)
# à vous de jouer
Nombres de NaN#
le nombre de NaN par colonne (sans boucle python)
# votre code
le nombre de NaN par ligne
# à vous de jouer
Suppression de NaN#
supprimer les colonnes qui ont plus de \(5\) NaN
indices
la taille originale de notre dataframe est 157 lignes et 16 colonnes
voyez
pandas.dropnaça concerne une colonne
# votre code ici
supprimer les lignes qui ont plus de \(5\) NaN
ça devrait concerner une ligne
# votre code ici
supprimer les lignes qui ont au moins un NaN
# votre code ici
supprimer les colonnes qui ont au moins un NaN
# votre code ici