Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Сегодня я расскажу про hippotable — удобный инструмент для анализа данных, который я сделал для себя и для людей.
Я люблю ковыряться в данных. Иногда станет интересно, в какой области больше всего городов, так аж кушать не могу, пока не выясню (как легко догадаться, в Московской, но потом в Свердловской). А на работе мне иногда удаётся совместить приятное с полезным: о нет, вижу ошибку в логах! Из каких браузеров она летит?
Но чем простому парню вроде меня поковыряться в данных? Есть 3 варианта, но все они так себе:
bash. Я могу нашлепать что-то вроде
cat user-ids.csv | sort | uniq | wc -c
для подсчета уникальных пользователей с багом. Если вопрос чуть сложнее (посчитать распределение по платформам), начинаются проблемы — будем честны, настоящих мастеров баша мало.Google sheets & co на вид хорошо подходят для задачи — много статистических функций, графики, все удобно и интерактивно. Но есть две беды: много ненужных функций (зачем мне ручное форматирование?) и сложность работы с несколькими таблицами (если вы пробовали поджойнтить таблицы через VLOOKUP, вы понимаете, о чем я). У онлайн-решений ещё проблемы с конфиденциальностью, не отправлять же данные пользователей на сервер гугла.
Pandas / jupyter — отличный инструмент для анализа, но нужно писать много кода. Мои задачи довольно простые, мне вполне подойдет что попроще.
Этой осенью я поступил в магистратуру и мне нужно было придумать курсовой дата-проект. Отличный повод решить мою проблему! Получился hippotable — удобный инструмент для ковыряния в небольших данных. Сегодня я объясню как этот инструмент работает, покажу пример использования, и расскажу о дальнейшем развитии продукта.
Делаем сами
Чего я желаю от инструмента для анализа данных?
Открывать довольно большие файлы (до 100 Мб).
Сортировки и фильтры.
Агрегации — без них не получится ответить на многие вопросы.
Работает в браузере, чтобы я мог поковыряться в данных хоть с компьютера, хоть с телефона, не устанавливая никаких программ.
Не отправляет данные на сервер, чтобы можно было работать с конфиденциальными данными, и заодно сэкономить на передаче по сети.
Удобная таблица для просмотра данных со скроллом, автоматической шириной столбца и вообще отличным UX.
Графики, чтобы видеть закономерности глазами.
Теперь подберем инструменты, которые нам понадобятся. Это UI-фреймворк для отрисовки интерфейса и мощный dataframe-движок (я уже делал эффективное column-based хранилище на JS, боьше не хочется).
С UI определился быстро — давно хотел попробовать solidjs, и вот подвернулся шанс. По бенчмаркам солид в топе, на уровне ванильного JS. Синтетические бенчмарки ругают за то, что в них тестируют отрисовку большой таблицы, а это же не типичное приложение, но вот удача — мое приложение по сути и есть большая таблица! Не жалуюсь, работает правда быстро.
С датафреймом интереснее. Есть два вида решений: классические JS-бибилиотеки (arquero, danfo.js) и wasm-сборки in-memory СУБД (SQLite, DuckDB). wasm-сборки работают быстрее, но грузятся дольше. В итоге я решил использовать традиционный JS, чтобы не закапываться в wasm и асинхронность, а из двух библиотек выбрал arquero — он лучше по бенчмаркам, и по репозиторию видно, что продукт развивается. Скорости вполне хватает — можно работать с датасетами на миллионы строк. Но тут я сомневаюсь в выборе: SQL — популярный язык, и на нем пользователям проще писать мощные запросы. На будущее оставлю возможность подмены дата-бекенда на DuckDB (у нас же OLAP, duck как раз для этого и сделан).
Про саму разработку рассказать особо нечего. Дедлайн в январе помог за 8 суббот нашлепать простую первую версию, которая уже помогает мне в работе и по жизни.
Пользуемся
Сейчас покажу небольшой пример использования hippotable на демо-датасете с kaggle — наборе 40К+ фильмов с оценками. Если интересно, можете сами воспроизвести мой анализ.
Начнем с простого — в какой стране, в среднем, снимают фильмы с лучшими оценками? Группируем по стране, сортируем по средней оценке:
Упс, мы нашли экзотические комбинации стран, которые однажды вместе сняли неплохой фильм — не совсем то, что мы хотели. Оставим только страны с выборкой из более 10 фильмов:
Неожиданно. Кстати, если любопытно — худшие фильмы, в среднем, снимали в Италии:
Слои фильтрации и агрегации можно чередовать, чтобы строить более сложные пайплайны. Например, страны, в которых больше всего режиссеров снимали неплохие фильмы:
Что же дальше
Чтобы не затягивать разработку первой версии, я оторвал много полезных фичей. Сейчас расскажу, в какую сторону хочется развивать продукт.
Импорт. Главная цель — поддержать импорт не только CSV, но и JSON. Это позволит подключать hippotable к данным из API — получится публичный no-code дашборд. Еще можно попробовать импорт xlsx, но боюсь, что будет сложно обработать все форматы, которые люди делают в своих таблицах.
Сохранение пайпланов. Иногда хочется подпихивать разные данные в один и тот же пайплайн — например, я часто считаю число уникальных пользователей или распределение по платформам. Было бы здорово сохранять фильтры и агрегации, а потом просто "загружать" их — для начала локально, но можно подумать и про серверное хранилище (и премиум хранилище, куда можно сложить и данные, и пайплайн, за деньги).
Инструменты анализа. Тут самые большие дыры, просто перечислю: вычислимые столбцы, агрегации с параметром (это квантили), корреляция, дедубликация. Сюда же — работа с несколькими таблицами.
Графики. Что за анализ данных без красивых графиков? Осталось определиться с подходящей библиотекой и продумать UX расположения графиков на экране.
Экспорт. Результатами анализа хочется делиться. Сейчас есть экспорт в CSV — неплохо, но бедновато. В идеале каждой таблицей можно поделиться по ссылке или скачать в HTML, подредактировать и выложить на свой хостинг.
И два направления, которые меня не сильно интересуют:
Поддержка более огромных датасетов. Я люблю самое-самое (самые большие датасеты! самая быстрая обработка!), и это интересная задача (с потоковой обработкой можно загрузить хоть 1 Тб данных), но hippotable уже хорошо работает в районе миллиона строк, и этого вполне достаточно для практических задач.
Продвинутая аналитика с произвольным JS / tensorflowjs и так далее. В первую очередь я делаю удобный браузерный интерфейс для arquero. Если вы мастер программирования, проще напрямую использовать его в своем коде с любой дополнительной обработкой вокруг. Интересный вариант — опубликовать веб-компонент таблицы как npm-пакет, который можно подключать в любое приложение для удобного просмотра данных.
Сегодня я рассказал вам про hippotable — браузерный инструмент для анализа данных. В первой версии уже есть много классного:
Открывайте большие CSV-файлы (сотни мегабайт, миллионы строк).
Удобный и быстрый UI, можно скроллить таблицу даже на телефоне.
Фильтры и сортировка в реальном времени.
Агрегации для анализа данных.
Мощные пайплайны из нескольких слоев фильтров и агрегаций.
Экспорт результата в CSV.
Под капотом — arquero и solidjs.
На этом всё! Используйте hippotable, если поставите звездочку на гитхабе — очень мне поможете. Буду держать вас в курсе новостей.