Одним из самых распространенных инструментов для внедрения аналитики является BI инструменты – Tableau, Superset, Datalens и многие другие, десятки их. Это отличные инструменты, но какие бы крутые и сложные визуализации традиционно у каждого из таких инструментов одной из важнейших фич является «Экспорт в Excel» - пользователям нужны выгрузки, детальные данные и т.д. На одном из проектов я обсуждал с заказчиком перспективы развития BI в компании – что уже сделано, что делаем дальше и менеджер задал коварный вопрос: «Артём, дашборды это конечно здорово, но можно ли сделать так, чтобы данные загружались к нам сразу в Excel, причем автоматически». И вот что вы придумали...
А зачем это всё-таки нужно?
Перед тем, как приступить к техническому решению мы с коллегами решили уточнить зачем бизнес-пользователям такое нужно, ведь традиционный ответ на такие запросы «А давайте мы сделаем вам новый дашборд, чтобы выгрузка была не нужна». И собрали такие возражения
Форматы отчетов недостаточно гибкие с точки зрения визуала. Excel и Powerpoint разбаловали бизнес-пользователей (особенно топ-менеджмент) и принести им презентацию сделанную «не по шаблону» может привести к большим проблемам, вплоть до увольнения. Многие BI инструменты по гибкости не дотягивают до Excel и бедным аналитикам/менеджерам приходится вручную выгружать/верстать слайды.
Мне рассказали страшную историю, как одном из отделов руководитель каждую неделю вынужден был тратить по 2 дня на ручную сборку данных и подготовку презентацииBI не справляется с объемом работы и последующих доработок. Ситуации когда BI-специалисты могут сразу полностью быстро удовлетворить запросы пользователей встречаются очень редко. Обычно задача падает в бэклог, потом согласовывается, потом до неё доходит очередь и кто-то берёт её в работу. К этому времени задача может стать не актуальной.
Excel так или иначе знают все специалисты в любом отделе - продажи, маркетинг, финансы. Им удобно получать и анализировать цифры в нём, не прибегая к сторонним инструментам, которые надо изучать дополнительно.
Дашборды не работают для ad-hoc аналитики. Когда нужно быстро свести данные из разных отчетов, то всё равно приходится делать это вручную.
Мы пришли к выводу, что проблема действительно существует и её было бы здорово решить и сформулировали следующие требования
У пользователя должна быть возможность загружать данные напрямую в электронные таблички
Дальнейшая загрузка/обновление данных должны быть в автоматическом режиме (по таймеру) или вручную. Необходимо избежать ручных выгрузок/загрузок
Вся разработка своими силами, закупать коммерческое ПО нельзя – нет бюджета.
Как доставить данные в Excel
Основным инструментом работы аналитиков и менеджеров был Excel. В нём есть механизм импорта данных с помощью Power Query, который позволяет импортировать данные из табличек. Мы хотели воспользоваться им, но столкнулись с ограничениями
Из коробки доступны подключения только базам MySQL/SSAS. В компании использовались разные БД – PostgreSQL, Clickhouse, MySQL, поэтому такой подход не работал.
Можно было подключится через ODBC, но при этом невозможно было детально ограничить какие данные пользователь мог отбирать, невозможно сделать row-level security или column-level security.
Мы пришли к выводу что это не рабочий подход и стали искать другие варианты. В процессе поисков наткнулись на проект VulcanSQL (https://vulcansql.com/) который позволял создавать Data API – сервер состоящий из эндпоинтов и документации к ним. Бизнес логика формировалась с помощью комбинации SQL и Jinja. К сожалению проект с января 2024 года не обновлялся, поэтому мы решили сделать свою версию.
Создаём Data API сервис.
Свою версию Data API мы написали на Python. Технически он состоял из сервера на FastAPI, у которого каждый endpoint отвечал за доступ к определенному источнику – продажам, запасам и т.д. Перед началом работы мы думали над несколькими фреймворками и остановились на FastAPI по следующим причинам:
Высокая производительность и простота разработки. Каждая функция - отдельный эндпоинт для своего источника данных
Автоматическая документация Swagger и ReDoc, которую мы дополняли описанием на Markdown
Возможность валидировать входящие данные при необходимости
В результате разработчикам и начинающим аналитикам было достаточно просто создавать свои источники данных не прибегая к помощи старших разработчиков.
Логика работы для пользователя выглядела так:
-
Пользователь направляет запрос на сервер, при необходимости указывает параметры, которые указаны в документации. Например если ему были нужны данные по продажам, то запрос мог выглядеть так
data_api.company.ru/sales?category=Technology
На основе полученных данных с помощью шаблона Jinja (пример ниже) формируется SQL запрос. В шаблоне мы кодируем всю необходимую логику фильтрации, группировки и обработки данных.
SELECT *
FROM eu_superstore_orders
WHERE 1=1
{% if context.params.category -%}
AND "Category" = '{{ context.params.category }}'
{% endif -%}
{% if context.params.region -%}
AND "Region" = '{{ context.params.region }}'
{% endif -%}
Запрос направляется в соответствующую БД, исполняется, результат возвращается пользователю в виду JSON или CSV.
Пользователь может подключится к полученному источнику с помощью Power Query в Excel и таким образом получить прямой, обновляемый источник данных.
Итоги и планы
В итоге пользователи получили простой механизм автоматического обновления данных в Excel. Плюс они могут дорабатывать отчёты с помощью PowerQuery — этому пришлось обучать, но вложения окупились.
Дополнительный бонус — логирование всех действий. Теперь мы видим, кто и когда делает запросы, и можем показать реальную востребованность сервиса.
Что дальше:
реализовать row-level и column-level security для разных групп пользователей
добавить больше источников данных
внедрить слой кеширования, чтобы снизить нагрузку на БД.
Минусы подхода: плохо работает с очень большими объемами данных. При более чем миллионе строк скорость обновления падает. В таких случаях пользователей лучше переводить в классические self-service BI-инструменты.