Comment organiser son code en Data Science ?

Introduction

png

Lorsqu'un projet débute, beaucoup de data scientists utilisent jupyter (abbréviation de Julia Python R) notebook pour faire des premiers essais. C'est un outil pratique qui permet d'effectuer une exploration de données, un prototype.

Cependant cette facilité d'utilisation peut encourager des mauvaises pratiques. Comment écrire du meilleur code en data science ? Quelles bonnes pratiques adopter ?

Pourquoi utiliser des jupyter notebook ?

Les jupyter notebooks sont des documents qui peuvent contenir à la fois du code informatique (ex: python) pour effectuer l'analyse des données et des éléments de texte enrichi : paragraphe, équations, figures, liens, etc. Ils permettent de créer des visualisations, des résumés, des présentations.

png

Grace à leur organisation par cellules, ils sont très efficaces pour avoir du feedback rapide en pressant shift + entrée. Cependant cette façon de travailler peut encourager les demonstrations non reproductibles.

Une mauvaise utilisation de l'outil

Lors de mon premier projet, je me suis retrouvé avec un projet fait entièrement en notebook avec du code non structuré et difficile à maintenir, ça a été compliqué de tout recombiner. Pour mes nouveaux projets, je fais en sorte d'avoir le moins de code possible dans des notebooks.

On retrouve sur internet plusieurs repos github avec des resultats non reproductibles car le notebook est daté. Pour cette raison, il vaut mieux garder les notebooks pour la visualisation et créer des démonstrations interactives.

Mais alors comment faire pour structurer son projet sans renoncer aux jupyter notebooks ?

Solution : créer des packages pour ses projets

Il est possible de combiner le meilleur des deux mondes, l'intéractivité d'un notebook et l'organisation des scripts python en minimisant le code présent dans les notebooks et en mettant les fonctionalités dans des modules qu'on importera.

Structure de package

Voici une structure de projet qui prend seulement quelques minutes à mettre en place. Pour commencer, j'utilise une structure de projet simple :


clustering_project/
|   setup.py           
|       
+---data/
|       data.txt
|       
+---models/
+---notebooks/
|       exploratory_data_analysis.ipynb
|           
+---clustering_project/
|       __init__.py
|       data_preprocessing.py
|       models.py
|       train.py
|       main.py
|       visualization.py
|       
\---test/
        test_data_preprocessing.py
        test_models.py
        test_train.py

puis je rajoute des modules/dossiers en fonction de l'avancement.

  • __init__.py : c'est un fichier vide qui sert à indiquer que clustering_project est un package importable
  • setup.py : c'est un fichier à la racine du projet qui nous permettra d'installer notre package, pour commencer on met le code suivant
from setuptools import setup

setup(name='clustering_project',
      version='1.0',
      packages=['clustering_project']
      )
  • test : c'est un dossier qui contient les tests unitaires pour nos fonctions

Utilisation

Il reste encore deux derniers réglages

  • installation du package : dans la console à la racine du projet
pip install --editable .

les fonctions sont maintenant importables à travers tout le package

  • la commande magique %autoreload : au début de chaque notebook
import numpy as np
import pandas as pd
import seaborn as sns

%load_ext autoreload
%autoreload 2

Cette commande sert à réimporter automatiquement tous les modules dès qu'il y'a un changement, ce qui nous évite de relancer le notebook à chaque fois

Dernière étape

Il ne reste plus qu'a utiliser un système de contrôle de version (en poussant le code sur GitHub par exemple). Cela permet de garder une trace des changements effectués, et de collaborer plus facilement en permettant à tous les membres d'une équipe d'avoir accès à la dernière version du code à tout moment.

Conclusion

Les notebooks sont un très bon outil pour leur interactivité et leur présentation, cependant il faut les limiter à ce rôle afin de pouvoir écrire du code reproductible et structuré. Cette structure permet de créer des prototypes et de gagner beaucoup de temps sur le long terme.

Soriba

J'écris sur des concepts de Data Science, n'hésitez pas à prendre contact sur mes réseaux !