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)
row1 5
row2 7
row3 9
dtype: int64
row1 2
row2 4
row3 6
Name: vecA, dtype: int64
Exemple (matrices)
- Nous pouvons considérer une matrice comme deux colonnes d’un Dataframe pandas.
vecA vecB
row1 1 4
row2 2 5
row3 3 6
- Calcul des moyennes par colonnes:
vecA 2.0
vecB 5.0
dtype: float64
- Calcul des moyennes par rangées:
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:
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 :
- Cardinalité : Comment les clés sont reliées entre les jeux de données (un-à-un, un-à-plusieurs, plusieurs-à-plusieurs).
- 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
- Validez la cardinalité avec le paramètre
validate.
- Vérifiez le nombre de lignes avant et après la fusion.
- Utilisez
indicator=True pour voir les taux de correspondance.
- Normalisez les chaînes (supprimez les espaces, standardisez la casse).
- Triez avant les jointures asof — des données non triées donnent des résultats erronés.
- 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