Skip to main content
JupySQL — это библиотека Python, которая позволяет выполнять SQL в среде Jupyter Notebook и оболочке IPython. В этом руководстве мы узнаем, как выполнять запросы к данным с помощью chDB и JupySQL.

Подготовка

Сначала создадим виртуальное окружение:
Затем установим JupySQL, IPython и Jupyter Lab:
Мы можем использовать JupySQL в IPython, который запускается командой:
Или в Jupyter Lab, выполнив команду:
Если вы используете Jupyter Lab, перед тем как продолжить, вам нужно создать notebook.

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

Мы будем использовать один из наборов данных tennis_atp Джеффа Сакманна, который содержит метаданные об игроках и изменении их рейтингов со временем. Для начала скачаем файлы с рейтингами:

Настройка chDB и JupySQL

Далее импортируем модуль dbapi для chDB:
И создадим подключение к chDB. Все сохранённые данные будут записаны в каталог atp.chdb:
Теперь загрузим магию sql и создадим подключение к chDB:
Затем зададим лимит вывода, чтобы результаты запросов не обрезались:
## Запросы к данным в CSV-файлах Мы загрузили несколько файлов с префиксом atp_rankings. Давайте используем оператор DESCRIBE, чтобы понять схему:
Мы также можем выполнить SELECT-запрос непосредственно к этим файлам, чтобы посмотреть, как выглядят данные:
Формат данных немного необычный. Давайте приведём дату в порядок и с помощью конструкции REPLACE вернём очищенное значение ranking_date:

Импорт CSV-файлов в chDB

Теперь мы сохраним данные из этих CSV-файлов в таблицу. База данных по умолчанию не сохраняет данные на диске, поэтому сначала нужно создать другую базу данных:
А теперь мы создадим таблицу rankings, схема которой будет определена на основе структуры данных в CSV-файлах:
Давайте быстро проверим данные в нашей таблице:
Выглядит хорошо — результат, как и ожидалось, такой же, как при запросе напрямую к CSV-файлам. Для метаданных игроков мы выполним тот же процесс. На этот раз все данные находятся в одном CSV-файле, поэтому давайте загрузим этот файл:
Затем создайте таблицу players на основе содержимого CSV-файла. Мы также приведём поле dob к типу Date32.
В ClickHouse тип Date поддерживает только даты начиная с 1970 года. Поскольку столбец dob содержит даты до 1970 года, вместо него мы используем тип Date32.
Когда выполнение завершится, мы сможем посмотреть на принятые данные:

Запросы к chDB

Ингестия данных завершена, теперь пришло время для самой интересной части — запросов к данным! Теннисисты получают очки в зависимости от того, насколько успешно они выступают в турнирах, в которых участвуют. Очки каждого игрока учитываются за скользящий 52-недельный период. Мы напишем запрос, который определит максимальное количество очков, набранных каждым игроком, а также его рейтинг на тот момент:
Довольно интересно, что некоторые игроки в этом списке набрали много очков, ни разу не оказавшись на 1-м месте с таким количеством очков.

Сохранение запросов

Запросы можно сохранять, указав параметр --save в той же строке, что и магическая команда %%sql. Параметр --no-execute означает, что выполнение запроса будет пропущено.
При запуске сохранённого запроса перед выполнением он преобразуется в Common Table Expression (CTE). В следующем запросе мы вычисляем максимальное количество очков, набранных игроками, когда они занимали 1-е место:

Использование параметров в запросах

Мы также можем использовать параметры в запросах. Параметры — это обычные переменные:
А затем мы можем использовать в запросе синтаксис {{variable}}. Следующий запрос находит игроков, у которых прошло меньше всего дней между первым и последним попаданием в топ-10 рейтинга:

Построение гистограмм

JupySQL также предоставляет ограниченные возможности для построения диаграмм. Мы можем строить ящичные диаграммы или гистограммы. Мы собираемся построить гистограмму, но сначала давайте напишем (и сохраним) запрос, который вычисляет, какие места в топ-100 занимал каждый игрок. Это позволит нам построить гистограмму, показывающую, сколько игроков достигло каждого места:
Затем можно построить гистограмму следующим образом:
Последнее изменение 3 июля 2026 г.