Перейти к основному содержанию
Перейти к основному содержанию

Исследование данных с помощью ноутбуков Marimo и chDB

В этом руководстве вы узнаете, как исследовать набор данных в ClickHouse Cloud в ноутбуке Marimo с помощью chDB — быстрого внутрипроцессного SQL OLAP-движка на базе ClickHouse.

Предварительные требования:

Совет

Если у вас ещё нет аккаунта ClickHouse Cloud, вы можете зарегистрироваться и оформить пробную подписку, получив $300 в виде бесплатных кредитов для начала работы.

Чему вы научитесь:

  • Подключаться к ClickHouse Cloud из ноутбуков Marimo с использованием chDB
  • Выполнять запросы к удалённым наборам данных и преобразовывать результаты в объекты DataFrame библиотеки Pandas
  • Визуализировать данные с помощью Plotly в Marimo
  • Использовать реактивную модель выполнения Marimo для интерактивного исследования данных

Мы будем использовать набор данных UK Property Price, который доступен в ClickHouse Cloud как один из стартовых наборов данных. Он содержит данные о ценах, по которым дома продавались в Соединённом Королевстве с 1995 по 2024 год.

Настройка

Загрузка набора данных

Чтобы добавить этот набор данных в существующий сервис ClickHouse Cloud, войдите на console.clickhouse.cloud с использованием данных своей учётной записи.

В меню слева нажмите Data sources. Затем нажмите Predefined sample data:

Добавить пример набора данных

Выберите Get started в карточке UK property price paid data (4GB):

Выбор набора данных UK price paid

Затем нажмите Import dataset:

Импорт набора данных UK price paid

ClickHouse автоматически создаст таблицу pp_complete в базе данных default и заполнит таблицу 28,92 миллионами строк ценовых данных.

Чтобы снизить вероятность раскрытия ваших учётных данных, мы рекомендуем добавить имя пользователя и пароль ClickHouse Cloud в виде переменных окружения на локальной машине. В терминале выполните следующую команду, чтобы добавить имя пользователя и пароль как переменные окружения:

Настройка учётных данных

export CLICKHOUSE_CLOUD_HOSTNAME=<ИМЯ_ХОСТА>
export CLICKHOUSE_CLOUD_USER=default
export CLICKHOUSE_CLOUD_PASSWORD=ваш_реальный_пароль
Примечание

Переменные окружения, указанные выше, сохраняются только на время текущего сеанса терминала. Чтобы сделать их постоянными, добавьте их в конфигурационный файл вашей оболочки.

Установка Marimo

Теперь активируйте ваше виртуальное окружение. Находясь в виртуальном окружении, установите следующие пакеты, которые мы будем использовать в этом руководстве:

pip install chdb pandas plotly marimo

Создайте новый ноутбук Marimo с помощью следующей команды:

marimo edit clickhouse_exploration.py

В новом окне браузера должен открыться интерфейс Marimo по адресу localhost:2718:

Интерфейс Marimo

Ноутбуки Marimo представляют собой обычные файлы Python, поэтому их легко размещать в системах контроля версий и делиться ими с другими.

Установка зависимостей

В новой ячейке импортируйте необходимые пакеты:

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

Если вы наведёте курсор мыши на ячейку, вы увидите, что появляются два кружка с символом «+». Вы можете нажать на них, чтобы добавить новые ячейки.

Добавьте новую ячейку и выполните простой запрос, чтобы убедиться, что всё настроено правильно:

result = chdb.query("SELECT 'Привет, ClickHouse, от Marimo!'", "DataFrame")
result

Под ячейкой, которую вы только что запустили, должен появиться результат:

Marimo hello world

Исследование данных

После того как мы настроили набор данных UK price paid и запустили chDB в блокноте Marimo, можно приступать к исследованию данных. Представим, что нас интересует, как изменялась цена со временем для определённого района в Великобритании, например столицы — Лондона. Функция ClickHouse remoteSecure позволяет легко получать данные из ClickHouse Cloud. Вы можете указать chDB вернуть эти данные напрямую в виде фрейма данных Pandas — это удобный и хорошо знакомый способ работы с данными.

Выполнение запросов к данным в ClickHouse Cloud

Создайте новую ячейку со следующим запросом, чтобы получить данные UK price paid из вашего сервиса ClickHouse Cloud и преобразовать их в 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()

В приведённом выше фрагменте chdb.query(query, "DataFrame") выполняет указанный запрос и выводит результат в виде Pandas DataFrame.

В запросе мы используем функцию remoteSecure для подключения к ClickHouse Cloud.

Функция remoteSecure принимает в качестве параметров:

  • строку подключения
  • имя базы данных и таблицы
  • ваше имя пользователя
  • ваш пароль

В целях безопасности рекомендуется использовать переменные окружения для параметров имени пользователя и пароля, а не указывать их непосредственно в функции, хотя при необходимости это возможно.

Функция remoteSecure подключается к удалённому сервису ClickHouse Cloud, выполняет запрос и возвращает результат. В зависимости от объёма ваших данных это может занять несколько секунд.

В данном случае мы возвращаем среднюю цену за год и фильтруем по town='LONDON'. Затем результат сохраняется как DataFrame в переменной df.

Визуализация данных

Теперь, когда данные доступны нам в привычной форме, давайте посмотрим, как со временем изменялись цены на недвижимость в Лондоне.

Marimo особенно хорошо работает с интерактивными библиотеками визуализации, такими как Plotly. В новой ячейке создайте интерактивный график:

fig = px.line(
    df, 
    x='year', 
    y='price',
    title='Средние цены на недвижимость в Лондоне по годам',
    labels={'price': 'Средняя цена (£)', 'year': 'Год'}
)

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

Вполне ожидаемо, что со временем цены на недвижимость в Лондоне значительно выросли.

Визуализация данных Marimo

Одна из сильных сторон Marimo — её реактивная модель исполнения. Давайте создадим интерактивный виджет для динамического выбора городов.

Интерактивный выбор города

В новой ячейке создайте выпадающий список для выбора городов:

town_selector = mo.ui.dropdown(
    options=['LONDON', 'MANCHESTER', 'BIRMINGHAM', 'LEEDS', 'LIVERPOOL'],
    value='LONDON',
    label='Выберите город:'
)
town_selector

В другой ячейке создайте запрос, который реагирует на выбор города. Когда вы измените значение в выпадающем списке, эта ячейка будет выполняться повторно автоматически:

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

Теперь создайте диаграмму, которая будет автоматически обновляться при смене города. Вы можете переместить диаграмму выше динамического датафрейма, чтобы она располагалась под ячейкой с выпадающим списком.

fig_reactive = px.line(
    df_reactive,
    x='year',
    y='price',
    title=f'Средние цены на недвижимость в {town_selector.value} по годам',
    labels={'price': 'Средняя цена (£)', 'year': 'Год'}
)

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

Теперь, когда вы выбираете город из выпадающего списка, график будет динамически обновляться:

Динамический график Marimo

Изучение распределения цен с помощью интерактивных коробчатых диаграмм

Давайте глубже изучим данные, рассмотрев распределение цен на недвижимость в Лондоне по разным годам. Коробчатая диаграмма (box-and-whisker plot) покажет медиану, квартили и выбросы, давая гораздо более полное представление, чем просто средняя цена. Сначала создадим ползунок выбора года, который позволит нам интерактивно исследовать данные за разные годы:

В новой ячейке добавьте следующее:

year_slider = mo.ui.slider(
    start=1995,
    stop=2024,
    value=2020,
    step=1,
    label='Выберите год:',
    show_value=True
)
year_slider

Теперь давайте запросим цены отдельных объектов недвижимости за выбранный год. Обратите внимание, что мы здесь не выполняем агрегацию — нам нужны все отдельные сделки, чтобы построить наше распределение:

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")

# Создадим интерактивную диаграмму размаха
fig_box = go.Figure()

fig_box.add_trace(
    go.Box(
        y=df_distribution['price'],
        name=f'London {year_slider.value}',
        boxmean='sd',  # Показать среднее значение и стандартное отклонение
        marker_color='lightblue',
        boxpoints='outliers'  # Показать значения-выбросы
    )
)

fig_box.update_layout(
    title=f'Распределение цен на недвижимость в Лондоне ({year_slider.value})',
    yaxis=dict(
        title='Цена (£)',
        tickformat=',.0f'
    ),
    showlegend=False,
    height=600
)

fig_box

Если нажать кнопку параметров в правом верхнем углу ячейки, можно скрыть код. При перемещении ползунка график будет автоматически обновляться благодаря реактивному выполнению Marimo:

Динамический график Marimo

Итоги

В этом руководстве было показано, как использовать chDB для исследования данных в ClickHouse Cloud с помощью ноутбуков Marimo. На примере набора данных UK Property Price мы продемонстрировали, как выполнять запросы к удалённым данным ClickHouse Cloud с помощью функции remoteSecure() и преобразовывать результаты непосредственно в DataFrame библиотеки Pandas для анализа и визуализации. Благодаря chDB и реактивной модели выполнения Marimo дата-сайентисты могут использовать мощные возможности SQL в ClickHouse вместе с привычными инструментами Python, такими как Pandas и Plotly, с дополнительным преимуществом интерактивных виджетов и автоматического отслеживания зависимостей, что делает исследовательский анализ более эффективным и воспроизводимым.