R Shiny скоро будет доступна для Python

Она пополнит ряды полезных веб-приложений, таких как Streamlit и Dash

Компания RStudio недавно объявила, что собирается поменять название на Posit, что можно перевести примерно как “предложения идей или теорий” (proposing an idea or theory). Этот шаг явяется наглядной иллюстрацией планов по расширению деятельности компании, которая не хочет ограничиваться языком R. Поэтому она планирует добавить поддержку Python, а также интеграцию с Visual Studio Code. Однако пользователям языка R не о чем беспокоиться – компания не переходит с R на Python, и IDE RStudio не будет переименована. Речь идет лишь о расширении экосистемы для сферы “науки о данных”.

Одновременно руководство Posit объявило о релизе версии Shiny для Python. Я на 100% уверен, что R Shiny не нуждается в представлении. Но если вдруг кто-то не в курсе, это фреймворк, который позволяет дата-сайентистам создавать интерактивные веб-приложения прямо с помощью языка R, без всяких знаний в области веб-разработки.

Фреймворк R Shiny появился 10 лет, и с тех пор широко распространился в сообществе. Теперь мы также сможем использовать его с языком Python. В настоящее время версия Shiny для Python на стадии альфа-тестирования, и в ближайшие месяцы следует ждать новостей. Попробовать и посмотреть, как она работает, можно уже сейчас.

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

##Shiny для Python Как обычно, первым делом необходимо установить библиотеку. Для этого используем pip:

pip install shiny

Далее нам нужно создать каталог, например:

mkdir python_shiny_example
cd python_shiny_example

Войдя в созданный каталог, выполняем следующую команду:

shiny create .

При этом генерируется файл app.py с простым демонстрационным образцом приложения. Приведённый ниже сниппет содержит код этого образца:

from shiny import App, render, ui

app_ui = ui.page_fluid(
    ui.h2("Hello Shiny!"),
    ui.input_slider("n", "N", 0, 100, 20),
    ui.output_text_verbatim("txt"),
)

def server(input, output, session):
    @output
    @render.text
    def txt():
        return f"n*2 is {input.n() * 2}"

app = App(app_ui, server)

Чтобы запустить приложение, нужно ввести в терминале следующую команду:

shiny run --reload app.py

С целью повышения удобства пользователей и ещё большего упрощения разработки приложений Posit предлагает расширение для редактора VS Code. Благодаря этому расширению вы можете сосредоточиться на разработке приложения, не покидая IDE. Когда вы его установите, запустить приложение в VS Code можно будет с помощью кнопки play (или run). На иллюстрации ниже показано, как выглядит демонстрационный пример приложения при запуске в VS Code.

Создаём собственное простое приложение

Итак, демонстрационный образец мы уже видели, теперь пришло время создать что-то самостоятельно. Давайте напишем очень простой трекер цен на акции. Котировки акций в качестве входных данных были выбраны в том числе и потому, что эти данные можно загружать на лету (подробнее об этом написано здесь). Помимо прочего, этот выбор позволяет показать вам различные виды входных данных для приложения.

В следующем сниппете находится код нашего приложения:

from shiny import App, render, ui
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

app_ui = ui.page_fluid(
    ui.h2("Stock price tracker"),
    ui.layout_sidebar(
        ui.panel_sidebar(
            ui.input_select(
                "ticker", 
                "Select stock:", {"TSLA": "Tesla", 
                                  "AAPL": "Apple"}
            ),
            ui.input_date_range(
                "date_range", 
                "Date range input"
            ),
        ),
        ui.panel_main(
            ui.output_plot("plot"),
        ),
    ),
)

def server(input, output, session):
    @output
    @render.plot(alt="Stock price over time")
    def plot():
        
        df = yf.download(input.ticker(), 
                         start=input.date_range()[0], 
                         end=input.date_range()[1], 
                         progress=False)

        fig, ax = plt.subplots()
        df["Close"].plot(title=f"{input.ticker()} - Stock price history", ax=ax)
        
        return fig

app = App(app_ui, server)

Несколько слов о том, что здесь изменилось по сравнению с демонстрационным образцом. Первым делом рассмотрим изменения по США. Для этого приложения мы используем раскладку страницы в виде панели с сайдбаром. В сайдбаре мы просим пользователя ввести данные, состоящие из двух частей:

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

На главной панели создаётся простой график с изменениями цены закрытия. В этом же разделе есть возможность распечатать загруженный датафрейм с данными о ценах и т.д.

В коде серверной части мы определяем вспомогательную функцию, которая будет загружать цены нужных нам акций, используя данные, введённые в сайдбаре. Далее в этой функции создаётся простой график временных рядов с помощью метода plot для датафрейма pandas.

Результат выглядит следующим образом:

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

Пара мыслей

Мне очень интересно, как будет продвигаться разработка Shiny для Python, а также как его примут люди. В настоящее время самые популярные фреймворки для веб-приложений на Python – это Streamlit и Dash. Сможет ли Shiny отобрать у них часть пользовательской базы? Время покажет.

Команда Posit предлагает возможность лёгкой интеграции со своей платформой Connect, что упростит развертывание приложений на Shiny. Это может стать тем самым преимуществом, которое склонит чашу весов в сторону Shiny и повысит его популярность среди пользователей.

Лично меня эта новость очень радует, так как я написал довольно много приложений с использованием Shiny на R. Я также видел, что разработчики R Shiny прикладывают огромное количество усилий, чтобы создать полноценный портал для различных задач, связанных с данными, которым смогут пользоваться люди без технических знаний. Для разработки такого инструмента надо приложить довольно много усилий, и, на мой взгляд, создать что-то настолько же сложное в Streamlit будет намного труднее.

Интересный факт: В разделе примеров на веб-сайте Shiny for Python есть копия популярной браузерной игры Wordle. Рекомендую посмотреть на неё, просто чтобы знать, насколько универсальным может быть этот фреймворк.

Что по итогу?

  • Компания Posit (в прошлом RStudio) недавно выпустила версию своего фреймворка Shiny для языка программирования Python,
  • Используя Shiny для Python, специалисты по обработке данных могут создавать сложные и интерактивные веб-приложения, даже не имея знаний в области веб-разработки,
  • Вы можете проводить эксперименты по созданию простых приложений не устанавливая ничего локально с помощью онлайн-среды Shiny,
  • На данный момент библиотека Shiny находится на стадии альфа-версии, так что использовать её для создания готовых к работе приложений мы сможем только спустя некоторое время.

Весь код, используемый для этой статьи, выложен у автора в GitHub. Было бы любопытно услышать, что вы думаете о разработке фреймворка Shiny для пользователей Python! Обязательно расскажите об этом в комментариях или в Твиттере.

https://medium.com/towards-data-science/r-shiny-is-coming-to-python-1653bbe231ac

Written on December 28, 2022