$ sudo teach IT

Данные в видео: 

product,price,category,country
Laptop,1200,Electronics,Germany
Phone,800,Electronics,France
Chair,150,Furniture,Italy
Table,300,Furniture,Germany
Camera,600,Electronics,Spain
Bike,1600,Sport,Spain

На прошлом уроке мы создали первый dashboard, загрузили CSV-файл и вывели таблицу в интерфейсе Streamlit. Уже тогда приложение выглядело намного интереснее обычного Python-скрипта, но пока что оно оставалось “статичным”. Данные просто отображались на экране, а пользователь никак не мог с ними взаимодействовать. И вот здесь начинается самая интересная часть Streamlit.

Настоящий dashboard — это не просто таблица и графики. Главная идея dashboard-приложений заключается в интерактивности. Пользователь должен иметь возможность:

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

Представьте обычную аналитическую систему. Руководитель открывает dashboard и хочет посмотреть:

  • продажи только за текущий месяц;
  • только определённую категорию товаров;
  • или только данные по конкретной стране.

Если приложение не умеет это делать, оно быстро превращается просто в красивую картинку. Именно поэтому пользовательские элементы управления — одна из важнейших частей Streamlit.

Что вы узнаете в рамках статьи

В этом уроке вы познакомитесь с основными элементами управления Streamlit и научитесь связывать их с DataFrame.

Мы разберём, как работают:

  • выпадающие списки;
  • множественный выбор;
  • ползунки;
  • чекбоксы;
  • переключатели;
  • выбор даты;
  • боковую панель.

Ключевые термины

  • Widget — интерактивный элемент интерфейса в Streamlit.
  • selectbox — выпадающий список для выбора одного значения.
  • multiselect — элемент для выбора нескольких значений одновременно.
  • slider — ползунок для выбора числового значения или диапазона.
  • checkbox — флажок с двумя состояниями: включён или выключен.
  • radio — переключатель для выбора одного варианта из нескольких.
  • date_input — элемент выбора даты.
  • sidebar — боковая панель Streamlit, в которой обычно размещают фильтры и элементы управления.
  • Фильтрация данных - Отбор только тех строк DataFrame, которые соответствуют определённым условиям.

Почему интерактивность так важна

До этого момента наш dashboard был не динамическим. Таблица отображается, всё работает… но проблема в том, что пользователь ничего не контролирует. А теперь представьте, что данных уже не 5 строк, а 50 тысяч. Просто смотреть на огромную таблицу становится бессмысленно. Хочется выбрать нужную категорию, ограничить диапазон цен, оставить только определённые даты и так далее. Именно здесь Streamlit начинает раскрывать себя по-настоящему.

Подготовка данных

Для начала немного расширим наш CSV-файл:

product,price,category,country
Laptop,1200,Electronics,Germany
Phone,800,Electronics,France
Chair,150,Furniture,Italy
Table,300,Furniture,Germany
Camera,600,Electronics,Spain

Этого уже достаточно для первых фильтров.

Selectbox — выбор одного значения

Начнём с одного из самых популярных элементов Streamlit. selectbox создаёт выпадающий список, из которого пользователь может выбрать одно значение.

Например:

category = st.selectbox(
    "Выберите категорию",
    df["category"].unique()
)

Здесь происходит сразу несколько вещей. Сначала Streamlit создаёт выпадающий список. Затем в него передаются уникальные категории из DataFrame. А выбранное пользователем значение сохраняется в переменную category.

И вот это очень важный момент. Практически все widgets Streamlit работают именно так:

  • вы отображаете элемент;
  • пользователь взаимодействует с ним;
  • Streamlit возвращает выбранное значение обратно в Python-код.

Теперь самое интересное — используем выбранную категорию для фильтрации таблицы.

filtered_df = df[df["category"] == category]

st.dataframe(filtered_df)

После выбора категории таблица автоматически изменится. Именно в этот момент приложение начинает ощущаться как настоящий dashboard.

Multiselect — выбор нескольких значений

Но что делать, если пользователь хочет выбрать сразу несколько категорий?

Например:

  • Electronics;
  • Furniture.

Для этого существует multiselect.

categories = st.multiselect(
    "Выберите категории",
    df["category"].unique()
)

Теперь пользователь может выбрать несколько значений одновременно.

Фильтрация будет выглядеть так:

filtered_df = df[df["category"].isin(categories)]

Slider — работа с диапазонами

Очень часто в dashboards используются диапазоны:

  • цена;
  • возраст;
  • рейтинг;
  • количество заказов.

Для таких задач отлично подходит slider.

Например:

max_price = st.slider(
    "Максимальная цена",
    min_value=0,
    max_value=2000,
    value=1000
)

Теперь пользователь может двигать ползунок и изменять максимальную цену.

Фильтрация:

filtered_df = df[df["price"] <= max_price]

И снова таблица изменяется автоматически. Но slider умеет работать не только с одним значением, а ещё и с диапазоном. Это особенно удобно, когда нужно выбрать диапазон цен, возрастной интервал, минимальное и максимальное значение.

Например:

price_range = st.slider(
    "Диапазон цен",
    min_value=0,
    max_value=5000,
    value=(500, 2000)
)

Теперь в интерфейсе появятся сразу два ползунка: минимальное значение, максимальное значение. Важно понимать, что в этом случае slider возвращает не одно число, а кортеж из двух значений: (min_price, max_price). То есть переменная price_range будет содержать примерно такие данные: (500, 2000).

Чаще всего такой результат сразу распаковывают:

min_price, max_price = st.slider(
    "Диапазон цен",
    min_value=0,
    max_value=5000,
    value=(500, 2000)
)

После этого диапазон можно использовать в фильтрации:

filtered_df = df[
    (df["price"] >= min_price) &
    (df["price"] <= max_price)
]

Это один из самых популярных сценариев использования slider в аналитических dashboards, потому что пользователи почти всегда хотят гибко ограничивать диапазоны значений.

Checkbox — включение и отключение логики

Иногда пользователю нужно просто:

  • показать что-то;
  • скрыть что-то;
  • включить режим.

Для этого используется checkbox.

show_table = st.checkbox("Показать таблицу")

Теперь можно написать:

if show_table:
    st.dataframe(df)

Checkbox особенно полезен для:

  • скрытия блоков;
  • переключения режимов;
  • отображения дополнительных данных.

Radio — переключение режимов

radio похож на selectbox, но отображает варианты сразу на экране.

chart_type = st.radio(
    "Тип графика",
    ["Line", "Bar", "Pie"]
)

Такой подход часто используют для:

  • выбора режима отображения;
  • переключения между графиками;
  • настройки dashboard.

Date Input — работа с датами

Практически любой dashboard рано или поздно начинает работать с датами.

Streamlit позволяет очень легко добавить выбор даты:

selected_date = st.date_input(
    "Выберите дату"
)

После этого пользователь сможет выбрать дату прямо в интерфейсе приложения. Позже мы будем использовать даты для полноценной фильтрации данных по периодам.

Sidebar — боковая панель

Сейчас интерфейс начинает становиться довольно перегруженным. Если все filters размещать в основной части страницы, dashboard быстро превращается в хаос. Именно поэтому Streamlit предоставляет sidebar.

Например:

category = st.sidebar.selectbox(
    "Выберите категорию",
    df["category"].unique()
)

Теперь widget появится слева в боковой панели. И это уже выглядит намного профессиональнее. На практике большинство filters обычно выносят именно в sidebar.

Собираем первый интерактивный dashboard

Теперь объединим всё вместе.

import streamlit as st
import pandas as pd

df = pd.read_csv("sales.csv")

st.title("Dashboard продаж")

category = st.sidebar.selectbox(
    "Категория",
    df["category"].unique()
)

max_price = st.sidebar.slider(
    "Максимальная цена",
    0,
    2000,
    1000
)

filtered_df = df[
    (df["category"] == category)
    & (df["price"] <= max_price)
]

st.dataframe(filtered_df)

И вот теперь приложение начинает выглядеть как настоящий dashboard. Пользователь управляет фильтрами, изменяет данные на экране и взаимодействует с интерфейсом. Причём всё это написано исключительно на Python.

Наиболее частые ошибки

Пустой DataFrame после фильтрации

Очень частая ситуация — пользователь выбирает фильтры, после которых не остается ни одной строки.

Например:

  • слишком узкий диапазон цены;
  • категория без данных;
  • слишком строгие условия фильтрации.

В результате таблица становится пустой. Это не обязательно означает ошибку в коде — иногда просто нет данных, подходящих под выбранные условия.

Ошибка при использовании isin()

Новички часто пишут так:

df["category"] == categories

Но проблема в том, что categories — это список значений.

В таких случаях нужно использовать isin():

df["category"].isin(categories)

Именно isin() позволяет проверить, входит ли значение в список выбранных элементов.

Слишком много widgets в основной части страницы

Когда фильтров становится много, интерфейс начинает выглядеть перегруженным и неаккуратным.

Например:

  • несколько selectbox;
  • sliders;
  • checkboxes;
  • date_input;
  • multiselect.

Если все разместить в основной части страницы, dashboard становится неудобным. Поэтому элементы управления обычно переносят в sidebar.

Slider работает неправильно из-за типов данных

Иногда данные из CSV читаются не как числа, а как строки. Например "1200" вместо: 1200.

Из-за этого:

  • slider может работать некорректно;
  • фильтрация начинает вести себя странно;
  • сравнение значений перестает работать как ожидается.

В таких ситуациях нужно проверять типы данных в DataFrame и при необходимости преобразовывать их через astype() или pd.to_numeric().

Наиболее частые вопросы

  • Почему Streamlit сразу обновляет таблицу?
    Потому что Streamlit автоматически перезапускает приложение после изменения widget. Это одна из ключевых особенностей framework.
  • Можно ли использовать несколько filters одновременно?
    Да. Более того, именно так обычно и строятся dashboards.
  • Sidebar — обязательная часть dashboard?
    Нет. Но на практике это очень удобный способ организовать интерфейс.
  • Можно ли создавать собственные widgets?
    Да. Streamlit поддерживает кастомные компоненты, но это уже более продвинутая тема.

Итоги

Сегодня наше приложение перестало быть просто страницей с таблицей и превратилось в настоящий интерактивный dashboard. Мы познакомились с основными пользовательскими элементами Streamlit, научились создавать выпадающие списки, множественный выбор, ползунки, чекбоксы и элементы выбора даты. А затем связали всё это с Pandas и научились фильтровать DataFrame прямо во время работы приложения.

Кроме того, мы увидели, насколько удобно Streamlit позволяет строить интерфейсы. Буквально несколькими строками кода можно создать систему фильтрации, которая в других технологиях потребовала бы полноценной frontend-разработки.

На следующем уроке мы сделаем dashboard ещё интереснее: добавим графики, визуализацию и начнём превращать данные в полноценную аналитическую панель.

На следующий урок