MATH60230 - Séance 4

Vincent Grégoire

HEC Montréal

Saad Ali Khan

HEC Montréal

Plan pour aujourd’hui

  • Opérations vectorisées
  • Fusions
  • Jupyter Notebook
  • Devoir 4

Opérations vectorisées

  • Nous pouvons considérer un vecteur comme une colonne unique d’un Dataframe pandas
from pandas import DataFrame
df = DataFrame({
    'vecA':[1,2,3], 
    'vecB': [4,5,6],
},
index=["row1","row2",'row3'])

Vecteurs

  • Pandas DataFrame prend en charge les opérations élément par élément et par ligne/colonne.
  • Par exemple, l’addition et la soustraction de vecteurs par élément, par colonne.. etc.
  • Ces opérations sont optimisées pour une exécution efficiente:
    • Évitez d’utiliser des boucles for si c’est possible d’utiliser des opérations vectorisées

Exemple (vecteurs)

df['vecA'] + df['vecB']
row1    5
row2    7
row3    9
dtype: int64
2*df['vecA']
row1    2
row2    4
row3    6
Name: vecA, dtype: int64
df['vecA'].mean()
np.float64(2.0)

Exemple (matrices)

  • Nous pouvons considérer une matrice comme deux colonnes d’un Dataframe pandas.
print(df)
      vecA  vecB
row1     1     4
row2     2     5
row3     3     6
  • Calcul des moyennes par colonnes:
df.mean(axis=0)
vecA    2.0
vecB    5.0
dtype: float64
  • Calcul des moyennes par rangées:
df.mean(axis=1)
row1    2.5
row2    3.5
row3    4.5
dtype: float64
  • En considérant le vecteur A et le vecteur B empilés comme une matrice, nous pouvons également transposer la matrice:
df.T
row1 row2 row3
vecA 1 2 3
vecB 4 5 6

Fusions et jointures

  • La combinaison de jeux de données est fondamentale en finance empirique.
    • Rendements boursiers dans CRSP, données comptables dans Compustat, prévisions d’analystes dans I/B/E/S.
  • Deux concepts à comprendre :
    1. Cardinalité : Comment les clés sont reliées entre les jeux de données (un-à-un, un-à-plusieurs, plusieurs-à-plusieurs).
    2. Opération de fusion : Quelles lignes conserver (inner, left, right, outer).
  • Une erreur peut corrompre silencieusement vos résultats.

Types de jointures (Cardinalité)

Un-à-un

Chaque clé apparaît au plus une fois dans les deux jeux de données.

Exemple : Rendements mensuels de portefeuilles fusionnés avec les caractéristiques des portefeuilles.

Un-à-plusieurs

Clés uniques dans un jeu de données mais répétées dans l’autre. Les lignes sont diffusées.

Exemple : Caractéristiques d’entreprises fusionnées avec les rendements quotidiens.

Plusieurs-à-plusieurs

Les clés se répètent dans les deux jeux de données. Crée toutes les combinaisons.

Généralement une erreur !


Utilisez le paramètre validate dans pd.merge() pour imposer la cardinalité attendue.

Opérations de fusion

Quelles lignes conserver lorsque les clés ne correspondent pas parfaitement ?

  • Inner join : Conserver uniquement les lignes où les clés correspondent dans les deux jeux de données.
  • Left join : Conserver toutes les lignes du jeu de données de gauche ; ajouter les données de droite si disponibles (NaN sinon).
  • Right join : Conserver toutes les lignes du jeu de données de droite ; ajouter les données de gauche si disponibles.
  • Outer join : Conserver toutes les lignes des deux jeux de données.

Fonctions : pd.merge() ou df.join() en pandas, df.join() en Polars.

Utilisez le paramètre how : 'inner', 'left', 'right', 'outer' (Polars utilise 'full' pour outer).

Jointures Asof

  • Les données financières s’alignent rarement parfaitement dans le temps.
    • Prix quotidiens, résultats trimestriels, prévisions d’analystes irrégulières.
  • Jointure asof : Trouver la valeur la plus récente à la date de chaque observation.
    • Aucune correspondance exacte requise.

Points clés :

  • Les données doivent être triées par date avant la jointure.
  • Utilisez direction='backward' pour éviter le biais d’anticipation (look-ahead bias).
  • Essentiel pour les données ponctuelles (comptabilité, prévisions).

Fonctions : pd.merge_asof() en pandas, .join_asof() en Polars.

Bonnes pratiques pour les fusions

  1. Validez la cardinalité avec le paramètre validate.
  2. Vérifiez le nombre de lignes avant et après la fusion.
  3. Utilisez indicator=True pour voir les taux de correspondance.
  4. Normalisez les chaînes (supprimez les espaces, standardisez la casse).
  5. Triez avant les jointures asof — des données non triées donnent des résultats erronés.
  6. Attention aux incompatibilités de types (int vs float, formats de dates).

Un faible taux de correspondance indique généralement un problème — investiguez !

Jupyter Notebooks

  • Les cahiers (ou carnets) Jupyter sont l’autre format populaire pour le code Python.
    • Composé de cellules pouvant contenir du code Python ou du markdown.
    • Ressemble plus à un rapport, utile pour afficher des données.
  • Quand dois-je utiliser des scripts Python (.py) par rapport aux Notebooks Jupyter (.ipynb) ?
    • .py :
      • Pour définir des fonctions plus longues, des classes, etc.
      • Créer des modules.
      • Pour le code qui effectue un traitement pour lequel je n’ai pas besoin de voir la sortie.
    • Des notebooks Jupyter:
      • Pour les statistiques et l’analyse, pour voir les résultats dans les figures et les tableaux, documentez cette analyse.

Jupyter Notebooks - Problèmes

Les Jupyter Notebooks, bien qu’utiles, présentent de nombreux problèmes :

  • Difficiles à versionner (git).
  • Ils intègrent les résultats dans le fichier, ce qui complique les comparaisons (diff).
  • Plus difficiles à tester et à déboguer.
  • Ils peuvent être lents à exécuter.
  • Les résultats ne sont pas toujours reproductibles en raison de l’ordre d’exécution.

Il existe un nouveau format de notebook appelé marimo qui tente de résoudre ces problèmes.

Devoir 4

Pandas (encore)!

Prochaine séance

  • Figures et tables
  • Matplotlib et seaborn
  • Comment lire un article