> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-home-button.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> marimo — это Python-ноутбук нового поколения для работы с данными

# Использование marimo с ClickHouse

export const CommunityMaintainedBadge = () => {
  return <div className="CommunityMaintainedBadge">
            <div className="CommunityMaintainedIcon">
            <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">
                <path d="M244.8,150.4a8,8,0,0,1-11.2-1.6A51.6,51.6,0,0,0,192,128a8,8,0,0,1-7.37-4.89,8,8,0,0,1,0-6.22A8,8,0,0,1,192,112a24,24,0,1,0-23.24-30,8,8,0,1,1-15.5-4A40,40,0,1,1,219,117.51a67.94,67.94,0,0,1,27.43,21.68A8,8,0,0,1,244.8,150.4ZM190.92,212a8,8,0,1,1-13.84,8,57,57,0,0,0-98.16,0,8,8,0,1,1-13.84-8,72.06,72.06,0,0,1,33.74-29.92,48,48,0,1,1,58.36,0A72.06,72.06,0,0,1,190.92,212ZM128,176a32,32,0,1,0-32-32A32,32,0,0,0,128,176ZM72,120a8,8,0,0,0-8-8A24,24,0,1,1,87.24,82a8,8,0,1,0,15.5-4A40,40,0,1,0,37,117.51,67.94,67.94,0,0,0,9.6,139.19a8,8,0,1,0,12.8,9.61A51.6,51.6,0,0,1,64,128,8,8,0,0,0,72,120Z"></path>
            </svg>
        </div>
            Community Maintained
        </div>;
};

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

[marimo](https://marimo.io/) — это реактивный ноутбук с открытым исходным кодом для Python со встроенной поддержкой SQL. Когда вы запускаете ячейку или взаимодействуете с элементом интерфейса, marimo автоматически выполняет затронутые ячейки (или помечает их как устаревшие), сохраняя согласованность кода и результатов и предотвращая ошибки ещё до их возникновения. Каждый ноутбук marimo хранится как обычный Python-код, может выполняться как скрипт и разворачиваться как приложение.

<Image img="https://mintcdn.com/private-7c7dfe99-home-button/HT6FEZmSxQqQTe8U/images/integrations/sql-clients/marimo/clickhouse-connect.gif?s=c54f8fdc4140bd25cc52724b7663b7c2" size="md" border alt="Подключение к ClickHouse" width="1536" height="864" data-path="images/integrations/sql-clients/marimo/clickhouse-connect.gif" />

<div id="install-marimo-sql">
  ## 1. Установите marimo с поддержкой SQL
</div>

```shell theme={null}
pip install "marimo[sql]" clickhouse_connect
marimo edit clickhouse_demo.py
```

После этого в браузере должна открыться страница на localhost.

<div id="connect-to-clickhouse">
  ## 2. Подключение к ClickHouse.
</div>

Перейдите на панель источников данных в левой части редактора marimo и нажмите «Add database».

<Image img="https://mintcdn.com/private-7c7dfe99-home-button/HT6FEZmSxQqQTe8U/images/integrations/sql-clients/marimo/panel-arrow.png?fit=max&auto=format&n=HT6FEZmSxQqQTe8U&q=85&s=4cdb16067ffbd413eb123e3b9df2eb9a" size="sm" border alt="Добавить новую базу данных" width="491" height="561" data-path="images/integrations/sql-clients/marimo/panel-arrow.png" />

Затем вам будет предложено указать данные для подключения к базе данных.

<Image img="https://mintcdn.com/private-7c7dfe99-home-button/HT6FEZmSxQqQTe8U/images/integrations/sql-clients/marimo/add-db-details.png?fit=max&auto=format&n=HT6FEZmSxQqQTe8U&q=85&s=47cc10ec221adf1bdc182ff57f395b37" size="md" border alt="Укажите данные для подключения к базе данных" width="818" height="487" data-path="images/integrations/sql-clients/marimo/add-db-details.png" />

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

<Image img="https://mintcdn.com/private-7c7dfe99-home-button/HT6FEZmSxQqQTe8U/images/integrations/sql-clients/marimo/run-cell.png?fit=max&auto=format&n=HT6FEZmSxQqQTe8U&q=85&s=12dbd2a54e7944f7c4ede3750e64aec4" size="md" border alt="Запустите ячейку, чтобы подключиться к ClickHouse" width="995" height="283" data-path="images/integrations/sql-clients/marimo/run-cell.png" />

<div id="run-sql">
  ## 3. Выполните SQL-запрос
</div>

После настройки подключения вы можете создать новую SQL-ячейку и выбрать движок ClickHouse.

<Image img="https://mintcdn.com/private-7c7dfe99-home-button/HT6FEZmSxQqQTe8U/images/integrations/sql-clients/marimo/choose-sql-engine.png?fit=max&auto=format&n=HT6FEZmSxQqQTe8U&q=85&s=9f42e987e5335a7849e23276c769055a" size="md" border alt="Выберите SQL-движок" width="2762" height="709" data-path="images/integrations/sql-clients/marimo/choose-sql-engine.png" />

В этом руководстве мы будем использовать датасет New York Taxi.

```sql theme={null}
CREATE TABLE trips (
    trip_id             UInt32,
    pickup_datetime     DateTime,
    dropoff_datetime    DateTime,
    pickup_longitude    Nullable(Float64),
    pickup_latitude     Nullable(Float64),
    dropoff_longitude   Nullable(Float64),
    dropoff_latitude    Nullable(Float64),
    passenger_count     UInt8,
    trip_distance       Float32,
    fare_amount         Float32,
    extra               Float32,
    tip_amount          Float32,
    tolls_amount        Float32,
    total_amount        Float32,
    payment_type        Enum('CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4, 'UNK' = 5),
    pickup_ntaname      LowCardinality(String),
    dropoff_ntaname     LowCardinality(String)
)
ENGINE = MergeTree
PRIMARY KEY (pickup_datetime, dropoff_datetime);
```

```sql theme={null}
INSERT INTO trips
SELECT
    trip_id,
    pickup_datetime,
    dropoff_datetime,
    pickup_longitude,
    pickup_latitude,
    dropoff_longitude,
    dropoff_latitude,
    passenger_count,
    trip_distance,
    fare_amount,
    extra,
    tip_amount,
    tolls_amount,
    total_amount,
    payment_type,
    pickup_ntaname,
    dropoff_ntaname
FROM gcs(
    'https://storage.googleapis.com/clickhouse-public-datasets/nyc-taxi/trips_0.gz',
    'TabSeparatedWithNames'
);
```

```sql theme={null}
SELECT * FROM trips LIMIT 1000;
```

<Image img="https://mintcdn.com/private-7c7dfe99-home-button/HT6FEZmSxQqQTe8U/images/integrations/sql-clients/marimo/results.png?fit=max&auto=format&n=HT6FEZmSxQqQTe8U&q=85&s=ea284f44a75247027fbdf62532918ad3" size="lg" border alt="Результаты в датафрейме" width="947" height="415" data-path="images/integrations/sql-clients/marimo/results.png" />

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

<Image img="https://mintcdn.com/private-7c7dfe99-home-button/HT6FEZmSxQqQTe8U/images/integrations/sql-clients/marimo/dropdown-cell-chart.png?fit=max&auto=format&n=HT6FEZmSxQqQTe8U&q=85&s=604474a9c3689263f3c93e676f6706ea" size="lg" border alt="Сочетание выпадающего списка, таблицы и диаграммы" width="2720" height="2115" data-path="images/integrations/sql-clients/marimo/dropdown-cell-chart.png" />

Реактивная модель выполнения marimo распространяется и на SQL-запросы, поэтому изменения в SQL автоматически запускают последующие вычисления для зависимых ячеек (или, при желании, помечают ячейки как устаревшие, если вычисления слишком затратны). Поэтому при обновлении запроса меняются и диаграмма, и таблица.

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

<Image img="https://mintcdn.com/private-7c7dfe99-home-button/HT6FEZmSxQqQTe8U/images/integrations/sql-clients/marimo/run-app-view.png?fit=max&auto=format&n=HT6FEZmSxQqQTe8U&q=85&s=aad4ddcd3498120fd6c8fe24355d0731" size="md" border alt="Режим App View" width="2209" height="1534" data-path="images/integrations/sql-clients/marimo/run-app-view.png" />
