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.

les types de base

les types pour le temps en Python

les types pour le temps en numpy

les types pour le temps en pandas

exercices: le cours de l’action amazon

vous avez peut-être remarqué que read_csv propose des (tas d’) options pour la gestion des instants (notamment le paramètre parse_dates)

mais dans un premier temps, nous allons rester loin de ce genre de features,
et dans cet exercice nous allons procéder en deux temps, en combinant pd.read_csv et pd.to_datetime

exercice 1: read_csv

    1. lire le fichier de données data/Amazon.csv avec read_csv()
      attention, le fichier contient 3 premières lignes de commentaires qu’il convient d’ignorer complètement

    2. affichez les types des colonnes
      que penser du type de la colonne Date ?

exercice 2: pd.to_datetime()

    1. traduisez la colonne Date dans le type adéquat

    2. affichez le nouveau type de la colonne

    3. ça peut être intéressant de regarder à la fois dtypes sur la dataframe et dtype sur la série (voir la note ci-dessous)

    4. en option (pour les avancés): sauriez-vous passer à to_datetime le paramètre format qui va bien ? sachant que c’est une pratique très recommandée pour éviter les embrouilles

exercice 3: NaT

    1. comparez l’affichage de la première ligne avec celui d’avant la conversion
      que remarquez-vous ?

    2. supprimer les lignes pour lesquelles le champ Date est inconnu

pour vérifier vos résultats: le nombre de lignes doit passer de 5852 à 5828

exercice 4: l’accessor .dt

comme on l’a déjà vu avec .str et .cat
il existe un accesseur .dt pour appliquer sur une série de type Timestamp des attributs qui lui sont spécifiques

    1. en utilisant cet accesseur, ajoutez à la dataframe une colonne qui contient uniquement l’année des dates

    2. pour les avancés: en utilisant cet accesseur, ajoutez à la dataframe une colonne qui contient le jour de la semaine
      où lundi vaut 0, mardi 1, ...

exercice 5: indexons par les dates

  1. mettez la colonne Date comme index
    et triez la dataframe selon cet index (ça semble être déjà le cas, mais en est-on bien sûr ?)

pour les avancés, questions subsidiaires: est-ce que le fait de trier va changer quelque chose:

exercice 6: plotting

  1. plottez la valeur de l’action au cours du temps

    • (1) sur un même diagramme, les deux cours High et Low

    • (2) ensuite sur deux diagrammes séparés
      hint: lisez bien la doc de df.plot()

slicing avec des dates

Loading...
Loading...
Loading...
Loading...
Loading...

aggrégations: resample() et rolling()

resample()

exemple 1: le supermarché

dans un supermarché, on vous donne une table avec une ligne par passage à la caisse (rien de régulier, donc)
on veut calculer le chiffre d’affaires par tranche horaire

un simple resample sur 1 heure, en agrégant avec la somme, fournit le résultat

exemple 2: ré-échantillonner un signal sonore

vous avez un signal échantillonné à 44.100 kHz et vous voulez le ré-échantillonner (littéralement: resample) à une fréquence 4 fois plus basse.

il suffit de faire un resample avec une durée de corbeille égale à exactement 4 x la période de la fréquence originale, et agréger avec la moyenne

même type d’usages: to_period()

avec resample() on peut donc grouper les données par période
signalons un autre outil qui peut aider à faire cela aussi en pandas, il s’agit de to_period() qui convertit un Timestamp en Period (un intervalle de temps), ce qui permet de faire ensuite un groupby() sur ces périodes.

voici un exemple simple pour illustrer cela;

Loading...

avec to_period(), on peut facilement ajouter une colonne qui va contenir, disons par exemple le mois calendaire correspondant

Loading...

ce qu’il faut remarquer c’est que les nouveaux champs sont donc de type Period, qui contient un début et une fin (et pas simplement un instant comme un Datetime)

time datetime64[us] amount int64 category str month period[M] dtype: object

rolling()

exemple 1: visualiser l’évolution sur une année

vous voulez visualiser l’évolution d’une grandeur “d’une année sur l’autre”

on va faire un rolling avec une période d’un an
si on appelle ff la fonction de départ, et FF le rolling sur un an
(avec la somme comme agrégation pour simplifier les équations), on va avoir

calculons le rolling pour deux jours consécutifs; avec la convention qu’on fait une rolling sur le passé (le défaut, donc) on a

F(31/12/2021)=∑j=01/01/202131/12/2021f(j)  et  F(01/01/2022)=∑j=02/01/202101/01/2022f(j)F(31/12/2021) = \sum_{j=01/01/2021}^{31/12/2021} f(j) \\ \;et\; \\ F(01/01/2022) = \sum_{j=02/01/2021}^{01/01/2022} f(j)

et donc la différence pour F entre deux jours consécutifs vaut

F(01/01/2022)−F(31/12/2021)=f(01/01/2022)−f(01/01/2021)F(01/01/2022) - F(31/12/2021) = f(01/01/20\textbf{22}) - f(01/01/20\textbf{21}) \\

ce qui signifie que
la dérivée de FF (la différence d’un jour à l’autre), c’est l’évolution de ff mais d’une année sur l’autre

exemple 2: effet lissant

pour bien voir l’effet ‘lissant’ de la fenêtre glissante, prenons des données synthétiques:

Loading...

voici l’effet du rolling avec des fenêtres de 1 semaine et 4 semaines

ici on a choisi d’attacher le résultat (de la moyenne de la corbeille) au centre de la corbeille

Loading...

exercices / digression

la notion de fenêtre glissante - i.e. rolling() - fait du sens pour n’importe quelle donnée, même non-temporelle

reproduisez le dessin ci-dessus, mais

que constatez-vous aux extrémités ?

exercice 7: resample et rolling

  1. calculez df2 qui se concentre sur la valeur de High sur la période de Juillet 2018 à fin 2019
    plottez-la
    rangez dans la variable L le nombre de lignes

exercice 8: resample+plotting

  1. appliquez à cette série un resample() avec la moyenne des données sur une période d’une semaine
    plottez le résultat
    combien d’entrées on devrait y trouver (en fonction de L) si on compare les fréquences des deux séries ?
    pourquoi ça ne tombe pas exactement juste ?
    est-ce qu’on pourrait estimer ça autrement ?

exercice 9: rolling+plotting

  1. appliquez à cette série un rolling() avec une fenêtre de 1 an
    plottez le résultat
    combien d’entrées on devrait y trouver (en fonction de L) ?

Annexe 1 - les échelles de précision

un objet datetime64 est créé avec un paramètre unit, qui permet de choisir la précision des calculs; et l’intervalle des dates possibles varie bien entendu avec cette précision :

Annexe 2 - le type de base Python datetime

datetime.datetime(2021, 12, 31, 22, 30)
datetime.timedelta(seconds=14400)

un peu d’arithmétique

datetime.datetime(2022, 1, 1, 2, 30)
datetime.datetime(2021, 12, 31, 18, 30)
24

décomposer

pour accéder aux différents éléments d’une date (année, mois, ..), c’est facile

(2021, 22)
(0, 14400)

à titre plus anecdotique, on peut aussi appliquer directement un format à un instant dans une f-string

'22==30'

par contre ces formats sont très utiles lorsqu’on va vouloir traduire nos fichiers d’entrée en date/heure

pour une liste complète des formats, voir https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes