Аналитика небольших данных: как совместить Excel, Python и SQL с помощью инструментов с открытым исходным кодом

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Введение

Однажды Джоэл Спольски в своей знаменитой презентации «You Suck at Excel» сказал, что существуют сотни коммерческих продуктов, вместо которых можно было бы использовать табличку Excel.

В этой шутке очень высокая доля правды. Excel благородя интуитивному UI, формулам и VBA дает возможность пользователям самим решать широкий спектр задач, избавляя от необходимости каждый раз обращаться за помощью к разработчикам или внедрять в компании новый продукт. Excel используется везде от мелкой розницы до Fortune 500 и CERN.

Пользовательский интерфейс Excel оказался, настолько удачным – ни один из конкурентов так и отошел от привычных таблиц. Для пользователя Excel интерфейс Google Spreadsheet будет привычным и интуитивно понятным. А вот по своим функциональным возможностям Excel до сих пор превосходит большинство конкурентов.

Как с помощью двух мощных инструментов с открытым исходным кодом можно совместить привычный для пользователей интерфейс, надежность и мощь SQL, гибкость Python и командную работу как в Google Spreadsheet? Давайте рассмотрим это на простом примере.

Grist

https://github.com/gristlabs/grist-core

Это аналог Google Spreadsheet который можно хостить на своей инфраструктуре. Интерфейс Grist похож на Excel, но вместо VBA используется Python, а вместо инфраструктуры Google каждый документ Grist представляет из себя базу SQLite.

В каждой ячейке можно вводить формулы на Питоне:

Формулы
Формулы

https://support.getgrist.com/formulas

По сути дела весь документ Grist – это скрипт на Питоне, который сохраняет данные в базу SQLite:

Python
Python

У этого решения есть огромный плюс – ваши данные всегда остаются у вас. Для SQLite очень легко настроить резервное копирование – в отличии от «серьезных» баз данных, SQLite не требует особого ухода, но при этом почти ничем не уступает по функционалу MySQL или Postgres.

Не будем подробно разбирать все возможности Grist, разработки этого продукта ушли гораздо дальше Google Spreadsheet и Excel. По сути дела, Grist можно использовать в качестве мини CRM в небольшой организации. И это решение будет мало чем уступать дорогим (в плане обслуживания) решениям вроде Salesforce.

В плане администрирования Grist очень неприхотлив, сервис можно развернуть в контейнере следующим образом:

mkdir persist
docker run -p 8484:8484 -v $$PWD/persist:/persist -it gristlabs/grist

В директории persist будут сохранятся данные в SQLite – это необходимо для того, чтобы они могли «пережить» перезагрузку сервиса.

Metabase

Girst – это отличный вариант для небольшой команды специалистов, но что делать бизнес-аналитику или дата-инженеру, которому нужно анализировать данные из десятков различных источников и необходимо создавать сложные отчеты и витрины данных?

Для этих целей отлично подходит другой инструмент открытым исходным кодом – Metabase.

https://www.metabase.com/data_sources

Metabase
Metabase

В Metabase есть мониторинг и возможность рассылки по почте. Графики Metabase можно встраивать на сторонних ресурсах. Существует возможность настройки интерактивных витрин данных и эверистика (Query Builder) с помощью, которого пользователь может задавать вопросы, которые автоматически конвертируются в SQL-запросы.

Charts
Charts

Настройка Metabase

Для установки вам понадобится Docker compose. Нужно создать файл docker-compose.yml со следующим содержимым:

version: '3.9'
services:
  metabase:
    image: metabase/metabase:latest
    container_name: metabase
    hostname: metabase
    volumes:
    - /dev/urandom:/dev/random:ro
    - /srv/grist:/srv/grist/persist:ro
    ports:
      - 3000:3000
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabase
      MB_DB_PORT: 5432
      MB_DB_USER_FILE: /run/secrets/db_user
      MB_DB_PASS_FILE: /run/secrets/db_password
      MB_DB_HOST: postgres
    networks:
      - metanet1
    secrets:
      - db_password
      - db_user
    healthcheck:
      test: curl --fail -I http://localhost:3000/api/health || exit 1
      interval: 15s
      timeout: 5s
      retries: 5
  postgres:
    image: postgres:latest
    container_name: postgres
    hostname: postgres
    environment:
      POSTGRES_USER_FILE: /run/secrets/db_user
      POSTGRES_DB: metabase
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    networks:
      - metanet1
    secrets:
      - db_password
      - db_user
networks:
  metanet1:
    driver: bridge
secrets:
   db_password:
     file: db_password.txt
   db_user:
     file: db_user.txt

Затем создать в текущей директории два файла:

  • db_user.txt

  • db_password.txt

В этих файлах вам нужно записать имя пользователя и пароль к базе данных Metabase.
Пускай это будет postgres и postgrespassword.

Следующая строчка конфига очень важна: мы монтируем директорию в которой Grist сохраняет свои документы в контейнер Metabase. Затем этот путь будет использоваться Metabase для подключения к базе данных:

    volumes:
    - /dev/urandom:/dev/random:ro
    - /srv/grist/persist:/srv/grist:ro

В настройках Metabase в разделе «Admin Settings» нужно добавить новую баз данных SQLite указав путь до примонтированной директории Grist /srv/grist/doc/НАЗВАНИЕ_ДОКУМЕНТА_GRIST. В этом же разделе можно задать настройки автоматического сканирования схемы и таблиц.


Источник: https://habr.com/ru/articles/751352/


Интересные статьи

Интересные статьи

В 2022 году мы запустили новое мобильное приложение для iOS и Android, встроив в него дополнительные сервисы: «Медиа», «Трекер активности», «Live-трансляции», «Онлайн-тренировки» и другие. Они закрыва...
Можно ли с помощью ИИ автоматизировать набор правил, по которым действуют на бирже профессиональные трейдеры? Команда VK Cloud Solutions перевела статью о том, как это удалось реализовать и что вышло ...
Наверное, все разработчики слышали, что нужно писать чистый код. Но не менее важно писать и использовать безопасный код. Python-разработчики обычно устанавливают модули и сторонние...
Наверное каждому разработчику хотя бы раз в жизни приходила идея что-нибудь автоматизировать. Ведь если есть возможность избавиться от рутины, то грех ей не воспользоваться. Для меня эта идея...
Продолжаем тему как вызывать C/C++ из Python3. Теперь используем C API для создания модуля, на этом примере мы сможем разобраться как работает cffi и прочие библиотеки упрощающие нам жизнь. Пот...