Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

On part des données publiques qui décrivent le trafic des vélos sur le pont de Fremont (à Portland - Oregon)

pour information, voici le code qu’on a utilisé pour aller chercher la donnée

le fichier data/fremont.csv est déjà là
Date,Fremont Bridge Total,Fremont Bridge East Sidewalk,Fremont Bridge West Sidewalk
08/01/2022 12:00:00 AM,23,7,16
08/01/2022 01:00:00 AM,12,5,7
08/01/2022 02:00:00 AM,3,0,3
08/01/2022 03:00:00 AM,5,2,3
08/01/2022 04:00:00 AM,10,2,8
08/01/2022 05:00:00 AM,27,5,22
08/01/2022 06:00:00 AM,100,43,57
08/01/2022 07:00:00 AM,219,90,129
08/01/2022 08:00:00 AM,335,143,192

chargement

Requirement already satisfied: seaborn in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (0.13.2)
Requirement already satisfied: numpy!=1.24.0,>=1.20 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from seaborn) (2.5.3)
Requirement already satisfied: pandas>=1.2 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from seaborn) (3.0.6)
Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from seaborn) (3.11.2)
Requirement already satisfied: contourpy>=1.0.1 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.0)
Requirement already satisfied: cycler>=0.10 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.12.1)
Requirement already satisfied: fonttools>=4.28.2 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.66.1)
Requirement already satisfied: kiwisolver>=1.3.1 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.5.1)
Requirement already satisfied: packaging>=20.0 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (26.3)
Requirement already satisfied: pillow>=9 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (12.3.0)
Requirement already satisfied: pyparsing>=3 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.3.3)
Requirement already satisfied: python-dateutil>=2.7 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /__w/exos-ds/exos-ds/venv/lib/python3.14/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.17.0)
Note: you may need to restart the kernel to use updated packages.
(175200, 4)
Loading...

doublons

en fait ce qu’il se passe c’est que c’est un peu le bazar ce dataset, et que les données sont principalement présentes en deux exemplaires !

01/01/2014 12:00:00 AM,23,5,18
01/01/2014 12:00:00 AM,23,5,18

du coup on nettoie

(87600, 4)

parser les dates

<class 'pandas.DataFrame'>
RangeIndex: 87600 entries, 0 to 87599
Data columns (total 4 columns):
 #   Column                        Non-Null Count  Dtype  
---  ------                        --------------  -----  
 0   Date                          87600 non-null  str    
 1   Fremont Bridge Total          87586 non-null  float64
 2   Fremont Bridge East Sidewalk  87586 non-null  float64
 3   Fremont Bridge West Sidewalk  87586 non-null  float64
dtypes: float64(3), str(1)
memory usage: 4.5 MB
Date str Fremont Bridge Total float64 Fremont Bridge East Sidewalk float64 Fremont Bridge West Sidewalk float64 dtype: object

bref le point ici c’est que les dates sont des chaines et pas des dates

Loading...

renommons les colonnes

données manquantes et extension types

de manière totalement optionnelle, mais on remarque que les nombres ont été convertis en flottants

et ça c’est parce qu’il y a eu quelques interruptions de service, apparemment, avec le système de récolte de l’information

Loading...
(14, 3)

on pourrait nettoyer, mais ici on va choisir d’ignorer ces données manquantes; à la place on va les remettre sous la forme d’entiers

Loading...
Total Int64 West Int64 East Int64 dtype: object
(14, 3)

à quoi ça ressemble

<Figure size 1200x400 with 1 Axes>

ajustement

<Figure size 1200x400 with 1 Axes>

juste pour être en phase (pouvoir vérifier nos résultats par rapport à ceux de la vidéo), on va s’arrêter à la fin de 2017

(un détail à noter aussi, les données de la vidéo ne contenaient pas la colonne ‘total’...)

Loading...
<Figure size 1200x400 with 1 Axes>

resample() ?

décortiquons un peu cette histoire de resample()

(45984, 3)
(274, 3)
(167.82481751824818, 168)

reprenons

<Figure size 1200x400 with 1 Axes>
<Figure size 1200x400 with 1 Axes>
<Figure size 1200x400 with 1 Axes>
<Figure size 1200x400 with 1 Axes>
Loading...
(24, 1916)
<Figure size 1200x400 with 1 Axes>

classification

ici il s’agit de classifier les jours en deux familles, qu’on voit très distinctement sur la figure

on veut faire une ACP sur un tableau qui aurait

et donc c’est presque exactement pivoted, sauf que c’est sa transposée !

(1916, 24)
(numpy.ndarray, (1916, 2))
<Figure size 1200x400 with 1 Axes>
((1916,), array([0, 0, 0, ..., 0, 1, 1], shape=(1916,)))
<Figure size 1200x400 with 2 Axes>

première famille : label==0

<Figure size 1200x400 with 1 Axes>

deuxième famille label==1

<Figure size 1200x400 with 1 Axes>

les deux clusters avec le jour de la semaine

essayons de vérifier que les deux clusters correspondent bien à l’intuition de départ

pour ça on redessine les deux clusters avec une couleur qui indique le jour de la semaine

Index([2012-10-03, 2012-10-04, 2012-10-05, 2012-10-06, 2012-10-07, 2012-10-08, 2012-10-09, 2012-10-10, 2012-10-11, 2012-10-12, ... 2017-12-22, 2017-12-23, 2017-12-24, 2017-12-25, 2017-12-26, 2017-12-27, 2017-12-28, 2017-12-29, 2017-12-30, 2017-12-31], dtype='object', length=1916)
((1916,), Index([2, 3, 4, 5, 6, 0, 1, 2, 3, 4, ... 4, 5, 6, 0, 1, 2, 3, 4, 5, 6], dtype='int32', length=1916))
<Figure size 1200x400 with 2 Axes>

les moutons noirs

((1916,), array([False, False, False, ..., False, False, False], shape=(1916,)))
(DatetimeIndex(['2012-11-22', '2012-11-23', '2012-12-24', '2012-12-25', '2013-01-01', '2013-05-27', '2013-07-04', '2013-07-05', '2013-09-02', '2013-11-28', '2013-11-29', '2013-12-20', '2013-12-24', '2013-12-25', '2014-01-01', '2014-04-23', '2014-05-26', '2014-07-04', '2014-09-01', '2014-11-27', '2014-11-28', '2014-12-24', '2014-12-25', '2014-12-26', '2015-01-01', '2015-05-25', '2015-07-03', '2015-09-07', '2015-11-26', '2015-11-27', '2015-12-24', '2015-12-25', '2016-01-01', '2016-05-30', '2016-07-04', '2016-09-05', '2016-11-24', '2016-11-25', '2016-12-26', '2017-01-02', '2017-02-06', '2017-05-29', '2017-07-04', '2017-09-04', '2017-11-23', '2017-11-24', '2017-12-25', '2017-12-26'], dtype='datetime64[s]', freq=None), 48)
<Figure size 1200x400 with 1 Axes>