DataLab et Spyder : un mariage parfait#

Ce tutoriel montre comment utiliser Spyder pour travailler avec DataLab à travers un exemple, en utilisant des algorithmes et des données fictifs qui représentent un travail de recherche/technique hypothétique. L’objectif est d’illustrer comment utiliser DataLab pour tester vos algorithmes avec des données, et comment les déboguer si nécessaire.

L’exemple est assez simple, mais il illustre les concepts de base du travail avec DataLab et Spyder.

DataLab et Spyder : un mariage parfait

Note

DataLab et Spyder sont des outils complémentaires. Alors que Spyder est un environnement de développement puissant avec des capacités de calcul scientifique interactif, DataLab est un outil d’analyse de données polyvalent qui peut être utilisé pour effectuer un large éventail de tâches, de la simple visualisation de données à l’analyse et au traitement de données complexes. En d’autres termes, Spyder est un outil de développement, tandis que DataLab est un outil d”analyse de données. Vous pouvez utiliser Spyder pour développer des algorithmes, puis utiliser DataLab pour analyser les données avec ces algorithmes.

Concepts de base#

Dans le contexte de votre travail de recherche ou technique, nous supposons que vous développez un logiciel pour traiter des données (signaux ou images) : ce logiciel peut être une application autonome ou une bibliothèque que vous utiliserez dans d’autres applications, ou même un simple script que vous exécuterez à partir de la ligne de commande. Dans tous les cas, vous devrez suivre un processus de développement qui comprendra les étapes suivantes :

  1. Prototyper l’algorithme dans un environnement de développement, tel que Spyder.

  2. Développer l’algorithme dans un environnement de développement, tel que Spyder.

  3. Tester l’algorithme avec des données.

  4. Déboguer l’algorithme si nécessaire.

  5. Répéter les étapes 2 et 3 jusqu’à ce que l’algorithme fonctionne comme prévu.

  6. Utiliser l’algorithme dans votre application.

Note

DataLab peut vous aider avec l’étape 0 car il fournit toutes les primitives de traitement dont vous avez besoin pour prototyper votre algorithme : vous pouvez charger des données, les visualiser et effectuer des opérations de traitement de base. Nous ne couvrirons pas cette étape dans les paragraphes suivants car la documentation de DataLab fournit déjà beaucoup d’informations à ce sujet.

Dans ce tutoriel, nous verrons comment utiliser DataLab pour effectuer les étapes 2 et 3. Nous supposons que vous avez déjà prototypé (de préférence dans DataLab !) et développé votre algorithme dans Spyder. Maintenant, vous voulez le tester avec des données, mais sans quitter Spyder car vous devrez peut-être apporter des modifications à votre algorithme et le re-tester. De plus, votre flux de travail est déjà configuré dans Spyder et vous ne voulez pas le changer.

Note

Dans ce tutoriel, nous supposons que vous avez déjà installé DataLab et que vous l’avez démarré. Si vous ne l’avez pas encore fait, veuillez vous référer à la section Installation de la documentation.

De plus, nous supposons que vous avez déjà installé Spyder et que vous l’avez démarré. Si vous ne l’avez pas encore fait, veuillez vous référer à la documentation de Spyder. Notez que vous n’avez pas besoin d’installer DataLab dans le même environnement que Spyder.: c’est tout l’intérêt de DataLab, c’est une application autonome qui peut être utilisée à partir de n’importe quel environnement. Pour ce tutoriel, vous n’avez besoin d’installer que le client DataLab Simple (pip install cdlclient) dans le même environnement que Spyder.

Tester votre algorithme avec DataLab#

Supposons que vous ayez développé des algorithmes dans le module my_work de votre projet. Vous les avez déjà prototypés dans DataLab, et vous les avez développés dans Spyder en écrivant des fonctions qui prennent des données en entrée et renvoient des données traitées en sortie. Maintenant, vous voulez tester ces algorithmes avec des données.

Pour tester ces algorithmes, vous avez écrit deux fonctions dans le module my_work :

  • test_my_1d_algorithm : cette fonction renvoie des données 1D qui vous permettront de valider votre premier algorithme qui fonctionne sur des données 1D.

  • test_my_2d_algorithm : cette fonction renvoie des données 2D qui vous permettront de valider votre deuxième algorithme qui fonctionne sur des données 2D.

Vous pouvez maintenant utiliser DataLab pour visualiser les données renvoyées par ces fonctions directement depuis Spyder :

  • Tout d’abord, vous devez démarrer DataLab et Spyder.

  • Rappelez-vous que DataLab est une application autonome qui peut être utilisée à partir de n’importe quel environnement, vous n’avez donc pas besoin de l’installer dans le même environnement que Spyder car la connexion entre ces deux applications se fait via un protocole de communication.

Voici comment faire :

# %% Connecting to DataLab current session

from cdlclient import SimpleRemoteProxy

proxy = SimpleRemoteProxy()
proxy.connect()

# %% Visualizing 1D data from my work

from my_work import test_my_1d_algorithm

x, y = test_my_1d_algorithm()  # Here is all my research/technical work!
proxy.add_signal("My 1D result data", x, y)  # Let's visualize it in DataLab
proxy.compute_wiener()  # Denoise the signal using the Wiener filter


# %% Visualizing 2D data from my work

from my_work import test_my_2d_algorithm

z = test_my_2d_algorithm()[1]  # Here is all my research/technical work!
proxy.add_image("My 2D result data", z)  # Let's visualize it in DataLab

Si nous exécutons les deux premières cellules, nous verrons la sortie suivante dans la console Spyder :

Python 3.11.5 (tags/v3.11.5:cce6ba9, Aug 24 2023, 14:38:34) [MSC v.1936 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.

IPython 8.15.0 -- An enhanced Interactive Python.

In [1]: runcell('Connecting to DataLab current session', 'my_work_test_with_cdl.py')
Connecting to DataLab XML-RPC server...OK (port: 54577)

In [2]: runcell('Visualizing 1D data from my work', 'my_work_test_with_cdl.py')
Out[2]: True
../../_images/015.png

Sur cette capture d’écran, nous pouvons voir le résultat de l’évaluation des deux premières cellules : la première cellule se connecte à DataLab, et la deuxième cellule visualise les données 1D renvoyées par la fonction test_my_1d_algorithm.#

../../_images/025.png

Sur cette capture d’écran, nous pouvons voir le résultat de l’évaluation de la troisième cellule : la fonction test_my_2d_algorithm renvoie un tableau 2D, et nous pouvons le visualiser directement dans DataLab.#

Déboguer votre algorithme avec DataLab#

Maintenant que vous avez testé vos algorithmes avec des données, vous voudrez peut-être les déboguer si nécessaire. Pour ce faire, vous pouvez combiner les capacités de débogage de Spyder avec DataLab.

Voici le code de l’algorithme fictif que nous voulons déboguer, dans lequel nous avons introduit un paramètre optionnel debug_with_datalab qui - s’il est défini sur True - créera un objet proxy permettant de visualiser les données étape par étape dans DataLab :

def generate_2d_data(
    num_lines: int = 10,
    noise_std: float = 0.1,
    x_min: float = -1,
    x_max: float = 1,
    num_points: int = 100,
    debug_with_datalab: bool = False,
) -> tuple[np.ndarray, np.ndarray]:
    """Generate 2D data that can be used in the tutorials to represent some results.

    Args:
        num_lines: Number of lines in the generated data, by default 10.
        noise_std: Standard deviation of the noise, by default 0.1.
        x_min: Minimum value of the x axis, by default -1.
        x_max: Maximum value of the x axis, by default 1.
        num_points: Number of points in the generated data, by default 100.
        debug_with_datalab: Whether to use the DataLab to debug the function,
         by default False.

    Returns:
        Generated data (x, y; where y is a 2D array and x is a 1D array).
    """
    proxy = None
    if debug_with_datalab:
        proxy = SimpleRemoteProxy()
        proxy.connect()
    z = np.zeros((num_lines, num_points))
    for i in range(num_lines):
        amplitude = 0.1 * i**2
        peak_position = 0.5 * i**2
        peak_width = 0.1 * i**2
        x, y = generate_1d_data(
            amplitude,
            peak_position,
            peak_width,
            relaxation_oscillations=True,
            noise=True,
            noise_std=noise_std,
            x_min=x_min,
            x_max=x_max,
            num_points=num_points,
        )
        z[i] = y
        if proxy is not None:
            proxy.add_signal(f"Line {i}", x, y)
    return x, z

La fonction test_my_2d_algorithm correspondante a également un paramètre optionnel debug_with_datalab qui est simplement passé à la fonction generate_2d_data.

Maintenant, nous pouvons utiliser Spyder pour déboguer la fonction test_my_2d_algorithm :

# %% Debugging my work with DataLab

from my_work import generate_2d_data

x, z = generate_2d_data(debug_with_datalab=True)

Dans cet exemple simple, l’algorithme itère simplement 10 fois et génère un tableau 1D à chaque itération. Chaque tableau 1D est ensuite empilé dans un tableau 2D qui est renvoyé par la fonction generate_2d_data. Avec le paramètre debug_with_datalab défini sur True, nous pouvons visualiser chaque tableau 1D dans DataLab : de cette façon, nous pouvons vérifier que l’algorithme fonctionne comme prévu.

../../_images/035.png

Sur cette capture d’écran, nous pouvons voir le résultat de l’évaluation de la première cellule : la fonction test_my_2d_algorithm est appelée avec le paramètre debug_with_datalab défini sur True : 10 tableaux 1D sont générés et visualisés dans DataLab.#

Note

Si nous avions exécuté le script en utilisant le débogueur Spyder et défini un point d’arrêt dans la fonction generate_2d_data, nous aurions vu les tableaux 1D générés dans DataLab à chaque itération : comme DataLab est exécuté dans un processus séparé, nous aurions pu manipuler les données dans DataLab pendant que l’algorithme est en pause dans Spyder.