<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Yuriy Gavrilov: posts tagged Data Visualization</title>
<link>https://gavrilov.info/tags/data-visualization/</link>
<description>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</description>
<author></author>
<language>en</language>
<generator>Aegea 11.4 (v4171e)</generator>

<itunes:owner>
<itunes:name></itunes:name>
<itunes:email>yvgavrilov@gmail.com</itunes:email>
</itunes:owner>
<itunes:subtitle>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</itunes:subtitle>
<itunes:image href="https://gavrilov.info/pictures/userpic/userpic-square@2x.jpg?1643451008" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Искусство скорости: Руководство по оптимизации для аналитики в Data Lakehouse с DuckDB</title>
<guid isPermaLink="false">279</guid>
<link>https://gavrilov.info/all/iskusstvo-skorosti-rukovodstvo-po-optimizacii-dlya-analitiki-v-d/</link>
<pubDate>Tue, 09 Sep 2025 01:48:12 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/iskusstvo-skorosti-rukovodstvo-po-optimizacii-dlya-analitiki-v-d/</comments>
<enclosure url="https://gavrilov.info/video/-5436782684090959843.mp4" type="video/mp4" length="2206521" />
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-09-09-v-01.35.35.png" width="1174" height="108" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;DuckDB завоевал огромную популярность как “SQLite для аналитики”. Это невероятно быстрый, встраиваемый, колоночный движок, который не требует отдельного сервера. Однако его мощь по-настоящему раскрывается, когда он получает доступ к данным эффективно. Просто натравить DuckDB на петабайтный дата-лейк без подготовки — это рецепт для медленных запросов и высоких затрат.&lt;/p&gt;
&lt;p&gt;Как же построить мост между огромным хранилищем данных и молниеносной интерактивной аналитикой, которую обещает DuckDB?&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;video src="https://gavrilov.info/video/-5436782684090959843.mp4#t=0.001" width="640" height="480" controls alt="" /&gt;

&lt;/div&gt;
&lt;p&gt;В этой статье рассмотрим три фундаментальных архитектурных подхода к организации доступа к данным для DuckDB. Но прежде чем мы погрузимся в то, как *читать* данные, давайте поговорим о том, как их *готовить*.&lt;/p&gt;
&lt;h4&gt;Большая картина: Подготовка данных с помощью Trino&lt;/h4&gt;
&lt;p&gt;Данные в вашем Lakehouse не появляются из ниоткуда. Они поступают из операционных баз данных, потоков событий (Kafka), логов и десятков других источников. Прежде чем DuckDB сможет их эффективно запросить, эти данные нужно собрать, очистить, трансформировать и, что самое важное, организовать в надежный и производительный формат.&lt;/p&gt;
&lt;p&gt;Здесь на сцену выходит &lt;b&gt;Trino&lt;/b&gt; (ранее известный как PrestoSQL).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Что такое Trino?&lt;/b&gt; Это мощный распределенный SQL-движок, созданный для выполнения запросов к гетерогенным источникам данных. Его суперсила — способность “на лету” объединять данные из PostgreSQL, Kafka, Hive, MySQL и многих других систем.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Роль Trino в Lakehouse:&lt;/b&gt; В современной архитектуре Trino часто выступает в роли “фабрики данных”. Он выполняет тяжелую работу по &lt;b&gt;ETL/ELT&lt;/b&gt; (Extract, Transform, Load), подготавливая данные для аналитических инструментов вроде DuckDB.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Типичный сценарий использования:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Источники:&lt;/b&gt; У вас есть события о прослушивании треков в Kafka, а информация о пользователях — в базе данных PostgreSQL.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Задача:&lt;/b&gt; Создать единую, денормализованную таблицу Iceberg для аналитики.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Решение с Trino:&lt;/b&gt; Вы настраиваете в Trino коннекторы к Kafka и PostgreSQL. Затем вы запускаете периодический SQL-запрос, который читает данные из обоих источников, объединяет их и записывает результат в новую или существующую таблицу Iceberg.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;-- Этот запрос выполняется в Trino, а не в DuckDB!
    INSERT INTO iceberg_catalog.analytics.daily_user_activity
    SELECT
        u.user_id,
        u.country,
        e.event_timestamp,
        e.track_id,
        e.duration_ms
    FROM
        postgres_catalog.public.users u
    JOIN
        kafka_catalog.raw_data.listen_events e ON u.user_id = e.user_id
    WHERE
        e.event_date = CURRENT_DATE;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Как отмечается в одном из руководств, именно такой `INSERT INTO ... SELECT ...` является типичным способом перемещения данных в Iceberg с помощью Trino.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Итог:&lt;/b&gt; Trino работает “глубоко в машинном отделении” вашего Lakehouse. Он берет на себя тяжелые, распределенные задачи по преобразованию данных, а DuckDB получает на вход уже чистые, структурированные и оптимизированные для чтения таблицы Iceberg.&lt;/p&gt;
&lt;p&gt;Теперь, когда данные готовы, давайте рассмотрим, как их лучше всего потреблять.&lt;/p&gt;
&lt;h4&gt;Подход 1: Табличные форматы (Iceberg) — Читайте только то, что нужно&lt;/h4&gt;
&lt;p&gt;Это самый продвинутый и рекомендуемый подход для серьезной аналитики, особенно в serverless-архитектуре.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Как это работает:&lt;/b&gt; Вместо того чтобы работать с “россыпью” файлов Parquet, вы работаете с логической таблицей, управляемой Apache Iceberg. Расширение `iceberg` в DuckDB использует метаданные Iceberg для интеллектуального отсечения ненужных файлов (partition pruning) и блоков данных (predicate pushdown), читая с диска минимально необходимый объем информации.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Архитектура:&lt;/b&gt; `Данные на S3 -&gt; Trino (ETL) -&gt; Таблица Iceberg -&gt; DuckDB (Аналитика)`&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Назначение и сценарии использования:&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Serverless-аналитика:&lt;/b&gt; Основной кейс. AWS Lambda или Google Cloud Function, оснащенная DuckDB, выполняет SQL-запрос к озеру данных. Благодаря Iceberg, функция читает всего несколько мегабайт вместо гигабайт, что делает ее выполнение быстрым (&lt;1 сек) и дешевым.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Локальная разработка и BI:&lt;/b&gt; Аналитик данных или инженер открывает Jupyter Notebook на своем ноутбуке. С помощью DuckDB он подключается напрямую к производственному Lakehouse и выполняет исследовательский анализ, не создавая копий данных и не перегружая кластеры.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Встраиваемая аналитика:&lt;/b&gt; Backend-сервис на Python или Node.js, которому нужно быстро отвечать на аналитические вопросы (например, “показать статистику пользователя за последний месяц”). Он использует DuckDB для прямого запроса к Lakehouse без обращения к промежуточной базе данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Подход 2: RPC-стриминг (Apache Arrow Flight) — Прямой канал к данным&lt;/h4&gt;
&lt;p&gt;Иногда вам не нужна вся мощь Iceberg, а нужно просто эффективно выполнить запрос на удаленном экземпляре DuckDB и получить результат.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Как это работает:&lt;/b&gt; Вы запускаете сервер, который инкапсулирует DuckDB. Клиент и сервер общаются по протоколу Arrow Flight — высокопроизводительному фреймворку для стриминга колоночных данных в формате Apache Arrow без затрат на сериализацию.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Архитектура:&lt;/b&gt; `Клиент -&gt; Arrow Flight RPC -&gt; Сервер с DuckDB -&gt; Данные (любой источник)`&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Назначение и сценарии использования:&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Интерактивные дашборды:&lt;/b&gt; Веб-интерфейс (React, Vue) должен строить графики в реальном времени. Он отправляет SQL-запросы на Flight-сервер и получает данные для отрисовки практически мгновенно, без “тяжести” HTTP/JSON.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API-шлюз для данных:&lt;/b&gt; Централизация доступа к данным для множества внутренних микросервисов. Вместо того чтобы каждый сервис имел свои креды и логику подключения к БД, они обращаются к единому, стабильному Flight API.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Кросс-языковое взаимодействие:&lt;/b&gt; Сервис на Java должен получить результаты вычислений из BI-системы, построенной на Python и DuckDB. Arrow Flight обеспечивает эффективный и стандартизированный мост между ними.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Подход 3: “API поверх данных” (ROAPI &amp; DataFusion) — Декларативная альтернатива&lt;/h4&gt;
&lt;p&gt;Что, если вам не нужна вся гибкость SQL, а нужен стандартный REST или GraphQL API поверх ваших данных без строчки кода? Здесь на сцену выходит &lt;b&gt;ROAPI&lt;/b&gt;.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-212.png" width="1612" height="1435" alt="" /&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Как это работает:&lt;/b&gt; ROAPI — это инструмент, который автоматически создает API, читая конфигурационный YAML-файл, где вы описываете ваши данные (Parquet, CSV и т.д.). Под капотом он использует Apache Arrow DataFusion, движок запросов, написанный на Rust, являющийся идейным братом DuckDB.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Архитектура:&lt;/b&gt; `Клиент (HTTP/GraphQL) -&gt; ROAPI Server -&gt; Данные (файлы)`&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Назначение и сценарии использования:&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Быстрое прототипирование:&lt;/b&gt; Вам нужно за 5 минут предоставить команде фронтенда API для нового набора данных. Вы пишете 10 строк в YAML, запускаете ROAPI — и API готов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Простые микросервисы данных:&lt;/b&gt; Сервис, единственная задача которого — раздавать данные из файла с поддержкой фильтрации и пагинации. ROAPI делает это из коробки, избавляя вас от написания рутинного кода на FastAPI или Express.js.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Дата-фиды для внешних систем:&lt;/b&gt; Предоставление стандартизированного API для партнерской системы, которая умеет работать с REST, но не умеет читать Parquet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;и еще немного про DuckDB&lt;/h4&gt;
&lt;h5&gt;1. Читайте меньше данных (Золотое правило)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Используйте Iceberg:&lt;/b&gt; Это лучший способ.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Проекция колонок (`SELECT col1, col2...`):&lt;/b&gt; &lt;b&gt;Никогда не используйте `SELECT *`&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Проталкивание предикатов (`WHERE`):&lt;/b&gt; Пишите максимально конкретные фильтры. DuckDB автоматически проталкивает их в сканеры Parquet и Iceberg. Используйте `EXPLAIN` для проверки того, что фильтры применяются на этапе сканирования.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;2. Оптимизация SQL-запросов&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Материализация промежуточных результатов:&lt;/b&gt; Если вы делаете несколько агрегаций над одним и тем же отфильтрованным срезом, сохраните его во временную таблицу с помощью `CREATE TEMP TABLE ... AS`.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Используйте `COPY` для массовой загрузки:&lt;/b&gt; При загрузке данных в DuckDB `COPY` на порядки быстрее, чем `INSERT`.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Предварительная агрегация:&lt;/b&gt; Для сверхбольших данных создавайте “витрины” с помощью Trino (см. выше) или DuckDB, а запросы стройте уже по ним.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;3. Настройка окружения DuckDB&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Управление памятью:&lt;/b&gt; `SET memory_limit = ‘1GB’;` — обязательная настройка в Lambda и контейнерах.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Параллелизм:&lt;/b&gt; `SET threads = 4;` — адаптируйте количество потоков под vCPU вашего окружения.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Настройка `httpfs` для S3:&lt;/b&gt; Настройте регион (`s3_region`), креды и включите кэширование метаданных, чтобы не перечитывать их при каждом запуске. ( Это комьюнити дополнение -&lt;a href="https://duckdb.org/community_extensions/extensions/cache_httpfs.html"&gt;cache_httpfs&lt;/a&gt;, см. ниже “Проблема Шторм” )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Еще вот тут можно почитать: &lt;a href="https://duckdb.org/docs/stable/guides/performance/how_to_tune_workloads"&gt;https://duckdb.org/docs/stable/guides/performance/how_to_tune_workloads&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Заключение: Какой подход выбрать?&lt;/h4&gt;
&lt;p&gt;Выбор архитектуры зависит от вашей задачи. Каждая из них занимает свою нишу в стеке современной инженерии данных.&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Подход&lt;/td&gt;
&lt;td style="text-align: center"&gt;Ключевая технология&lt;/td&gt;
&lt;td style="text-align: center"&gt;Когда использовать&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Табличный формат&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Trino (Подготовка) + DuckDB/Iceberg (Потребление)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Стандарт для Lakehouse.&lt;/b&gt; Нужна строгая структура, надежность и максимальная производительность для аналитических SQL-запросов от различных инструментов.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;RPC-стриминг&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;DuckDB + Arrow Flight&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нужен &lt;b&gt;быстрый интерактивный SQL-доступ&lt;/b&gt; к удаленному экземпляру DuckDB, например, для дашборда или кастомного клиента.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;API поверх данных&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;ROAPI + DataFusion&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нужно &lt;b&gt;быстро и без кода&lt;/b&gt; поднять стандартный `REST`/`GraphQL` API поверх наборов данных для прототипирования или простых микросервисов.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h4&gt;Проблема Шторм из GET-запросов к S3&lt;/h4&gt;
&lt;p&gt;Давайте представим, что вы выполняете запрос к таблице Iceberg или просто к набору из 1000 файлов Parquet на S3:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;SELECT count(*)
FROM read_parquet('s3://my-bucket/data/*.parquet')
WHERE event_type = 'click';&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Чтобы выполнить этот запрос с максимальной эффективностью (с “проталкиванием предиката”), DuckDB должен сделать следующее, *прежде чем* читать основные данные:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Получить список всех 1000 файлов.&lt;/li&gt;
&lt;li&gt;Для &lt;b&gt;каждого&lt;/b&gt; из 1000 файлов прочитать его &lt;b&gt;метаданные (футер)&lt;/b&gt;. Футер Parquet-файла — это небольшой блок в конце файла, содержащий схему и, что самое важное, статистику по колонкам (min/max значения).&lt;/li&gt;
&lt;li&gt;Проанализировав футер, DuckDB понимает, может ли в этом файле вообще содержаться `event_type = ‘click’`. Если статистика говорит, что в файле есть только типы `’view’` и `’purchase’`, утка его пропустит.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Проблема в том, что для чтения футера каждого файла DuckDB должен отправить отдельный HTTP `GET` запрос с указанием диапазона байт (range request) к S3. То есть, один SQL-запрос порождает &lt;b&gt;1000+ мелких HTTP-запросов&lt;/b&gt;. Это может быть медленно и может быть дорого, так как в S3 вы платите за каждый `GET` запрос.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Кэширование метаданных решает именно эту проблему:&lt;/b&gt; оно сохраняет результаты этих мелких запросов на локальный диск, чтобы при повторном обращении к тем же файлам DuckDB брал их из локального кэша, а не летел снова в S3.&lt;/p&gt;
&lt;h4&gt;Решение: Комьюнити-расширение `cache_httpfs`&lt;/h4&gt;
&lt;p&gt;Для реализации постоянного, дискового кэширования в DuckDB используется специальное комьюнити-расширение `cache_httpfs`. Оно работает как “обертка” над стандартным `httpfs`.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Основная идея:&lt;/b&gt; Вы говорите DuckDB использовать `cache_httpfs` в качестве клиента для HTTP-запросов. Этот клиент сначала проверяет, нет ли уже нужного блока данных (например, футера Parquet-файла) в локальном кэше. Если есть — отдает его мгновенно. Если нет — идет в S3, скачивает блок, сохраняет его в кэш и отдает DuckDB.&lt;/p&gt;
&lt;p&gt;Вот как это настроить:&lt;/p&gt;
&lt;h5&gt;Шаг 1: Установка и загрузка расширений&lt;/h5&gt;
&lt;p&gt;Вам понадобятся три расширения: `httpfs` (для работы с S3), `cache_httpfs` (для кэширования) и, если вы работаете с Iceberg, то и `iceberg`.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;INSTALL httpfs;
INSTALL cache_httpfs;
LOAD httpfs;
LOAD cache_httpfs;&lt;/code&gt;&lt;/pre&gt;&lt;h5&gt;Шаг 2: Активация кэширующего клиента&lt;/h5&gt;
&lt;p&gt;Это ключевой шаг. Вы должны указать DuckDB использовать `cache_httpfs` для всех HTTP-операций.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;SET httpfs_client = 'cached_httpfs';&lt;/code&gt;&lt;/pre&gt;&lt;h5&gt;Шаг 3: Настройка пути к кэшу (критически важно для Serverless)&lt;/h5&gt;
&lt;p&gt;По умолчанию `cache_httpfs` сохраняет кэш в директорию `~/.cache/duckdb/`. Это хорошо работает на локальной машине, но в serverless-окружениях (AWS Lambda, Cloud Functions) эта папка либо недоступна для записи, либо является эфемерной.&lt;/p&gt;
&lt;p&gt;В serverless-среде единственное гарантированно доступное для записи место — это директория `/tmp`.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;SET cache_httpfs_cache_path = '/tmp/duckdb_cache';&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Этот кэш в `/tmp` будет “жить” между “теплыми” вызовами вашей Lambda-функции. Если одна и та же функция вызывается несколько раз подряд, второй и последующие вызовы будут использовать уже заполненный кэш, что кардинально ускорит выполнение запросов к одним и тем же данным.&lt;/p&gt;
&lt;h4&gt;Полный пример конфигурации (Python)&lt;/h4&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import duckdb

# Подключаемся к базе данных
con = duckdb.connect()

# Устанавливаем и загружаем расширения
con.execute(&amp;quot;INSTALL httpfs;&amp;quot;)
con.execute(&amp;quot;INSTALL cache_httpfs;&amp;quot;)
con.execute(&amp;quot;LOAD httpfs;&amp;quot;)
con.execute(&amp;quot;LOAD cache_httpfs;&amp;quot;)

# --- Настройка S3 и кэша ---

# 1. Настройте креды для S3 (если не используются IAM-роли)
# con.execute(&amp;quot;SET s3_access_key_id='YOUR_KEY';&amp;quot;)
# con.execute(&amp;quot;SET s3_secret_access_key='YOUR_SECRET';&amp;quot;)
con.execute(&amp;quot;SET s3_region='us-east-1';&amp;quot;)

# 2. Активируем кэширующий http-клиент
con.execute(&amp;quot;SET httpfs_client = 'cached_httpfs';&amp;quot;)

# 3. Указываем путь к директории кэша (обязательно для serverless)
con.execute(&amp;quot;SET cache_httpfs_cache_path = '/tmp/duckdb_http_cache';&amp;quot;)

# --- Выполняем запрос ---

# Первый запуск этого запроса будет медленнее,
# так как он заполнит кэш метаданными файлов.
result1 = con.execute(&amp;quot;SELECT count(*) FROM 's3://my-bucket/data/*.parquet'&amp;quot;).fetchone()
print(f&amp;quot;Первый запуск: {result1[0]}&amp;quot;)

# Второй запуск будет на порядки быстрее,
# так как все метаданные будут прочитаны из локального кэша в /tmp.
result2 = con.execute(&amp;quot;SELECT count(*) FROM 's3://my-bucket/data/*.parquet'&amp;quot;).fetchone()
print(f&amp;quot;Второй запуск (с кэшем): {result2[0]}&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Сравнение: Встроенный кэш vs `cache_httpfs`&lt;/h4&gt;
&lt;p&gt;Стоит отметить, что стандартный `httpfs` тоже имеет небольшой *внутренний, оперативный кэш*, но его возможности ограничены.&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Параметр&lt;/td&gt;
&lt;td style="text-align: center"&gt;Встроенный кэш `httpfs`&lt;/td&gt;
&lt;td style="text-align: center"&gt;Расширение `cache_httpfs`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Тип&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Внутренний, в памяти&lt;/td&gt;
&lt;td style="text-align: center"&gt;Явный, на диске&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Жизненный цикл&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Живет &lt;b&gt;в рамках одного соединения&lt;/b&gt; (connection). При переподключении кэш пуст.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Живет &lt;b&gt;между сессиями и процессами&lt;/b&gt;. Сохраняется на диске до очистки.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Назначение&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Ускорение повторных запросов в одной и той же длительной сессии.&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Радикальное ускорение&lt;/b&gt; для любых повторных запросов, особенно в serverless (warm starts) и при локальной разработке.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Активация&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Включен по умолчанию&lt;/td&gt;
&lt;td style="text-align: center"&gt;Требует `SET httpfs_client = ‘cached_httpfs’;`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Настройка&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Не настраивается&lt;/td&gt;
&lt;td style="text-align: center"&gt;Настраивается путь (`cache_httpfs_cache_path`) и максимальный размер.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Для серьезной работы с данными на S3, особенно в serverless-архитектуре, использование расширения `cache_httpfs` является приятным дополнением и зачастую обязательным. Это та самая “серебряная пуля”, которая убирает узкое место в виде задержек сети и большого количества API-вызовов к облачному хранилищу.&lt;/p&gt;
&lt;p&gt;Начиная с тяжелых ETL-процессов на Trino и заканчивая быстрыми запросами в DuckDB, современный стек данных предлагает невероятную гибкость и производительность. Выбрав правильный инструмент или их комбинацию для каждой задачи, можно построить по-настоящему эффективную и масштабируемую аналитическую платформу.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/duck.png" width="198" height="149" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;pic. Krenskiy Dmitriy&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Экосистема инструментов для Data Science и AI: От Дашбордов до Продвинутого MLOps</title>
<guid isPermaLink="false">262</guid>
<link>https://gavrilov.info/all/ekosistema-instrumentov-dlya-data-science-i-ai-ot-dashbordov-do/</link>
<pubDate>Sun, 10 Aug 2025 23:40:36 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/ekosistema-instrumentov-dlya-data-science-i-ai-ot-dashbordov-do/</comments>
<description>
&lt;p&gt;Все это можно быстро и просто запустить тут: &lt;a href="https://www.ploomber.io"&gt;https://www.ploomber.io&lt;/a&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-08-10-v-23.32.24.png" width="550" height="564" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В современной науке о данных и разработке искусственного интеллекта недостаточно просто создать модель в Jupyter Notebook ( о нем вы уже знаете ) . Настоящая ценность раскрывается, когда результатами можно поделиться, когда модели становятся интерактивными и когда они надежно развернуты в производственной среде. Для решения этих задач появилось множество фреймворков, каждый со своими сильными сторонами и философией.&lt;/p&gt;
&lt;p&gt;В этой статье мы рассмотрим и оценим ключевые инструменты, которые позволяют дата-сайентистам и ML-инженерам создавать веб-приложения, чат-ботов, API, отчеты и управлять жизненным циклом моделей.&lt;/p&gt;
&lt;h4&gt;Категория 1: Фреймворки для создания веб-приложений и дашбордов&lt;/h4&gt;
&lt;p&gt;Это самая многочисленная группа, предназначенная для быстрого превращения данных и моделей в интерактивные пользовательские интерфейсы без необходимости глубокого изучения фронтенд-технологий.&lt;/p&gt;
&lt;h5&gt;&lt;b&gt;Streamlit&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 40.8k+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://streamlit.io/"&gt;streamlit.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/streamlit/streamlit"&gt;streamlit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; Streamlit — это, возможно, самый популярный фреймворк для быстрого создания data-приложений. Его философия — превратить скрипты в красивые веб-интерфейсы с минимальными усилиями. Приложение работает по простой модели: скрипт выполняется сверху вниз при каждом взаимодействии пользователя, что упрощает управление состоянием.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Невероятная простота и скорость разработки. Идеально подходит для создания прототипов, демо и внутренних инструментов &lt;a href="https://medium.com/@anna.bildea/choosing-the-right-ui-framework-for-genai-projects-54177640b9ca"&gt;medium.com&lt;/a&gt;. Отличная документация и большое сообщество.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Модель “перезапуска всего скрипта” может быть неэффективной для сложных приложений с большим количеством состояний. Кастомизация интерфейса за пределами стандартных компонентов может быть сложной задачей &lt;a href="https://ai.gopubby.com/top-5-python-frontend-libraries-for-data-science-91261a65e366?gi=b10c3467a931"&gt;ai.gopubby.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;b&gt;Dash&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 23.9k+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://plotly.com/dash/"&gt;plotly.com/dash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/plotly/dash"&gt;github.com/plotly/dash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; Dash от создателей Plotly — это мощный фреймворк для создания аналитических веб-приложений. Он использует Flask, Plotly.js и React.js под капотом, предоставляя Python-разработчикам доступ к современным веб-технологиям.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Высокая степень кастомизации и контроля. Идеален для корпоративных дашбордов и сложных приложений, требующих уникального дизайна и функциональности. Отличная интеграция с экосистемой Plotly.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Более высокий порог вхождения по сравнению со Streamlit. Концепция “коллбэков” требует времени для освоения.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;b&gt;Solara&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 2.1k+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://solara.dev/"&gt;solara.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/widgetti/solara"&gt;github.com/widgetti/solara&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; Solara позволяет создавать веб-приложения на чистом Python, используя компонентный подход, похожий на React. Он построен на базе Ipywidgets и может работать как в Jupyter Notebook, так и в виде самостоятельных приложений.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Компонентная архитектура способствует созданию чистого и переиспользуемого кода. Хорошо подходит для создания масштабируемых приложений корпоративного уровня &lt;a href="https://ai.gopubby.com/top-5-python-frontend-libraries-for-data-science-91261a65e366?gi=b10c3467a931"&gt;ai.gopubby.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Менее известен, чем Streamlit или Dash, что означает меньшее сообщество и меньше готовых решений.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;b&gt;Gradio&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 39.4k+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://gradio.app/"&gt;gradio.app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/gradio-app/gradio"&gt;github.com/gradio-app/gradio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; Gradio создан для невероятно быстрого создания демо для моделей машинного обучения. Всего за несколько строк кода можно обернуть любую Python-функцию (например, предсказание модели) в простой веб-интерфейс.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Максимальная простота для демонстрации моделей. Поддерживает различные типы ввода/вывода (текст, изображения, аудио). Легко встраивается в Jupyter/Colab и генерирует публичные ссылки для демонстрации.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Не предназначен для создания сложных, многостраничных дашбордов. Фокус смещен на “вход -&gt; модель -&gt; выход”. Структура приложения `app.py` часто используется для бэкенда при создании мультимодальных инструментов &lt;a href="https://ai.plainenglish.io/beyond-text-building-a-fully-multimodal-ai-tool-images-speech-rag-together-8fe4cb322c64?gi=47624379873a&amp;source=rss----78d064101951---4"&gt;ai.plainenglish.io&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;b&gt;Shiny for Python &amp; Shiny Express&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 1.6k+ (Python)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://shiny.posit.co/py/"&gt;shiny.posit.co/py&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/posit-dev/py-shiny"&gt;github.com/posit-dev/py-shiny&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; Shiny, легендарный фреймворк из мира R, теперь доступен и для Python. Он использует реактивную модель программирования, где изменения во входных данных автоматически вызывают пересчет связанных с ними выходных данных. &lt;b&gt;Shiny Express&lt;/b&gt; — это его более легковесная версия в стиле Streamlit, позволяющая создавать приложения декларативно.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Мощная реактивная модель позволяет создавать очень эффективные приложения. Отличная интеграция с инструментами от Posit (ранее RStudio).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Сообщество в Python пока меньше, чем у аналогов. Реактивная модель требует особого подхода к мышлению.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;b&gt;Panel&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 5.4k+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://panel.holoviz.org/"&gt;panel.holoviz.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/holoviz/panel"&gt;github.com/holoviz/panel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; Panel — это мощный фреймворк из экосистемы HoloViz. Его главная особенность — совместимость практически с любой библиотекой для визуализации в Python. Он позволяет объединять виджеты и графики в гибкие макеты.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Непревзойденная гибкость и совместимость с другими библиотеками. Отлично подходит, если вы уже используете инструменты HoloViz (hvPlot, HoloViews).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Может показаться более многословным и сложным для простых задач по сравнению со Streamlit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;b&gt;Другие интересные фреймворки UI&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Chainlit (10k+ звезд):&lt;/b&gt; Специализированный фреймворк для быстрого создания чат-интерфейсов для LLM-агентов и приложений на базе LangChain/LlamaIndex.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hyperdiv (900+ звезд):&lt;/b&gt; Предлагает новый подход: Python-код выполняется на сервере и мгновенно синхронизирует UI в браузере. Компоненты объявляются в простом, декларативном стиле.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Vizro (3k+ звезд):&lt;/b&gt; Конфигурационный фреймворк поверх Dash. Позволяет создавать дашборды через YAML или Pydantic-модели, что упрощает разработку.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Voilà (5.8k+ звезд):&lt;/b&gt; Превращает Jupyter-ноутбуки в самостоятельные веб-приложения, скрывая код и оставляя только виджеты и выводы ячеек.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Категория 2: Бэкенд и MLOps (Развертывание и управление)&lt;/h4&gt;
&lt;p&gt;Эти инструменты фокусируются на серверной части, производительности и управлении жизненным циклом моделей.&lt;/p&gt;
&lt;h5&gt;&lt;b&gt;FastAPI&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 88.2k+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://fastapi.tiangolo.com/"&gt;fastapi.tiangolo.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/tiangolo/fastapi"&gt;github.com/tiangolo/fastapi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; FastAPI — это современный, высокопроизводительный веб-фреймворк для создания API на Python. Он стал де-факто стандартом для развертывания моделей машинного обучения в виде REST API благодаря своей скорости, автоматической документации и использованию стандартных аннотаций типов Python.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Невероятная производительность. Автоматическая интерактивная документация (Swagger UI, ReDoc). Простота использования благодаря Pydantic и аннотациям типов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Это бэкенд-фреймворк. Для создания UI его нужно использовать в связке с фронтенд-технологиями.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;b&gt;vLLM&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 54.8k+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://vllm.ai"&gt;vllm.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/vllm-project/vllm"&gt;github.com/vllm-project/vllm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; vLLM — это не UI-фреймворк, а высокопроизводительная библиотека для инференса (выполнения) больших языковых моделей (LLM). Ее главная цель — максимально увеличить пропускную способность при обслуживании LLM.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Значительно ускоряет работу LLM благодаря инновационным техникам, таким как PagedAttention. Совместимость с моделями Hugging Face. Становится стандартом для быстрого self-hosting LLM.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Узкоспециализированный инструмент для инференса LLM.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;b&gt;MLflow&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 21.5k+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://mlflow.org/"&gt;mlflow.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/mlflow/mlflow"&gt;github.com/mlflow/mlflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; MLflow — это платформа с открытым исходным кодом для управления полным жизненным циклом машинного обучения. Он включает в себя компоненты для отслеживания экспериментов (Tracking), упаковки кода (Projects), управления моделями (Models) и их развертывания (Registry).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Комплексное решение для MLOps. Помогает стандартизировать и воспроизводить ML-эксперименты. Интегрируется с большинством ML-библиотек.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Требует настройки и внедрения в рабочий процесс. Может быть избыточным для небольших проектов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Категория 3: Интерактивные вычисления и отчетность&lt;/h4&gt;
&lt;p&gt;Эти инструменты меняют представление о статических отчетах и ноутбуках, делая их интерактивными и воспроизводимыми.&lt;/p&gt;
&lt;h5&gt;&lt;b&gt;Quarto&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 4.7k+ (CLI)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://quarto.org/"&gt;quarto.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/quarto-dev/quarto-cli"&gt;github.com/quarto-dev/quarto-cli&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; Quarto — это система публикации научных и технических документов нового поколения от Posit. Она позволяет создавать динамические документы и презентации из Jupyter-ноутбуков или простого Markdown, смешанного с кодом на Python, R или Julia.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Поддерживает множество форматов вывода (HTML, PDF, DOCX, презентации и др.). Языковая агностичность. Позволяет создавать красивые, профессиональные и воспроизводимые отчеты.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; В первую очередь это инструмент для публикации, а не для создания интерактивных real-time приложений.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;b&gt;Marimo&lt;/b&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;GitHub Stars:&lt;/b&gt; 15.3k+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Официальный сайт:&lt;/b&gt; &lt;a href="https://marimo.io/"&gt;marimo.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub Repo:&lt;/b&gt; &lt;a href="https://github.com/marimo-team/marimo"&gt;github.com/marimo-team/marimo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Описание и назначение:&lt;/b&gt; Marimo — это реактивная среда для Python, которая решает многие проблемы традиционных Jupyter-ноутбуков. В Marimo ноутбук — это интерактивное веб-приложение. Изменение в одной ячейке автоматически обновляет все зависимые ячейки.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Особенности и оценка:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сильные стороны:&lt;/b&gt; Реактивность обеспечивает консистентность состояния. Встроенные UI-элементы. Ноутбуки легко экспортируются в виде приложений.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабые стороны:&lt;/b&gt; Новый инструмент с растущим, но пока небольшим сообществом. Отличается от привычного рабочего процесса в Jupyter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Как выбрать подходящий инструмент?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Для быстрого прототипа или демо модели:&lt;/b&gt; &lt;b&gt;Streamlit&lt;/b&gt; или &lt;b&gt;Gradio&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Для сложного, кастомизированного корпоративного дашборда:&lt;/b&gt; &lt;b&gt;Dash&lt;/b&gt; или &lt;b&gt;Solara&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Для создания бэкенда и API для вашей модели:&lt;/b&gt; &lt;b&gt;FastAPI&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Для максимальной производительности при развертывании LLM:&lt;/b&gt; &lt;b&gt;vLLM&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Для построения полноценного MLOps-цикла:&lt;/b&gt; &lt;b&gt;MLflow&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Для создания чат-бота на базе LLM:&lt;/b&gt; &lt;b&gt;Chainlit&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Для создания красивых, воспроизводимых отчетов и статей:&lt;/b&gt; &lt;b&gt;Quarto&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Если вы хотите попробовать реактивный, state-of-the-art ноутбук:&lt;/b&gt; &lt;b&gt;Marimo&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Если вы из мира R или вам нравится реактивная парадигма:&lt;/b&gt; &lt;b&gt;Shiny for Python&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
</item>

<item>
<title>Самые популярные инструменты бизнес-аналитики на основе кода: Обзор</title>
<guid isPermaLink="false">241</guid>
<link>https://gavrilov.info/all/samye-populyarnye-instrumenty-biznes-analitiki-na-osnove-koda-ob/</link>
<pubDate>Fri, 30 May 2025 22:48:31 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/samye-populyarnye-instrumenty-biznes-analitiki-na-osnove-koda-ob/</comments>
<description>
&lt;p&gt;Сравнение самых популярных BI-as-code инструментов: Evidence, Streamlit, Dash, Observable, Shiny и Quarto&lt;br /&gt;
Кейси Хуанси Ли – Приглашенный Автор 30 октября 2024 г. · 4 мин чтения&lt;br /&gt;
Кейси – специалист по данным, инженер-программист и писатель. Ранее она работала в McKinsey &amp; QuantumBlack, а в настоящее время работает в Shopify.&lt;/p&gt;
&lt;p&gt;Оригинал тут: &lt;a href="https://evidence.dev/blog/business-intelligence-tools"&gt;https://evidence.dev/blog/business-intelligence-tools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;а можно не читать, а идти сразу сюда: &lt;a href="https://gavrilov.info/all/tetradki-nashe-vsyo-marimo-io-i-utochkadb/"&gt;https://gavrilov.info/all/tetradki-nashe-vsyo-marimo-io-i-utochkadb/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Не существует единственного «лучшего» инструмента бизнес-аналитики (BI); лучший инструмент для вас зависит от ваших конкретных потребностей, рабочего процесса и набора навыков.&lt;/p&gt;
&lt;p&gt;Это руководство сравнивает некоторые из самых популярных инструментов BI-as-code, чтобы помочь вам найти то, что наилучшим образом подходит для вашего стека анализа данных и технических компетенций:&lt;/p&gt;
&lt;p&gt;* &lt;b&gt;Evidence:&lt;/b&gt; Конструктор приложений на Markdown и SQL для аналитиков данных.&lt;br /&gt;
* &lt;b&gt;Streamlit:&lt;/b&gt; Оболочка для веб-приложений для Python-специалистов по данным.&lt;br /&gt;
* &lt;b&gt;Dash:&lt;/b&gt; Фреймворк для веб-приложений для Python-разработчиков.&lt;br /&gt;
* &lt;b&gt;Observable:&lt;/b&gt; Набор инструментов для визуализации данных для JavaScript-разработчиков.&lt;br /&gt;
* &lt;b&gt;Shiny:&lt;/b&gt; Простая R/Python-оболочка для статистиков и исследователей.&lt;br /&gt;
* &lt;b&gt;Quarto:&lt;/b&gt; Минималистичная система публикации Jupyter/Markdown для ученых и технических писателей.&lt;/p&gt;
&lt;p&gt;Каждый из этих инструментов является открытым исходным кодом, и вы можете найти исходный код на GitHub.&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td&gt;Инструмент&lt;/td&gt;
&lt;td&gt;Репозиторий GitHub&lt;/td&gt;
&lt;td&gt;Лицензия&lt;/td&gt;
&lt;td&gt;Языки&lt;/td&gt;
&lt;td&gt;Звезды&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence&lt;/td&gt;
&lt;td&gt;evidence-dev/evidence&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;SQL/Markdown&lt;/td&gt;
&lt;td&gt;4.3k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Streamlit&lt;/td&gt;
&lt;td&gt;streamlit/streamlit&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;35k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dash&lt;/td&gt;
&lt;td&gt;plotly/dash&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;21k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observable&lt;/td&gt;
&lt;td&gt;observablehq/framework&lt;/td&gt;
&lt;td&gt;ISC&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;2.5k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shiny&lt;/td&gt;
&lt;td&gt;rstudio/shiny&lt;/td&gt;
&lt;td&gt;GPL-3.0&lt;/td&gt;
&lt;td&gt;R/Python&lt;/td&gt;
&lt;td&gt;5.4k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarto&lt;/td&gt;
&lt;td&gt;quarto-dev/quarto-cli&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Markdown/Jupyter&lt;/td&gt;
&lt;td&gt;3.9k&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;Evidence&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-179.png" width="1300" height="700" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Инструмент для создания приложений на SQL и Markdown&lt;/p&gt;
&lt;p&gt;Evidence выделяется своим управлением входными данными через SQL-запросы и созданием содержимого страниц с помощью Markdown и предварительно созданных компонентов.&lt;/p&gt;
&lt;p&gt;Входные данные в Evidence управляются с помощью SQL-запросов. Содержимое страницы создается с помощью Markdown и предварительно созданных компонентов Evidence для общих визуализаций, таких как таблицы или столбчатые диаграммы.&lt;/p&gt;
&lt;p&gt;Evidence разработан для аналитиков, знакомых с SQL и Markdown, предлагая расширяемость через веб-стандарты. Приложения Evidence отлаженные, производительные и легко воспринимаются бизнес-стейкхолдерами.&lt;/p&gt;
&lt;p&gt;Evidence также предлагает неограниченные возможности для определения ваших собственных пользовательских компонентов с использованием HTML и JavaScript, а также стилизации страниц через CSS. Он также поддерживает постоянно растущий список вариантов развертывания, включая Evidence Cloud — безопасный, управляемый хостинг-сервис.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример кода:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Sales Report

&amp;lt;Slider min=2019 max=2024 name=year_pick title=Year size=full/&amp;gt;

```sql sales_by_month
SELECT
    order_month,
    category,
    sum(sales) AS sales
FROM orders
WHERE year = '${inputs.year_pick}'
GROUP BY ALL
```

&amp;lt;BarChart
  data={sales_by_month}
  title=&amp;quot;Sales by Month&amp;quot;
  x=order_month
  y=sales
/&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-180.png" width="1036" height="870" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Хороший выбор, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы в основном работаете с SQL и хотите получать удобные для бизнеса результаты.&lt;/li&gt;
&lt;li&gt;Вы не являетесь в первую очередь JavaScript-разработчиком.&lt;/li&gt;
&lt;li&gt;Вы хотите иметь возможность добавлять пользовательские компоненты, если ваши потребности выходят за рамки готовой функциональности.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Не рекомендуется, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы не хотите использовать SQL-запросы для управления входными данными.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Streamlit&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-181.png" width="1300" height="700" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Веб-приложение-обертка для pandas, numpy и других основных инструментов Python для анализа данных&lt;/p&gt;
&lt;p&gt;Если вы уже знакомы с такими вещами, как numpy или pandas, документация Streamlit заставит вас почувствовать себя как дома. Оборачивая, например, `np.histogram` во что-то вроде `st.bar_chart`, Streamlit берет на себя перевод вашего Python-кода в веб-приложение.&lt;/p&gt;
&lt;p&gt;Streamlit запускает ваш Python-скрипт сверху вниз, передавая выходные данные, такие как текст, таблицы или диаграммы, на страницу. Этот инструмент также можно использовать для создания чат-бота в стиле ChatGPT с использованием выходных данных на основе Python.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример кода:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import streamlit as st
import pandas as pd
import numpy as np

st.title('Uber pickups in NYC')

DATE_COLUMN = 'date/time'
DATA_URL = ('https://s3-us-west-2.amazonaws.com/'
         'streamlit-demo-data/uber-raw-data-sep14.csv.gz')

@st.cache_data
def load_data(nrows):
    data = pd.read_csv(DATA_URL, nrows=nrows)
    lowercase = lambda x: str(x).lower()
    data.rename(lowercase, axis='columns', inplace=True)
    data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN])
    return data

# Create a text element and let the reader know the data is loading.
data_load_state = st.text('Loading data...')
# Load 10,000 rows of data into the dataframe.
data = load_data(10000)
# Notify the reader that the data was successfully loaded.
data_load_state.text(&amp;quot;Done! (using st.cache_data)&amp;quot;)

st.subheader('Raw data')
st.write(data)

st.subheader('Number of pickups by hour')

hist_values = np.histogram(
    data[DATE_COLUMN].dt.hour, bins=24, range=(0,24))[0]

st.bar_chart(hist_values)

hour_to_filter = st.slider('hour', 0, 23, 17)  # min: 0h, max: 23h, default: 17h
filtered_data = data[data[DATE_COLUMN].dt.hour == hour_to_filter]
st.subheader(f'Map of all pickups at {hour_to_filter}:00')
st.map(filtered_data)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-182.png" width="884" height="1480" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Хороший выбор, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы являетесь Python-специалистом по данным, который хочет быстро создать веб-приложение, которым можно поделиться.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Не рекомендуется, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вам нужно настроить UI/UX, выходя за рамки базовых цветовых тем.&lt;/li&gt;
&lt;li&gt;Вам нужен точный контроль над повторной отрисовкой страницы (весь скрипт перезапускается при изменении входных данных, если вы не управляете фрагментами вручную).&lt;/li&gt;
&lt;li&gt;Вам не нравится писать Python-скрипты.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Dash&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-183.png" width="1300" height="700" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Фреймворк для веб-приложений на Python, предоставляющий прямой контроль над макетами, элементами DOM и обратными вызовами.&lt;/p&gt;
&lt;p&gt;Dash позволяет Python-разработчикам создавать интерактивные веб-приложения без необходимости изучать JavaScript. Он предлагает существенный контроль и настройку для тех, кто готов углубиться в документацию. Ядро Dash — это класс Python, который объединяет несколько концепций:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python-обертки для отображения общих элементов DOM и визуализаций plotly (например, `html.H1`, `dcc.Graph`);&lt;/li&gt;
&lt;li&gt;Макет приложения, определенный как список вышеуказанных элементов в `app.layout`;&lt;/li&gt;
&lt;li&gt;Загрузка и обработка данных с помощью обычных средств анализа данных, таких как numpy или pandas;&lt;/li&gt;
&lt;li&gt;Интерактивность посредством обратных вызовов, которые принимают именованные входные данные из приложения (например, значение из выпадающего списка) и возвращают именованные выходные данные (например, отфильтрованный DataFrame);&lt;/li&gt;
&lt;li&gt;Возможность добавлять собственный CSS и JavaScript при необходимости.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dash построен на базе Flask, поэтому любой Python-разработчик, имеющий опыт работы с веб-фреймворками, должен чувствовать себя в нем комфортно. Хотя R, Julia и F# также указаны как совместимые языки, подавляющее большинство документации Dash написано для Python.&lt;/p&gt;
&lt;p&gt;Dash — мощный выбор для опытных программистов на Python, которым нужен точный контроль. Однако, если вам неудобны ментальные модели, такие как классы, обратные вызовы или DOM, кривая обучения в Dash может показаться несколько крутой.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример кода:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;from dash import Dash, html, dcc, callback, Output, Input
import plotly.express as px
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminder_unfiltered.csv')

app = Dash()

app.layout = [
    html.H1(children='Title of Dash App', style={'textAlign':'center'}),
    dcc.Dropdown(df.country.unique(), 'Canada', id='dropdown-selection'),
    dcc.Graph(id='graph-content')
]

@callback(
    Output('graph-content', 'figure'),
    Input('dropdown-selection', 'value')
)
def update_graph(value):
    dff = df[df.country==value]
    return px.line(dff, x='year', y='pop')

if __name__ == '__main__':
    app.run(debug=True)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-184.png" width="1514" height="1296" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Хороший выбор, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;У вас сильные навыки Python, и вы хотите более прямого контроля над макетом, стилизацией и интерактивностью, чем в Streamlit.&lt;/li&gt;
&lt;li&gt;Вы уже хорошо работаете с веб-фреймворками на базе Python, такими как Flask или Django.&lt;/li&gt;
&lt;li&gt;Вы знакомы с библиотеками для анализа данных на базе Python, такими как pandas, numpy и plotly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Не рекомендуется, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вам неудобно работать с классами, обратными вызовами, методами или декораторами Python.&lt;/li&gt;
&lt;li&gt;Вам неудобно напрямую взаимодействовать с DOM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Observable Framework&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-185.png" width="1300" height="700" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Инструментарий для визуализации данных для веб-разработчиков на JavaScript.&lt;/p&gt;
&lt;p&gt;Если `npm run dev` — это ваша скорость, Observable Framework — отличный выбор для использования всей мощи веб-разработки при визуализации данных. Предоставляя вам импортируемые вспомогательные элементы, такие как Plot и FileAttachment, Observable упрощает интеграцию входных данных и предварительно созданных компонентов визуализации в ваше веб-приложение. У вас по-прежнему есть все обычные инструменты веб-разработки: HTML, JSX, компоненты React, стили CSS, функции JavaScript и импорты и т.д.&lt;/p&gt;
&lt;p&gt;Хотя загрузчики данных для Observable могут быть написаны на любом языке программирования, базовый уровень комфорта с концепциями веб-разработки (например, HTML, CSS и JavaScript) позволит вам наилучшим образом использовать многие функции Observable.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример кода:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import * as Plot from 'npm:@observablehq/plot';

export function temperaturePlot(data, { width } = {}) {
return Plot.plot({
title: 'Hourly temperature forecast',
width,
x: { type: 'utc', ticks: 'day', label: null },
y: { grid: true, inset: 10, label: 'Degrees (F)' },
marks: [
Plot.lineY(data.properties.periods, {
x: 'startTime',
y: 'temperature',
z: null, // varying color, not series
stroke: 'temperature',
curve: 'step-after'
})
]
});
}
# Weather report

import { temperaturePlot } from './components/temperaturePlot.js';&lt;/code&gt;&lt;/pre&gt;&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;const forecast = FileAttachment('./data/forecast.json').json();&lt;/code&gt;&lt;/pre&gt;&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;display(temperaturePlot(forecast));&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-186.png" width="1908" height="1492" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Хороший выбор, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы веб-разработчик, который разбирается в HTML, CSS и JavaScript и хочет в полной мере использовать свои обычные инструменты (например, Node, React).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Не рекомендуется, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы не уверены, что такое node и npm, или что означает async/await.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Shiny&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-187.png" width="1300" height="700" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Авторитетная оболочка для R и Python, с акцентом на эффективную реактивность.&lt;/p&gt;
&lt;p&gt;Если R или Python — ваш основной язык для анализа данных, и вы не заинтересованы в полноценной веб-разработке или ручном управлении обратными вызовами, то, возможно, стоит потрудиться, чтобы изучить ментальные модели Shiny. Из всех инструментов, рассмотренных в этой статье, он, вероятно, наиболее авторитетен в плане создания новых, специфичных для Shiny концепций, которые должен освоить пользователь. Например, все пользовательские входы (т.е. выпадающие списки) определяются с помощью функций `ui.input_*()`, а все выходы создаются декораторами, такими как `@render.plot`. Даже для опытного Python-разработчика понимание всех этих концепций может занять время. Код для сложной панели инструментов Shiny может стать довольно громоздким.&lt;/p&gt;
&lt;p&gt;Преимущество всего этого заключается в том, что Shiny автоматически эффективно управляет реактивностью за вас. Их документация даже приводит пример воспроизведения панели инструментов Streamlit для более быстрой работы.&lt;/p&gt;
&lt;p&gt;HTML, CSS и JavaScript могут управляться вручную, но необходимость их размещения внутри Python-оберток может привести к тому, что код будет выглядеть немного громоздко.&lt;/p&gt;
&lt;p&gt;Если вы довольны использованием чистых, минималистичных, предварительно стилизованных компонентов Shiny и цените эффективную реактивность, Shiny может быть хорошим выбором.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример кода:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;from shiny.express import input, render, ui
from shinywidgets import render_plotly

ui.page_opts(title=&amp;quot;Penguins dashboard&amp;quot;, fillable=True)

with ui.sidebar():
    ui.input_selectize(
        &amp;quot;var&amp;quot;, &amp;quot;Select variable&amp;quot;,
        [&amp;quot;bill_length_mm&amp;quot;, &amp;quot;bill_depth_mm&amp;quot;, &amp;quot;flipper_length_mm&amp;quot;, &amp;quot;body_mass_g&amp;quot;, &amp;quot;year&amp;quot;]
    )
    ui.input_numeric(&amp;quot;bins&amp;quot;, &amp;quot;Number of bins&amp;quot;, 30)

with ui.card(full_screen=True):
    @render_plotly
    def hist():
        import plotly.express as px
        from palmerpenguins import load_penguins
        return px.histogram(load_penguins(), x=input.var(), nbins=input.bins())&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-188.png" width="1140" height="1006" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Хороший выбор, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;У вас сильные навыки R или Python, и вы хотите использовать только эти языки.&lt;/li&gt;
&lt;li&gt;Вы цените быструю, эффективную реактивность и не хотите вручную управлять обратными вызовами.&lt;/li&gt;
&lt;li&gt;Вам нравится использовать чистые, минималистичные, предварительно стилизованные компоненты.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Не рекомендуется, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы не хотите изучать специфические для Shiny ментальные модели для управления UI и реактивностью.&lt;/li&gt;
&lt;li&gt;Вы предпочитаете напрямую контролировать UI с помощью более традиционного стека веб-разработки (например, HTML / CSS / JS).&lt;/li&gt;
&lt;li&gt;Вам требуется очень тонкий контроль над внешним видом и ощущениями.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Quarto&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-189.png" width="1300" height="700" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Минималистичный рендерер страниц на Jupyter / Markdown, предназначенный для научной и технической публикации.&lt;/p&gt;
&lt;p&gt;Если ваша цель — как можно быстрее и без излишеств преобразовать результаты анализа данных в HTML-файлы, .doc или PDF, Quarto может быть хорошим выбором. Quarto берет заметки Jupyter или Markdown в стиле Quarto и преобразует их в широкий спектр форматов. Доступны темы, а также некоторые параметры интерактивности. Фактически, если вы готовы потрудиться и изучить ее, Quarto предоставляет документацию для большинства задач, которые вы можете захотеть выполнить. В целом, однако, Quarto — хороший выбор для тех, кто уже знаком с заметками Jupyter и хочет быстро представить свою работу в общем формате без чрезмерной настройки или суеты.&lt;/p&gt;
&lt;p&gt;Если вы привыкли публиковать свои работы в LaTeX, Quarto также может показаться более современной, гибкой альтернативой, которая по-прежнему предлагает чистый, простой, академический вид документа LaTeX.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример кода:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;---
title: 'Quarto Basics'
format:
  html:
    code-fold: true
jupyter: python3
---&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For a demonstration of a line plot on a polar axis, see @fig-polar.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;#| label: fig-polar
#| fig-cap: &amp;quot;A line plot on a polar axis&amp;quot;

import numpy as np
import matplotlib.pyplot as plt

r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r
fig, ax = plt.subplots(
  subplot_kw = {'projection': 'polar'}
)
ax.plot(theta, r)
ax.set_rticks([0.5, 1, 1.5, 2])
ax.grid(True)
plt.show()&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-190.png" width="1654" height="1534" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Хороший выбор, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы уже знакомы с заметками Jupyter или Markdown и хотите быстро представить свою работу в общем формате с минимальной стилизацией.&lt;/li&gt;
&lt;li&gt;Вы не против изучать документацию для выполнения более сложных задач (например, пользовательские темы или развертывание в определенном сервисе, таком как Netlify).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Не рекомендуется, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вам требуется полноценная функциональность веб-разработки.&lt;/li&gt;
&lt;li&gt;Вам нужен обширный контроль над внешним видом и ощущениями, или интерактивностью.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;Заключение&lt;/h4&gt;
&lt;p&gt;При выборе инструмента BI-as-code учитывайте технические навыки вашей команды и конкретные потребности:&lt;/p&gt;
&lt;p&gt;* &lt;b&gt;Evidence&lt;/b&gt; идеально подходит для аналитиков, которые в основном работают с SQL и хотят быстро создавать приложения для данных с использованием Markdown.&lt;br /&gt;
* &lt;b&gt;Streamlit&lt;/b&gt; хорошо подходит для Python-специалистов по данным, стремящихся к быстрому прототипированию.&lt;br /&gt;
* &lt;b&gt;Dash&lt;/b&gt; предлагает больше контроля для Python-разработчиков, знакомых с веб-фреймворками.&lt;br /&gt;
* &lt;b&gt;Observable&lt;/b&gt; предоставляет полные возможности веб-разработки для JavaScript-разработчиков.&lt;br /&gt;
* &lt;b&gt;Shiny&lt;/b&gt; подходит для пользователей R/Python, которым нужно эффективное управление реактивностью.&lt;br /&gt;
* &lt;b&gt;Quarto&lt;/b&gt; идеально подходит для ученых и технических писателей, сосредоточенных на публикации документов.&lt;/p&gt;
&lt;p&gt;Если вы хотите попробовать Evidence сами, вы можете начать бесплатно.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/telegram-cloud-photo-size-2-5318760570654164028-y.jpg" width="1280" height="629" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Evidence можно хостить на huggingface.co, но вот чем лучше в своей закрытой корпоративной среде пока не ясно. думаемс. 🤔&lt;/p&gt;
&lt;p&gt;Кстати, вот такая штука еще интересная, но это тема другой статьи &lt;a href="https://tabler.io/admin-template"&gt;https://tabler.io/admin-template&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Эволюция бизнес-аналитики: от монолитной к компонуемой архитектуре</title>
<guid isPermaLink="false">193</guid>
<link>https://gavrilov.info/all/evolyuciya-biznes-analitiki-ot-monolitnoy-k-komponuemoy-arhitekt/</link>
<pubDate>Thu, 13 Feb 2025 01:23:28 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/evolyuciya-biznes-analitiki-ot-monolitnoy-k-komponuemoy-arhitekt/</comments>
<description>
&lt;p&gt;Перевод: &lt;a href="https://www.pracdata.io/p/the-evolution-of-business-intelligence-stack"&gt;https://www.pracdata.io/p/the-evolution-of-business-intelligence-stack&lt;/a&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-132.png" width="1336" height="944" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;По мере того, как мы вступаем в 2025 год, область инженерии данных продолжает свою стремительную эволюцию. В этой серии мы рассмотрим преобразующие тенденции, меняющие ландшафт инженерии данных, от новых архитектурных шаблонов до новых подходов к инструментарию.&lt;/p&gt;
&lt;p&gt;Это первая часть нашей серии, посвященная эволюции архитектуры бизнес-аналитики (BI).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Введение&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Ландшафт бизнес-аналитики (BI) претерпел значительные преобразования в последние годы, особенно в том, как данные представляются и обрабатываются.&lt;/p&gt;
&lt;p&gt;Эта эволюция отражает более широкий переход от монолитных архитектур к более гибким, компонуемым решениям, которые лучше отвечают современным аналитическим потребностям.&lt;/p&gt;
&lt;p&gt;В этой статье прослеживается эволюция BI-архитектуры через несколько ключевых этапов: от традиционных монолитных систем, через появление безголовой (headless) и бездонной (bottomless**) BI, до последних разработок в области BI-as-Code и встроенной аналитики.&lt;/p&gt;
&lt;p&gt;** 😂 👯‍♀️&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/evolyuciya-biznes-analitiki-ot-monolitnoy-k-komponuemoy-arhitekt.png" width="2156" height="222" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Если серьезно, то наверное лучший вариант бескрайний&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Традиционная BI-архитектура: Монолитный подход&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Традиционные BI-инструменты были построены как комплексные, тесно связанные системы со значительным акцентом на дизайне пользовательского интерфейса.&lt;/p&gt;
&lt;p&gt;Эти системы обеспечивали обширную гибкость благодаря функциональности “кликай и смотри” для нарезки, разделения и группировки данных с использованием различных визуализаций. В своей основе эти системы состояли из трех взаимосвязанных компонентов, которые работали в гармонии для предоставления бизнес-аналитики.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-133.png" width="473" height="487" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;*Традиционный BI-стек*&lt;/p&gt;
&lt;p&gt;Серверный уровень служил основой, обрабатывая прием данных из источников OLAP и создавая оптимизированные кубы данных на сервере. Эти кубы содержали предварительно вычисленные измерения, которые позволяли исследовать данные в режиме реального времени.&lt;/p&gt;
&lt;p&gt;Работая совместно с серверной частью, клиентский уровень предоставлял интерфейс визуализации, подключаясь к серверной части для доступа к кубам данных и построения панелей мониторинга.&lt;/p&gt;
&lt;p&gt;Семантический уровень завершал архитектуру, определяя ключевые показатели эффективности (KPI) и метрики, встроенные в BI-программное обеспечение.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Недостатки традиционных BI-инструментов&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Хотя эти традиционные системы были мощными, они имели значительные накладные расходы.&lt;/p&gt;
&lt;p&gt;Организациям требовалась существенная инфраструктура для локального развертывания до того, как управляемые облачные BI-сервисы стали более доступными, а стоимость лицензирования часто была непомерно высокой.&lt;/p&gt;
&lt;p&gt;Сроки реализации были длительными, даже демонстрации концепции требовали недель настройки и конфигурации. Для предприятий, обслуживающих большую пользовательскую базу, требования к ресурсам были особенно высокими.&lt;/p&gt;
&lt;p&gt;Эти фундаментальные ограничения в сочетании с растущей потребностью в гибкости и экономичности вызвали серию архитектурных инноваций в области BI.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Появление бездонных (Bottomless) BI-инструментов&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;В ответ на эти вызовы появилось новое поколение легких, дезагрегированных BI-инструментов. Заметные решения с открытым исходным кодом, такие как Apache Superset, Metabase и Redash, начали появляться около десяти лет назад, причем Superset, первоначально разработанный в Airbnb, приобрел особую известность в экосистеме.&lt;/p&gt;
&lt;p&gt;Эти новые инструменты приняли “безднную” архитектуру, устранив тяжелый серверный уровень, традиционно используемый для вычислений, построения и кеширования объектов куба.&lt;/p&gt;
&lt;p&gt;Вместо того чтобы поддерживать свой собственный вычислительный уровень, они полагаются на подключенные исходные движки для запроса и предоставления данных на панели мониторинга во время выполнения. Этот архитектурный сдвиг вводит различные стратегии для обслуживания данных.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-134.png" width="1456" height="1147" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Работа с задержкой запросов&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Отсутствие сервера отчетов представляет собой серьезную проблему для бездонных BI-инструментов: управление задержкой запросов при доступе к данным в режиме реального времени.&lt;/p&gt;
&lt;p&gt;Чтобы решить эту проблему, эти инструменты используют несколько стратегий оптимизации. Один из ключевых подходов включает использование предварительно вычисленных агрегатов, хранящихся в основном хранилище данных, что позволяет панелям мониторинга эффективно предоставлять результаты.&lt;/p&gt;
&lt;p&gt;Кроме того, такие инструменты, как Superset, реализуют уровни кеширования с использованием Redis для хранения часто используемых наборов данных. Этот механизм кеширования оказывается особенно эффективным: после того, как первоначальный запрос загружает набор данных, последующие визуализации и перезагрузки панели мониторинга могут обращаться к кешированной версии до тех пор, пока не изменятся базовые данные, что значительно сокращает время отклика.&lt;/p&gt;
&lt;p&gt;Для компаний, работающих с большими объемами данных, интеграция со специализированными OLAP-движками реального времени, такими как Druid и ClickHouse, обеспечивает аналитические возможности с низкой задержкой.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-135.png" width="1339" height="1173" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Появление универсального семантического слоя&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;По мере того, как отрасль стремилась к большей гибкости в своем BI-стеке, переносимый семантический слой, или то, что известно как безголовая (headless) BI, появился в качестве промежуточного шага между традиционными монолитными системами и полностью легкими решениями.&lt;/p&gt;
&lt;p&gt;Платформы безголовой BI предоставляют выделенный семантический слой, а некоторые объединяют движок запросов, позволяя организациям использовать любой инструмент визуализации по своему выбору. Этот подход полностью отделяет уровень представления (фронтенд) от семантического слоя.&lt;/p&gt;
&lt;p&gt;С помощью таких инструментов, как Cube и MetricFlow (теперь часть dbt Labs), например, организации могут определять свои метрики и модели данных в центральном месте, а затем подключать различные инструменты визуализации, пользовательские приложения или легкие BI-решения к этому семантическому слою.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-136.png" width="542" height="755" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Этот архитектурный шаблон предлагает несколько преимуществ по сравнению с традиционными BI-системами. Он позволяет организациям поддерживать согласованные определения метрик в различных инструментах визуализации, поддерживает несколько интерфейсных приложений одновременно и обеспечивает лучшие возможности интеграции с современными стеками данных.&lt;/p&gt;
&lt;p&gt;Семантический слой действует как универсальный переводчик между источниками данных и уровнями визуализации, обеспечивая согласованную бизнес-логику во всех аналитических приложениях.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Движение BI-as-Code&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;В последние годы наблюдается появление BI-as-Code, представляющего собой еще более легкий подход к разработке панелей мониторинга и интерактивных приложений для работы с данными.&lt;/p&gt;
&lt;p&gt;Этот сдвиг парадигмы привносит рабочие процессы разработки программного обеспечения в разработку BI, позволяя использовать контроль версий, тестирование и методы непрерывной интеграции. Поскольку код служит основной абстракцией, а не пользовательским интерфейсом, разработчики могут реализовывать правильные рабочие процессы разработки перед развертыванием в производственной среде.&lt;/p&gt;
&lt;p&gt;Известные инструменты в этой области, такие как Streamlit, легко интегрируются с экосистемой Python, позволяя разработчикам оставаться в рамках своих проектов Python без необходимости установки внешнего программного обеспечения для создания панелей мониторинга и приложений для работы с данными.&lt;/p&gt;
&lt;p&gt;Этот подход делает упор на простоту и скорость, используя SQL и декларативные инструменты, такие как YAML, для создания панелей мониторинга. Полученные веб-приложения можно легко разместить самостоятельно, обеспечивая гибкость развертывания.&lt;/p&gt;
&lt;p&gt;Хотя Streamlit лидирует по популярности, в последние годы появились новые решения с открытым исходным кодом, такие как Evidence, Rill, Vizro и Quary, каждое из которых привносит свой собственный подход к концепции BI-as-Code.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-137.png" width="688" height="745" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Ограничения BI-as-Code&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Инструменты BI-as-Code в настоящее время имеют ограничения с точки зрения интерактивных функций исследования данных и предоставления BI-возможностей корпоративного уровня.&lt;/p&gt;
&lt;p&gt;Они не обеспечивают тот же пользовательский опыт для нарезки и разделения данных, что и традиционные BI-инструменты, и им не хватает поддержки управления данными и семантического слоя, которые есть как в традиционных, так и в легких BI-решениях.&lt;/p&gt;
&lt;p&gt;Тем не менее, BI-as-Code все чаще используется различными способами, например, командами специалистов по обработке данных, создающими интерактивные автономные приложения, командами разработчиков продуктов, создающими встроенные функции аналитики, и аналитиками, разрабатывающими внутренние приложения для работы с данными.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая развивающаяся тенденция: BI + Встроенная аналитика&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Последняя эволюция в BI-архитектуре включает интеграцию высокопроизводительных встраиваемых OLAP-движков запросов, таких как Apache DataFusion и DuckDB.&lt;/p&gt;
&lt;p&gt;Этот подход устраняет несколько пробелов в текущем ландшафте, сохраняя при этом преимущества легких, дезагрегированных архитектур.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-138.png" width="1209" height="1094" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Новая полнофункциональная компонуемая BI-архитектура дает несколько ключевых преимуществ:&lt;/p&gt;
&lt;p&gt;Во-первых, она предлагает настоящую компонуемость и совместимость с возможностью замены встроенных вычислительных движков по мере необходимости, сохраняя при этом автономный семантический слой для определения метрик.&lt;/p&gt;
&lt;p&gt;Возможности встроенной аналитики особенно мощны благодаря интеграции без копирования через стандартные фреймворки, в основном Apache Arrow, обеспечивающей доступ к данным на уровне микросекунд через оптимизированные столбчатые форматы в памяти.&lt;/p&gt;
&lt;p&gt;Интеграция без копирования относится к методу оптимизации производительности, при котором доступ к данным и их обработка могут осуществляться без необходимости сериализации и преобразования данных между различными представлениями в памяти. В контексте DataFusion и Apache Arrow это означает, что когда данные загружаются в память в столбчатом формате Arrow, DataFusion может напрямую выполнять вычисления с этими данными без необходимости их преобразования или копирования во внутренний формат.&lt;/p&gt;
&lt;p&gt;Прямая поддержка озер данных и lakehouse представляет собой еще один значительный шаг вперед, позволяя командам создавать панели мониторинга непосредственно поверх открытых табличных форматов, таких как Apache Iceberg и Apache Hudi, без промежуточного перемещения данных.&lt;/p&gt;
&lt;p&gt;Эта возможность в сочетании с комплексной поддержкой федеративных запросов решает давнюю проблему в существующих легких BI-инструментах, которые с трудом эффективно объединяли данные из нескольких источников без необходимости использования внешнего движка федеративных запросов.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Внедрение в отрасли&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Внедрение встраиваемых движков запросов в отрасли набирает обороты в экосистеме BI.  Коммерческие поставщики возглавляют эту трансформацию: Omni интегрировала DuckDB в качестве своего основного аналитического движка, в то время как Cube.dev реализовала сложное сочетание Apache Arrow и DataFusion в своей безголовой BI-архитектуре.&lt;/p&gt;
&lt;p&gt;Аналогичным образом, GoodData приняла эту тенденцию, реализовав Apache Arrow в качестве основы уровня кеширования своей системы FlexQuery, а Preset (Managed Superset) интегрировалась с MotherDuck (Managed DuckDB).&lt;/p&gt;
&lt;p&gt;В области открытого исходного кода и Superset (с использованием библиотеки duckdb-engine), и Metabase теперь поддерживают встроенное подключение DuckDB с потенциальной будущей интеграцией в их основные движки.&lt;/p&gt;
&lt;p&gt;Движение BI-as-Code также приняло встраиваемые движки. Rilldata объявила об интеграции DuckDB в 2023 году для автоматического профилирования и интерактивного моделирования при разработке панелей мониторинга, в то время как Evidence представила &lt;a href="https://evidence.dev/blog/why-we-built-usql"&gt;Universal SQL в 2024 году&lt;/a&gt;, основанный на реализации WebAssembly от DuckDB.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Заключение&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Ландшафт бизнес-аналитики продолжает развиваться в сторону более гибких и эффективных решений.&lt;/p&gt;
&lt;p&gt;Каждое архитектурное изменение принесло явные преимущества: безголовая BI обеспечила согласованность метрик между инструментами, бездонная BI снизила сложность инфраструктуры, BI-as-Code привнесла рабочие процессы разработчиков в аналитику, а встроенные движки теперь объединяют эти преимущества с высокопроизводительными возможностями запросов.&lt;/p&gt;
&lt;p&gt;Интеграция встраиваемых движков запросов с легкими BI-инструментами представляет собой перспективное направление для реализации легкой BI, объединяющее лучшие аспекты традиционных BI-возможностей с современными архитектурными шаблонами. По мере развития этих технологий и роста экосистемы компании могут рассчитывать на все более сложные, но компонуемые решения для своих аналитических потребностей.&lt;/p&gt;
</description>
</item>

<item>
<title>BI как код – Rill</title>
<guid isPermaLink="false">97</guid>
<link>https://gavrilov.info/all/bi-kak-kod-rill/</link>
<pubDate>Thu, 14 Dec 2023 21:30:52 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/bi-kak-kod-rill/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/240772792-49d17e80-5f27-408c-bbc9-fdbff7b6b627.gif" width="1782" height="1152" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;a href="https://github.com/rilldata/rill"&gt;https://github.com/rilldata/rill&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Качаем, ставим, запускаем:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;curl -s https://cdn.rilldata.com/install.sh | bash
rill start my-rill-project&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Можно еще статейку полистать:&lt;br /&gt;
&lt;a href="https://a.gavrilov.info/data/posts/Unlocking%20Data%20Insights%20with%20Rill:%20A%20Comprehensive%20Guide%20to%20Streamlined%20Data%20Analytics%20%7C%20by%20Felix%20Gu.pdf"&gt;https://a.gavrilov.info/data/posts/Unlocking%20Data%20Insights%20with%20Rill:%20A%20Comprehensive%20Guide%20to%20Streamlined%20Data%20Analytics%20%7C%20by%20Felix%20Gu.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🤌 DuckDB inside&lt;/p&gt;
</description>
</item>

<item>
<title>Визуализация изменения ценности 1$ на протяжении 20 лет</title>
<guid isPermaLink="false">93</guid>
<link>https://gavrilov.info/all/vizualizaciya-izmeneniya-cennosti-1-na-protyazhenii-20-let/</link>
<pubDate>Sun, 10 Dec 2023 22:17:39 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/vizualizaciya-izmeneniya-cennosti-1-na-protyazhenii-20-let/</comments>
<description>
&lt;p&gt;Смотрим тут: &lt;a href="https://perthirtysix.com/tool/visualizing-american-inflation"&gt;https://perthirtysix.com/tool/visualizing-american-inflation&lt;/a&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2023-12-10-v-22.08.47.png" width="2382" height="1336" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;a href="https://perthirtysix.com/tool/visualizing-american-inflation"&gt;https://perthirtysix.com/tool/visualizing-american-inflation&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Или копию pdf тут: &lt;a href="https://a.gavrilov.info/data/posts/How%20Far%20Would%20"&gt;https://a.gavrilov.info/data/posts/How%20Far%20Would%20&lt;/a&gt;$1%20From%201999%20Go%20Today%3F.pdf&lt;/p&gt;
</description>
</item>

<item>
<title>Рисую простую диаграмму на Python</title>
<guid isPermaLink="false">25</guid>
<link>https://gavrilov.info/all/risuyu-prostuyu-diagrammu-na-python/</link>
<pubDate>Sat, 09 Jul 2022 19:36:03 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/risuyu-prostuyu-diagrammu-na-python/</comments>
<description>
&lt;p&gt;Вот собственно сам код:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import pandas as pd
import altair as alt

df = pd.read_excel('Sample - Superstore.xls', index_col=0) 
df2 = df.groupby('Region').sum()
df2 = df2.reset_index(level=0)

bars = alt.Chart(df2).mark_bar().encode(
   alt.X('Region:N', sort='-y'),
   alt.Y('Sales:Q'),
   color=alt.condition(  alt.datum.Region == 'West',  # If the year is 1810 this test returns True,
   alt.value('orange'),     # which sets the bar orange.
   alt.value('steelblue'))   
)

text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=11  # Nudges text to right so it doesn't appear on top of the bar
).encode(
    text='mean(Sales):Q'
)

(bars + text).properties(height=300)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/visualization.png" width="209" height="370" alt="" /&gt;
&lt;/div&gt;
</description>
</item>


</channel>
</rss>