Files
training.python.datascience/workshop/pandas-shoes/workshop-notebook.ipynb
2025-10-24 22:29:15 +02:00

307 lines
8.3 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# Atelier de traitement de données avec Pandas\n",
"\n",
"Tiré du site de Guillaume Dueymes : https://www.guillaumedueymes.com/courses/formation_python/8-pandas-exercice/\n",
"\n",
"Nous allons analyser un data set contenant des informations sur 10 000 paires de chaussures \n",
"vendues sur le site Amazon, avec de nombreuses caractéristiques comme le prix minimal observé, \n",
"le prix maximal observé, les couleurs disponibles, les tailles disponibles, le poids des articles, \n",
"la marque…\n"
],
"metadata": {
"collapsed": false
},
"id": "ca962ad386449748"
},
{
"cell_type": "markdown",
"source": [
"## Découverte du data set\n",
"\n",
"1. À laide de la fonction `read_csv()`, importez entièrement le data set et enregistrez-le dans une variable `shoes`.\n",
"2. Utilisez la méthode `.head(n=10)` pour récupérer et afficher les premières lignes du `DataFrame`.\n",
"3. Il y a beaucoup de colonnes, beaucoup ne sont pas visibles. Afin de toutes les voir lors de l'affichage, utilisez l'attribut' `pandas.options` pour que `.head()` affiche toutes les colonnes du `DataFrame`. (ou utilisez la fonction `display()` de Jupyter)\n",
"4. On va garder uniquement les colonnes intéressantes. Grâce à la syntaxe de filtrage par colonnes, créez une variable `shoes_light`, comprenant uniquement les colonnes suivantes :\n",
" - `id`\n",
" - `name`\n",
" - `brand`\n",
" - `dateUpdated`\n",
" - `colors`\n",
" - `prices.amountMax`\n",
" - `prices.amountMin`\n",
" - `prices.merchant`.\n",
"4. Suite : Affichez le `head()` de `shoes_light`.\n"
],
"metadata": {
"collapsed": false
},
"id": "2f0fb688fd2b801e"
},
{
"cell_type": "code",
"source": [
"#!pip install pandas\n",
"import pandas as pd # noqa"
],
"metadata": {
"collapsed": false,
"jupyter": {
"is_executing": true
}
},
"id": "fb6b33145b46036b",
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 1\n",
"shoes = pd.read_csv(\"womens-shoes.csv.xz\")"
],
"metadata": {
"collapsed": false
},
"id": "1b86b0cd93c36795"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 2"
],
"metadata": {
"collapsed": false
},
"id": "2efcdad9ec4b7583"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 3"
],
"metadata": {
"collapsed": false
},
"id": "2961d6e42459dfa9"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 4"
],
"metadata": {
"collapsed": false
},
"id": "6ee0a6019e90db1b"
},
{
"cell_type": "markdown",
"source": [
"## Data Cleaning\n",
"\n",
"1. À l'aide de l'attribut `.dtypes` du Dataframe, observez attentivement les types de chaque colonne. Certaines ont un type qui ne correspond pas à celui attendu. Lesquelles ? Notez-les simplement quelque part.\n",
"2. À l'aide des méthodes `.isnull()` (ou `.isna()`), `.sum()` et `len()`, calculez pour chaque colonne le **pourcentage** de valeurs non renseignées. Récupérez dans une variable celles qui ont un non remplissage supérieur à 10%. La méthode `sum()` employée sur une série de booléens fait l'addition en considérant que `False == 0` et `True == 1`. La méthode `mean()` fonctionne aussi et renverra un ratio des valeurs `True` sur le nombre total de valeurs.\n",
"3. Supprimez du dataframe `shoes_light` les colonnes que vous avez récupérées dans la question précédente, elles ont trop de valeurs non renseignées.\n",
"4. À l'aide de la fonction `pd.to_datetime()`, remplacez la colonne `dateUpdated` par une colonne de type `datetime64[ns]`.\n"
],
"metadata": {
"collapsed": false
},
"id": "865055e156e3a14c"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 1"
],
"metadata": {
"collapsed": false
},
"id": "5856f3288e1b837c"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 2"
],
"metadata": {
"collapsed": false
},
"id": "8b3be0e49e5edd4e"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 3"
],
"metadata": {
"collapsed": false
},
"id": "3d11033148a17412"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 4"
],
"metadata": {
"collapsed": false
},
"id": "6bc78f0eab8a090e"
},
{
"cell_type": "markdown",
"source": [
"## Features Modeling\n",
"\n",
"1. Ajoutez au dataframe une nouvelle colonne `prices.amountAverage` calculant la moyenne des colonnes `prices.amountMax` et `prices.amountMin` (via une addition et une division par 2).\n",
"2. Grâce à l'attribut `Series.dt.weekday`, ajoutez au dataframe une nouvelle colonne `dayOfweekUpdated`, extrayant depuis la colonne `dateUpdated` le jour de la semaine où les produits sont mis à jour (un nombre entre 0 et 6).\n",
"3. Grâce à l'attribut `Series.dt.day_name(locale=\"\")`, ajoutez au dataframe une nouvelle colonne `dayNameUpdated`, extrayant depuis la colonne `dateUpdated` le nom du jour de la semaine où les produits sont mis à jour (Lundi à Dimanche).\n"
],
"metadata": {
"collapsed": false
},
"id": "97a23a2b56e659b3"
},
{
"cell_type": "code",
"source": [
"# Question 1"
],
"metadata": {
"collapsed": false,
"jupyter": {
"is_executing": true
}
},
"id": "c1c2d9b73cf09b13",
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 2"
],
"metadata": {
"collapsed": false
},
"id": "f79a989bd03e4f61"
},
{
"metadata": {},
"cell_type": "code",
"outputs": [],
"execution_count": null,
"source": "# Question 3",
"id": "bd08c4a6a8e5d18f"
},
{
"cell_type": "markdown",
"source": [
"## Data Analyse\n",
"\n",
"1. Affichez le prix moyen, écart type, etc. des chaussures avec la méthode `.describe()` du `DataFrame` `shoes_light`.\n",
"2. Y a-t-il de grandes différences de prix en fonction de la marque ? À l'aide des méthodes `groupby()`, `mean()` et `sort_values()`, créez une variable `luxury` contenant les 10 marques dont les prix moyens des produits sont les plus élevés, puis une variable `low_cost` contenant les 10 marques les moins chères sur les mêmes critères.\n",
"3. Grâce à la méthode `.value_counts()` du Dataframe, déterminez le jour de la semaine où les produits sont le plus souvent mis à jour.\n",
"4. Donnez le prix moyen des produits de la marque `easy street` mis à jour un jeudi (jour 3).\n"
],
"metadata": {
"collapsed": false
},
"id": "1980ec43bdbabe8"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 1"
],
"metadata": {
"collapsed": false
},
"id": "73df484243c117c5"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 2"
],
"metadata": {
"collapsed": false
},
"id": "7f1abc9d9f255936"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 3"
],
"metadata": {
"collapsed": false
},
"id": "bae81f6190201b34"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Question 4"
],
"metadata": {
"collapsed": false
},
"id": "f46f052425a9711f"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}