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.

un petit TP pour travailler

les données

On va étudier un jeu de données trouvé sur Internet

PARIS	2011	02:06:29	7589
PARIS	2010	02:06:41	7601
PARIS	2009	02:05:47	7547
PARIS	2008	02:06:40	7600
PARIS	2007	02:07:17	7637

chargement

Le premier réflexe pour charger un fichier de ce genre, c’est d’utiliser la fonction read_csv de pandas

Loading...

c’est un début, mais ça ne marche pas franchement bien !

il faut donc bien regarder la doc

et pour commencer je vous invite à préciser le séparateur:

False

c’est mieux, mais les noms des colonnes ne sont pas corrects
en effet par défaut, read_csv utilise la première ligne pour déterminer les noms des colonnes
or dans le fichier texte il n’y a pas le nom des colonnes ! (voyez ci-dessus)

du coup ce serait pertinent de donner un nom aux colonnes

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[10], line 3
      1 # pour vérifier, ceci doit afficher True
      2 
----> 3 df.shape == (359, 4) and df.iloc[0, 0] == 'PARIS' and df.columns[0] == 'city'

AttributeError: 'ellipsis' object has no attribute 'shape'
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[11], line 3
      1 # ce qui maintenant nous donne ceci
      2 
----> 3 df.head(2)

AttributeError: 'ellipsis' object has no attribute 'head'

sauvegarde dans un fichier csv

dans l’autre sens, quand on a produit une dataframe et qu’on veut sauver le résultat dans un fichier texte

par exemple je crée ici un fichier qu’on peut relire sous excel

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[13], line 2
      1 loop = "marathon-loop.csv"
----> 2 df.to_csv(loop, sep=";", index=False)

AttributeError: 'ellipsis' object has no attribute 'to_csv'
cat: marathon-loop.csv: No such file or directory

des recherches

les éditions de 1971

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[16], line 3
      1 # ceci doit retourner True
      2 
----> 3 df_1971.shape == (3, 4) and df_1971.seconds.max() == 8574

AttributeError: 'ellipsis' object has no attribute 'shape'

l’édition de 1981 à Londres

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[18], line 3
      1 # ceci doit retourner True
      2 
----> 3 df_london_1981.shape == (1, 4) and df_london_1981.iloc[0].seconds == 7908

AttributeError: 'ellipsis' object has no attribute 'shape'

trouver toutes les villes

on veut construire une collection de toutes les villes qui apparaissent au moins une fois

intéressez-vous au type du résultat (dataframe, series, ndarray, liste ?)

des extraits

attention ici dans les consignes, les numéros de ligne commencent à 1

extrait #1

les entrées correspondant aux lignes 10 à 12 inclusivement

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[21], line 3
      1 # ceci doit retourner True
      2 
----> 3 df_10_to_12.shape == (3, 4) and df_10_to_12.iloc[0].year == 2002 and df_10_to_12.iloc[-1].year == 2000

AttributeError: 'ellipsis' object has no attribute 'shape'

extrait #2

une Series correspondant aux événements à Paris après 2000 (inclus), dans laquelle on n’a gardé que l’année

Ellipsis
False

extrait #3

une DataFrame correspondant aux événements à Paris après 2000, dans laquelle on n’a gardé que les deux colonnes year et seconds

False

aggrégats

moyenne

ce serait quoi la moyenne de la colonne seconds ?

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[28], line 4
      1 # pour vérifier
      2 
      3 import math
----> 4 math.isclose(seconds_average, 7933.660167130919)

TypeError: must be real number, not ellipsis

combien de marathons par an

si maintenant je veux produire une série qui compte par année combien il y a eu de marathons

il y a plein de façons de faire, si vous en voyez plusieurs n’hésitez pas...

False

les durées

dans cette partie, notre but est de simplement vérifier que la colonne seconds contient bien le nombre de secondes correspondant à la colonne duration

pour cela on va commencer par convertir la colonne duration en quelque chose d’un peu plus utilisable

numpy expose deux types particulièrement bien adaptés à la gestion du temps

voir plus de détails si nécessaire ici: https://numpy.org/doc/stable/reference/arrays.datetime.html

read_csv(parse_dates=)

commençons par écarter une fausse bonne idée

dans read_csv il y a une option parse_dates; mais regardez ce que ça donne

/tmp/ipykernel_2082/3523436968.py:1: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  df_broken = pd.read_csv(
Loading...

ça ne va pas !

le truc c’est que ici, on n’a pas une date, ce que nous avons c’est une durée

pd.to_timedelta()

city str year int64 duration str seconds int64 dtype: object

non, pour convertir la colonne en datetime64 on va utiliser pd.to_timedelta()

voyez la documentation de cette fonction, et modifiez la dataframe df pour que la colonne duration soit maintenant du type timedelta64

False
Loading...

duration == seconds ?

à présent qu’on a converti duration dans le bon type, on peut utiliser toutes les fonctions disponibles sur ce type.
en pratique ça se fait en deux temps

du coup pour vérifier que la colonne seconds correspond bien à duration, on écrirait quoi comme code (qui doit afficher True)

colonnes hour minute et second

on se propose maintenant de rajouter des colonnes hour minute et second - qui doivent être de type entier

pour cela deux approches:

à la main

indices

(np.int64(2), np.timedelta64(25,'m'))

maintenant qu’on sait faire tout ça, on peut calculer les colonnes hour, minute et second

version paresseuse avec dt.components

il se trouve qu’on peut faire le même travail sans s’embêter autant, une fois qu’on découvre que l’accesseur .dt possède un attribut qui donne accès à ce genre de détails