Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Explorer les données avec les notebooks Marimo et chDB

Dans ce guide, vous apprendrez à explorer un jeu de données dans ClickHouse Cloud depuis un notebook Marimo à l’aide de chDB - un moteur SQL OLAP rapide en processus, powered by ClickHouse.

Prérequis :

  • Python 3.8 ou version ultérieure
  • un environnement virtuel
  • un service ClickHouse Cloud opérationnel et vos informations de connexion

Ce que vous apprendrez :

  • Vous connecter à ClickHouse Cloud depuis des notebooks Marimo avec chDB
  • Interroger des jeux de données distants et convertir les résultats en Pandas DataFrames
  • Visualiser des données avec Plotly dans Marimo
  • Tirer parti du modèle d’exécution réactif de Marimo pour l’exploration interactive des données

Nous utiliserons le jeu de données UK Property Price, disponible dans ClickHouse Cloud comme l’un des jeux de données de démarrage. Il contient des données sur les prix de vente des maisons au Royaume-Uni entre 1995 et 2024.

Configuration

Chargement du jeu de données

Pour ajouter ce jeu de données à un service ClickHouse Cloud existant, connectez-vous à console.clickhouse.cloud avec les informations de votre compte.

Dans le menu de gauche, cliquez sur Data sources. Cliquez ensuite sur Predefined sample data :

Ajouter un exemple de jeu de données

Sélectionnez Get started dans la carte UK property price paid data (4GB) :

Sélectionner le jeu de données UK price paid

Cliquez ensuite sur Import dataset :

Importer le jeu de données UK price paid

ClickHouse créera automatiquement la table pp_complete dans la base de données default et la remplira avec 28,92 millions de lignes de données de prix.

Afin de réduire le risque d’exposer vos identifiants, nous vous recommandons d’ajouter votre nom d’utilisateur et votre mot de passe Cloud comme variables d’environnement sur votre machine locale. Depuis un terminal, exécutez la commande suivante pour ajouter votre nom d’utilisateur et votre mot de passe comme variables d’environnement :

Configuration des identifiants

export CLICKHOUSE_CLOUD_HOSTNAME=<HOSTNAME>
export CLICKHOUSE_CLOUD_USER=default
export CLICKHOUSE_CLOUD_PASSWORD=your_actual_password

Installation de Marimo

Activez maintenant votre environnement virtuel. Depuis celui-ci, installez les paquets suivants que nous utiliserons dans ce guide :

pip install chdb pandas plotly marimo

Créez un nouveau notebook Marimo à l’aide de la commande suivante :

marimo edit clickhouse_exploration.py

Une nouvelle fenêtre du navigateur devrait s’ouvrir avec l’interface Marimo sur localhost:2718 :

interface Marimo

Les notebooks Marimo sont stockés sous forme de fichiers Python pur, ce qui facilite leur gestion avec un système de contrôle de version et leur partage avec d’autres utilisateurs.

Installer les dépendances

Dans une nouvelle cellule, importez les paquets requis :

import marimo as mo
import chdb
import pandas as pd
import os
import plotly.express as px
import plotly.graph_objects as go

Lorsque vous passez la souris sur la cellule, deux cercles avec le symbole "+" apparaissent. Vous pouvez cliquer dessus pour ajouter de nouvelles cellules.

Ajoutez une nouvelle cellule et exécutez une requête simple pour vérifier que tout est correctement configuré :

result = chdb.query("SELECT 'Hello ClickHouse from Marimo!'", "DataFrame")
result

Vous devriez voir le résultat s’afficher sous la cellule que vous venez d’exécuter :

Marimo Hello World

Explorer les données

Avec le jeu de données UK price paid configuré et chDB opérationnel dans un notebook Marimo, nous pouvons maintenant commencer à explorer nos données. Imaginons que nous souhaitions examiner l’évolution des prix au fil du temps dans une région précise du Royaume-Uni, par exemple sa capitale, Londres. La fonction remoteSecure de ClickHouse vous permet de récupérer facilement les données depuis ClickHouse Cloud. Vous pouvez demander à chDB de renvoyer ces données sous la forme d’une Pandas DataFrame en mémoire, ce qui constitue une manière pratique et familière de travailler avec les données.

Interroger les données de ClickHouse Cloud

Créez une nouvelle cellule avec la requête suivante pour récupérer les données UK price paid depuis votre service ClickHouse Cloud et les convertir en pandas.DataFrame :

query = f"""
SELECT
    toYear(date) AS year,
    round(avg(price)) AS price,
    bar(price, 0, 1000000, 80)
FROM remoteSecure(
    '{os.environ.get("CLICKHOUSE_CLOUD_HOSTNAME")}',
    'default.pp_complete',
    '{os.environ.get("CLICKHOUSE_CLOUD_USER")}',
    '{os.environ.get("CLICKHOUSE_CLOUD_PASSWORD")}'
)
WHERE town = 'LONDON'
GROUP BY year
ORDER BY year
"""

df = chdb.query(query, "DataFrame")
df.head()

Dans l’extrait ci-dessus, chdb.query(query, "DataFrame") exécute la requête spécifiée et renvoie le résultat sous forme de Pandas DataFrame.

Dans la requête, nous utilisons la fonction remoteSecure pour nous connecter à ClickHouse Cloud.

La fonction remoteSecure prend comme paramètres :

  • une chaîne de connexion
  • le nom de la base de données et de la table à utiliser
  • votre nom d’utilisateur
  • votre mot de passe

Comme bonne pratique de sécurité, il est préférable d’utiliser des variables d’environnement pour les paramètres de nom d’utilisateur et de mot de passe plutôt que de les spécifier directement dans la fonction, même si cela reste possible si vous le souhaitez.

La fonction remoteSecure se connecte au service ClickHouse Cloud distant, exécute la requête et renvoie le résultat. Selon la taille de vos données, cela peut prendre quelques secondes.

Dans ce cas, nous renvoyons un prix moyen par année et appliquons un filtre avec town='LONDON'. Le résultat est ensuite stocké sous forme de DataFrame dans une variable appelée df.

Visualisation des données

Les données étant désormais disponibles dans un format familier, voyons comment les prix de l'immobilier à Londres ont évolué au fil du temps.

Marimo fonctionne particulièrement bien avec des bibliothèques de visualisation interactives comme Plotly. Dans une nouvelle cellule, créez un graphique interactif :

fig = px.line(
    df, 
    x='year', 
    y='price',
    title='Average Property Prices in London Over Time',
    labels={'price': 'Average Price (£)', 'year': 'Year'}
)

fig.update_traces(mode='lines+markers')
fig.update_layout(hovermode='x unified')
fig

Sans surprise, les prix de l’immobilier à Londres ont fortement augmenté au fil du temps.

Visualisation de données Marimo

L’un des points forts de Marimo est son modèle d’exécution réactif. Créons un widget interactif pour sélectionner différentes villes de manière dynamique.

Sélection interactive d’une commune

Dans une nouvelle cellule, ajoutez une liste déroulante pour sélectionner différentes communes :

town_selector = mo.ui.dropdown(
    options=['LONDON', 'MANCHESTER', 'BIRMINGHAM', 'LEEDS', 'LIVERPOOL'],
    value='LONDON',
    label='Select a town:'
)
town_selector

Dans une autre cellule, créez une requête qui réagit à la sélection de la ville. Lorsque vous modifiez la liste déroulante, cette cellule se réexécute automatiquement :

query_reactive = f"""
SELECT
    toYear(date) AS year,
    round(avg(price)) AS price
FROM remoteSecure(
    '{os.environ.get("CLICKHOUSE_CLOUD_HOSTNAME")}',
    'default.pp_complete',
    '{os.environ.get("CLICKHOUSE_CLOUD_USER")}',
    '{os.environ.get("CLICKHOUSE_CLOUD_PASSWORD")}'
)
WHERE town = '{town_selector.value}'
GROUP BY year
ORDER BY year
"""

df_reactive = chdb.query(query_reactive, "DataFrame")
df_reactive

Créez maintenant un graphique qui se met à jour automatiquement lorsque vous changez de ville. Vous pouvez déplacer le graphique au-dessus de la DataFrame dynamique afin qu'il s'affiche sous la cellule avec la liste déroulante.

fig_reactive = px.line(
    df_reactive,
    x='year',
    y='price',
    title=f'Average Property Prices in {town_selector.value} Over Time',
    labels={'price': 'Average Price (£)', 'year': 'Year'}
)

fig_reactive.update_traces(mode='lines+markers')
fig_reactive.update_layout(hovermode='x unified')
fig_reactive

Désormais, lorsque vous sélectionnez une ville dans la liste déroulante, le graphique se met à jour automatiquement :

Graphique dynamique Marimo

Explorer les distributions de prix avec des boîtes à moustaches interactives

Approfondissons l’analyse des données en examinant la répartition des prix de l’immobilier à Londres selon les années. Une boîte à moustaches nous montrera la médiane, les quartiles et les valeurs aberrantes, ce qui nous donnera une compréhension bien plus claire qu’un simple prix moyen. Commençons par créer un curseur d’année qui nous permettra d’explorer les différentes années de manière interactive :

Dans une nouvelle cellule, ajoutez ce qui suit :

year_slider = mo.ui.slider(
    start=1995,
    stop=2024,
    value=2020,
    step=1,
    label='Select Year:',
    show_value=True
)
year_slider

Interrogeons maintenant les prix de chaque bien pour l'année sélectionnée. Notez que nous n'effectuons ici aucune agrégation : nous voulons conserver toutes les transactions individuelles pour constituer notre distribution :

query_distribution = f"""
SELECT
    price,
    toYear(date) AS year
FROM remoteSecure(
    '{os.environ.get("CLICKHOUSE_CLOUD_HOSTNAME")}',
    'default.pp_complete',
    '{os.environ.get("CLICKHOUSE_CLOUD_USER")}',
    '{os.environ.get("CLICKHOUSE_CLOUD_PASSWORD")}'
)
WHERE town = 'LONDON'
  AND toYear(date) = {year_slider.value}
  AND price > 0
  AND price < 5000000
"""

df_distribution = chdb.query(query_distribution, "DataFrame")

# create an interactive box plot.
fig_box = go.Figure()

fig_box.add_trace(
    go.Box(
        y=df_distribution['price'],
        name=f'London {year_slider.value}',
        boxmean='sd',  # Show mean and standard deviation
        marker_color='lightblue',
        boxpoints='outliers'  # Show outlier points
    )
)

fig_box.update_layout(
    title=f'Distribution of Property Prices in London ({year_slider.value})',
    yaxis=dict(
        title='Price (£)',
        tickformat=',.0f'
    ),
    showlegend=False,
    height=600
)

fig_box

Si vous cliquez sur le bouton d’options en haut à droite de la cellule, vous pouvez masquer le code. Lorsque vous déplacez le curseur, le graphique se met automatiquement à jour grâce à l’exécution réactive de Marimo :

Graphique dynamique de Marimo

Résumé

Ce guide a montré comment utiliser chDB pour explorer vos données dans ClickHouse Cloud à l’aide de notebooks Marimo. À partir du jeu de données UK Property Price, nous avons montré comment interroger des données distantes dans ClickHouse Cloud avec la fonction remoteSecure(), et convertir directement les résultats en Pandas DataFrames pour l’analyse et la visualisation. Grâce à chDB et au modèle d’exécution réactif de Marimo, les data scientists peuvent tirer parti des puissantes fonctionnalités SQL de ClickHouse tout en utilisant des outils Python courants comme Pandas et Plotly, avec en plus des widgets interactifs et un suivi automatique des dépendances, qui rendent l’analyse exploratoire plus efficace et reproductible.

Navigation