JupySQL — это библиотека Python, которая позволяет выполнять SQL в среде Jupyter Notebook и оболочке IPython.
В этом руководстве мы узнаем, как выполнять запросы к данным с помощью chDB и JupySQL.
Сначала создадим виртуальное окружение:
Затем установим JupySQL, IPython и Jupyter Lab:
Мы можем использовать JupySQL в IPython, который запускается командой:
Или в Jupyter Lab, выполнив команду:
Если вы используете Jupyter Lab, перед тем как продолжить, вам нужно создать notebook.
Мы будем использовать один из наборов данных tennis_atp Джеффа Сакманна, который содержит метаданные об игроках и изменении их рейтингов со временем.
Для начала скачаем файлы с рейтингами:
Далее импортируем модуль dbapi для chDB:
И создадим подключение к chDB.
Все сохранённые данные будут записаны в каталог atp.chdb:
Теперь загрузим магию sql и создадим подключение к chDB:
Затем зададим лимит вывода, чтобы результаты запросов не обрезались:
## Запросы к данным в CSV-файлах
Мы загрузили несколько файлов с префиксом atp_rankings.
Давайте используем оператор DESCRIBE, чтобы понять схему:
Мы также можем выполнить SELECT-запрос непосредственно к этим файлам, чтобы посмотреть, как выглядят данные:
Формат данных немного необычный.
Давайте приведём дату в порядок и с помощью конструкции REPLACE вернём очищенное значение ranking_date:
Теперь мы сохраним данные из этих CSV-файлов в таблицу.
База данных по умолчанию не сохраняет данные на диске, поэтому сначала нужно создать другую базу данных:
А теперь мы создадим таблицу rankings, схема которой будет определена на основе структуры данных в CSV-файлах:
Давайте быстро проверим данные в нашей таблице:
Выглядит хорошо — результат, как и ожидалось, такой же, как при запросе напрямую к CSV-файлам.
Для метаданных игроков мы выполним тот же процесс.
На этот раз все данные находятся в одном CSV-файле, поэтому давайте загрузим этот файл:
Затем создайте таблицу players на основе содержимого CSV-файла.
Мы также приведём поле dob к типу Date32.
В ClickHouse тип Date поддерживает только даты начиная с 1970 года. Поскольку столбец dob содержит даты до 1970 года, вместо него мы используем тип Date32.
Когда выполнение завершится, мы сможем посмотреть на принятые данные:
Ингестия данных завершена, теперь пришло время для самой интересной части — запросов к данным!
Теннисисты получают очки в зависимости от того, насколько успешно они выступают в турнирах, в которых участвуют.
Очки каждого игрока учитываются за скользящий 52-недельный период.
Мы напишем запрос, который определит максимальное количество очков, набранных каждым игроком, а также его рейтинг на тот момент:
Довольно интересно, что некоторые игроки в этом списке набрали много очков, ни разу не оказавшись на 1-м месте с таким количеством очков.
Запросы можно сохранять, указав параметр --save в той же строке, что и магическая команда %%sql.
Параметр --no-execute означает, что выполнение запроса будет пропущено.
При запуске сохранённого запроса перед выполнением он преобразуется в Common Table Expression (CTE).
В следующем запросе мы вычисляем максимальное количество очков, набранных игроками, когда они занимали 1-е место:
Использование параметров в запросах
Мы также можем использовать параметры в запросах.
Параметры — это обычные переменные:
А затем мы можем использовать в запросе синтаксис {{variable}}.
Следующий запрос находит игроков, у которых прошло меньше всего дней между первым и последним попаданием в топ-10 рейтинга:
JupySQL также предоставляет ограниченные возможности для построения диаграмм.
Мы можем строить ящичные диаграммы или гистограммы.
Мы собираемся построить гистограмму, но сначала давайте напишем (и сохраним) запрос, который вычисляет, какие места в топ-100 занимал каждый игрок.
Это позволит нам построить гистограмму, показывающую, сколько игроков достигло каждого места:
Затем можно построить гистограмму следующим образом:
Последнее изменение 3 июля 2026 г.