• Evidence — конструктор приложений на Markdown и SQL для аналитиков данных.
  • Streamlit — обертка веб-приложения дата-сайентистов, работающих с Python.
  • Dash — веб-фреймворк для разработчиков Python.
  • Observable — набор инструментов визуализации данных для разработчиков на JavaScript.
  • Shiny — простая оболочка R/Python для исследователей и статистиков.
  • Quarto — минималистская система публикаций на Jupyter/Markdown для ученых и технических писателей.

Каждый из этих инструментов имеет открытый исходный код, найти его можно на GitHub.

ИнструментРепозиторий на GitHubЛицензияЯзыкиЗвезды
Evidenceevidence-dev/evidenceMITSQL/Markdown4,3 тыс.
Streamlitstreamlit/streamlitApache 2.0Python35 тыс.
Dashplotly/dashMITPython21 тыс.
Observableobservablehq/frameworkISCJavaScript2,5 тыс.
Shinyrstudio/shinyGPL-3.0R/Python5.4 тыс.
Quartoquarto-dev/quarto-cliMITMarkdown/Jupyter3,9 тыс.
Краткое сравнение инструментов

Evidence

Инструмент SQL и Markdown для создания приложений с данными

Evidence выделяется тем, что управляет вводом данных SQL-запросами и создает содержимое страницы при помощи Markdown и предварительно созданных компонентов.

Ввод данных в Evidence управляется с помощью запросов SQL. В случае распространенных визуализаций, таких как таблицы или гистограммы, содержимое страницы создается с помощью Markdown и предварительно созданных компонентов Evidence.

Evidence предназначена для аналитиков, знакомых с SQL и Markdown, и предлагает расширяемость через веб-стандарты. Приложения Evidence доведены до блеска, они производительны и просты в применении заинтересованными сторонами.

Evidence также дает неограниченные возможности определять собственные компоненты на HTML и JavaScript и стилизовать страницу с помощью CSS. Инструмент поддерживает постоянно растущий список вариантов развертывания, включая Evidence Cloud — это безопасный, управляемый хостинг.

Пример кода

# Отчет о продажах

<Slider min=2019 max=2024 name=year_pick title=Year size=full/>

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

<BarChart
  data={sales_by_month}
  title="Sales by Month"
  x=order_month
  y=sales
/>

Хороший выбор, если:

  • Вы в основном работаете с SQL и хотите получить удобные для бизнеса результаты.
  • Прежде всего вы не разработчик JavaScript
  • Вам нужна возможность добавлять пользовательские компоненты, если потребности выходят за рамки готовых функций.

Не рекомендуется, если:

  • Для управления данными вы не хотите использовать SQL-запросы.

Streamlit

Логотип Streamlit

Оболочка веб-приложения для pandas, numpy и других основных инструментов Python в области науки о данных

Если вы уже знакомы с такими вещами, как numpy или pandas, документация Streamlit позволит вам почувствовать себя как дома. Обернув, скажем, np.histogram во что-то вроде st.bar_chart, Streamlit позаботится о переводе вашего кода на Python в веб-приложение.

Streamlit запускает ваш скрипт Python сверху вниз, передавая на страницу выходные данные, такие как текст, таблицы или диаграммы. Этот инструмент также можно использовать для создания чат-бота в стиле ChatGPT на выходных данных кода Python.

Пример кода

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

# Создаем текстовый элемент и сообщаем читателю, что данные загружаются.
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("Done! (using st.cache_data)")

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)

Хороший выбор, если:

  • Вы дата-сайентист, работаете с Python и хотите быстро создать общедоступное веб-приложение.

Не рекомендуется, если:

  • Нужно настроить UI/UX за рамками базовых цветовых тем.
  • Нужно детально управлять повторной отрисовкой страницы (если вы не управляете фрагментами вручную, при изменении входных данных весь сценарий перезапускается).
  • Вам не нравится писать скрипты Python.

Dash

Нативный для Python фреймворк веб-приложений предоставляет прямое управление макетом приложения, элементами DOM и обратными вызовами

Dash позволяет разработчикам на Python создавать интерактивные веб-приложения без необходимости изучения JavaScript. Он предлагает существенные возможности управления и настройки для тех, кто хочет копаться в документации. Ядро Dash — класс Python, который сочетает в себе несколько концепций:

  • Оболочки Python для рендеринга общих элементов DOM и графических визуализаций (например, html.H1, dcc.Graph).
  • Макет приложения, определенный как список вышеуказанных элементов в app.layout.
  • Загрузка и обработка данных с помощью обычных инструментов обработки данных, таких как numpy или pandas.
  • Интерактивность через обратные вызовы, которые принимают из приложения именованные входные данные (т. е. значение из раскрывающегося списка) и возвращают именованные выходные данные (т. е. отфильтрованный фрейм данных).
  • Можно добавить собственные CSS и JavaScript.

Dash построен поверх Flask, поэтому любой разработчик Python, имеющий опыт применения какого-нибудь веб-фреймворка, должен чувствовать себя в нем комфортно. Хотя R, Julia и F# также указаны в списке совместимых языков, подавляющий объём документации Dash написан для Python.

Dash — сильный выбор для опытных программистов на Python, которым нужно детальное управление. Однако, если вам не нравятся ментальные модели, например классы, обратные вызовы или DOM, кривая обучения в Dash может показаться вам немного крутой.

Пример кода

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)

Хороший выбор, если:

  • У вас хорошие навыки работы с Python, и вы хотите иметь более прямое управление макетом, стилем и интерактивностью, чем в Streamlit.
  • Вы уже хорошо работаете в веб-фреймворках на Python, таких как Flask или Django.
  • Вы знакомы с библиотеками для дата-сайенс на Python, такими как pandas, numpy и plotly.

Не рекомендуется, если:

  • Вам не нравятся классы, обратные вызовы, методы или декораторы Python.
  • Вам неудобно напрямую взаимодействовать с DOM.

Observable

Набор инструментов визуализации для веб-разработчиков, использующих JavaScript

Если вам больше подходит скорость npm run dev, Observable — отличный выбор, позволяющий задействовать всю мощь веб-разработки для визуализации данных. Фреймворк предоставляет импортируемые хелперы, такие как Plot и FileAttachment, он упрощает интеграцию входных данных и готовых компонентов визуализации в веб-приложение. В вашем распоряжении по-прежнему остаются все обычные инструменты веб-разработки: HTML, JSX, компоненты React, стили CSS, импорт и функции JavaScript и т. д.

Хотя загрузчики данных для Observable могут быть написаны на любом языке программирования, базовый уровень владения понятиями из веб-разработки (например, HTML, CSS и JavaScript) позволит применять многие функции Observable наилучшим образом.

Пример кода

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, // различные цвета, не последовательности
				stroke: 'temperature',
				curve: 'step-after'
			})
		]
	});
}
# Прогноз погоды

```js
import { temperaturePlot } from './components/temperaturePlot.js';
```

```js
const forecast = FileAttachment('./data/forecast.json').json();
```

```js
display(temperaturePlot(forecast));
```

Хороший выбор, если:

  • Вы веб-разработчик, хорошо разбираетесь в HTML, CSS и JavaScript и хотите в полной мере использовать обычные инструменты (например, Node, React).

Не рекомендуется, если:

  • Вы не уверены в том, что такое node и npm, или что означает async/await.

Shiny

Своеобразная оболочка R и Python с упором на эффективную реагирование

Если R или Python — ваш любимый язык обработки данных, и вы не заинтересованы в собственно веб-разработке или ручном управлении обратными вызовами, то, возможно, стоит приложить усилия для изучения ментальных моделей Shiny. Из всех инструментов, рассмотренных в этой статье, он, вероятно, является наиболее самоуверенным с точки зрения создания новых концепций, специфичных для Shiny, которые может изучить пользователь. Например, все вводимые пользователем данные (то есть раскрывающиеся списки) определяются с помощью функций ui.input_*(), а все выходные данные создаются декораторами, такими как @render.plot. Код сложной информационной панели Shiny может оказаться довольно громоздким.

Результатом всего этого является то, что Shiny автоматически управляет эффективной отзывчивостью за вас. В их документации даже приведен пример воспроизведения панели управления Streamlit для повышения производительности.

HTML, CSS и JavaScript можно управлять вручную, но необходимость размещать их внутри оболочек Python может сделать код немного неуклюжим.

Если вы готовы использовать чистые, минималистичные и предварительно стилизованные компоненты Shiny, если цените эффективную отзывчивость, хорошим выбором может стать Shiny.

Пример кода

from shiny.express import input, render, ui
from shinywidgets import render_plotly

ui.page_opts(title="Penguins dashboard", fillable=True)

with ui.sidebar():
    ui.input_selectize(
        "var", "Select variable",
        ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g", "year"]
    )
    ui.input_numeric("bins", "Number of bins", 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())
Скриншот Shiny

Хороший выбор, если:

  • У вас сильные навыки R или Python, и вы хотите использовать только эти языки.
  • Вы цените быструю и эффективную отзывчивость и не хотите управлять обратными вызовами вручную.
  • Вы с удовольствием используете чистые, минималистичные, предварительно стилизованные компоненты.

Не рекомендуется, если:

  • Вы не хотите изучать специфичные для Shiny ментальные модели управления пользовательским интерфейсом и отзывчивостью.
  • Вы предпочитаете напрямую управлять пользовательским интерфейсом с более традиционым стеком веб-разработки (т. е. HTML/CSS/JS).
  • Вам нужно сильно настраиваемый внешний вид и управление ощущениями от интерфейса

Quarto

Минималистический инструмент рендеринга страниц на Jupyter/Markdown, предназначенный для научно-технических публикаций

Если ваша цель — как можно быстрее и без каких-либо излишеств преобразовать результаты анализа данных в файлы HTML, .doc или PDF, Quarto может стать хорошим выбором. Он использует блокноты Jupyter или Markdown с надстройками Quarto и преобразует их в широкое разнообразие форматов. Доступны темы и некоторые параметры интерактивности. Фактически, если вы готовы потрудиться, чтобы просмотреть его, Quarto предоставляет документацию для большинства вещей, которые вы, возможно, захотите сделать. Quarto в целом — хороший выбор для тех, кто уже комфортно работает с блокнотами Jupyter и хочет быстро преобразовать свою работу в общий формат без особых настроек и суеты.

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

Пример кода

---
title: 'Quarto Basics'
format:
  html:
    code-fold: true
jupyter: python3
---

For a demonstration of a line plot on a polar axis, see @fig-polar.

```{python}
#| label: fig-polar
#| fig-cap: "A line plot on a polar axis"

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()
```
Скриншот Quatro

Хороший выбор, если:

  • Вы уже хорошо знакомы с блокнотами Jupyter или Markdown и хотите быстро преобразовать свою работу в общедоступный формат с минималистичным стилем.
  • Вы не против просмотреть документацию, чтобы выполнить задачи сложнее (например, индивидуальное оформления или развертывания на конкретном сервисе вроде Netlify).

Не рекомендуется, если:

  • Вам нужен полноценный функционал веб-разработки.
  • Требуется широкий контроль над внешним видом или интерактивностью.

Заключение

При выборе инструмента BI-as-code учитывайте технические навыки и конкретные потребности вашей команды:

  • Evidence идеально подходит для аналитиков, которые работают в основном с SQL и хотят быстро создавать приложения для обработки данных с использованием Markdown.
  • Streamlit хорошо подходит для Python и дата-сайентистов, которым требуется быстрое прототипирование.
  • Dash предлагает больше управления питонистам, которые знакомы с веб-фреймворками.
  • Observable предоставляет все возможности разработки веб-разработчикам на JavaScript.
  • Shiny подходит пользователям R/Python, которым требуется эффективное управление отзывчивостью.
  • Quarto идеально подходит для ученых и технических писателей, занятых публикацией документов.

Если вы хотите попробовать Evidence самостоятельно, можно свободно начать здесь.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Casey Juanxi: The Most Popular Code-based Business Intelligence Tools, Reviewed

Предыдущая статья11 общедоступных аналогов SaaS: собственный хостинг с Docker
Следующая статьяМеханика разрешения имен и связывания на C++