Streamlit

Streamlit

Tutorial Streamlit: Introducción a Streamlit

Streamlit: Aprende qué es, cómo usarlo para crear apps interactivas en ciencia de datos y comparación con Dash y Flask.

Aprende Streamlit GRATIS y certifícate

Qué es Streamlit y para qué se usa en ciencia de datos

Streamlit es un framework de código abierto en Python que permite crear aplicaciones web interactivas de forma rápida y sencilla. Diseñado específicamente para el ámbito de la ciencia de datos, facilita la transformación de scripts de Python en aplicaciones web sin necesidad de conocimientos profundos de desarrollo web.

Una de las características clave de Streamlit es su simplicidad. Con unas pocas líneas de código, es posible construir interfaces de usuario interactivas que permiten a los usuarios explorar y visualizar datos de manera intuitiva.

En el contexto de la ciencia de datos, Streamlit se utiliza para crear aplicaciones que permiten la visualización de gráficas, la interacción con modelos de aprendizaje automático y la manipulación de datasets. Al ser una herramienta centrada en Python, se integra perfectamente con bibliotecas populares como NumPy, Pandas, Matplotlib y Scikit-learn, entre otras.

Streamlit simplifica el proceso de desarrollo al eliminar la necesidad de escribir código HTML, CSS o JavaScript. Esto permite a los científicos de datos enfocarse en su análisis en lugar de en el desarrollo web. Además, gracias a su arquitectura reactiva, las aplicaciones se actualizan automáticamente cuando el código cambia, facilitando la iteración y el prototipado rápido.

Otro uso destacado de Streamlit en ciencia de datos es la creación de dashboards interactivos. Estos dashboards pueden incluir elementos como filtros, controles deslizantes y entradas de texto, proporcionando una interfaz dinámica para analizar y presentar resultados. Esto es especialmente valioso para compartir insights con equipos no técnicos o para presentar resultados en entornos profesionales.

Streamlit también es muy útil para desplegar modelos de aprendizaje automático. Permite construir interfaces para cargar datos, ajustar parámetros y mostrar predicciones en tiempo real. Esto facilita la demostración y validación de modelos ante partes interesadas, sin necesidad de implementar soluciones más complejas.

Arquitectura de Streamlit y ciclo de vida de aplicaciones Streamlit

Streamlit es un framework que se basa en un modelo de ejecución reactivo y declarativo, lo que facilita la creación de aplicaciones web interactivas directamente desde scripts de Python. La arquitectura de Streamlit se centra en simplificar el proceso de desarrollo, permitiendo que el código se ejecute de manera lineal y se actualice automáticamente en respuesta a la interacción del usuario.

En el núcleo de Streamlit, cada vez que se ejecuta una aplicación, el script de Python se interpreta de principio a fin. Los widgets de interacción, como botones y selectores, desencadenan eventos que hacen que el script se vuelva a ejecutar. Esta re-ejecución garantiza que la interfaz esté siempre sincronizada con el estado actual de los datos y las entradas del usuario.

Ciclo de vida de una aplicación Streamlit

El ciclo de vida de una aplicación en Streamlit consta de varias fases clave:

Inicialización: Cuando se inicia la aplicación, Streamlit ejecuta el script completo para renderizar la interfaz inicial. Todos los componentes y widgets definidos se muestran en la interfaz del usuario.

Interacción del usuario: El usuario interactúa con la aplicación a través de los widgets, modificando valores o seleccionando opciones. Por ejemplo, al mover un slider o introducir texto en un campo de entrada.

Detección de cambios: Streamlit detecta cualquier cambio en el estado de los widgets. Cada interacción se considera un evento que indica que el estado de la aplicación ha cambiado.

Re-ejecución del script: Tras detectar un cambio, Streamlit vuelve a ejecutar el script desde el principio. Durante esta re-ejecución, se tienen en cuenta los nuevos valores de los widgets, lo que permite que la aplicación responda dinámicamente a las entradas del usuario.

Actualización de la interfaz: Los resultados de la re-ejecución se reflejan en la interfaz de usuario. Solo los componentes que han cambiado se actualizan, optimizando el rendimiento.

Este ciclo se repite cada vez que el usuario interactúa con la aplicación, creando una experiencia fluida y reactiva.

Arquitectura cliente-servidor

Streamlit sigue una arquitectura cliente-servidor. El script de Python actúa como el servidor, ejecutándose en el backend, mientras que la interfaz en el navegador es el cliente. La comunicación entre ambos se gestiona automáticamente, y las actualizaciones se transmiten de forma eficiente mediante websockets.

Esta arquitectura permite que el código Python permanezca en el servidor, manteniendo la seguridad de la aplicación y evitando la exposición de lógica sensible en el lado del cliente. Además, facilita el despliegue de aplicaciones en entornos compartidos o en la nube.

Flujo de datos unidireccional

El flujo de datos en Streamlit es unidireccional, desde el script hacia la interfaz. Cada ejecución del script genera un nuevo estado de la interfaz, basado en las entradas actuales. No hay bucles de retroalimentación complicados, lo que simplifica el razonamiento sobre el estado de la aplicación y facilita la depuración.

Instalación y configuración de Streamlit

Para comenzar a desarrollar aplicaciones con Streamlit, es necesario realizar su instalación y configuración en tu entorno de trabajo. A continuación, se detallan los pasos para instalar Streamlit y asegurarse de que todo esté listo para crear aplicaciones interactivas.

Requisitos previos

Antes de instalar Streamlit, es esencial contar con una versión de Python instalada en el sistema. Se recomienda utilizar Python 3.8 o superior para garantizar la compatibilidad con las últimas funcionalidades de Streamlit.

Crear un entorno usando venv

  • Abre una terminal y navega a la carpeta de tu proyecto.
cd myproject
  • En tu terminal, escribe:
python -m venv .venv

Aparecerá una carpeta llamada “.venv” en tu proyecto. Este directorio es donde se instalará tu entorno virtual y sus dependencias.

Activar tu entorno

  • En tu terminal, activa tu entorno con uno de los siguientes comandos, dependiendo de tu sistema operativo.
# Símbolo del sistema de Windows
 .venv\Scripts\activate.bat

# PowerShell de Windows
.venv\Scripts\Activate.ps1

# macOS y Linux
source .venv/bin/activate

Una vez activado, verás el nombre de tu entorno entre paréntesis antes del prompt. “(.venv)”

Instalación de Streamlit

Con el entorno virtual activado, puedes instalar Streamlit utilizando pip, el gestor de paquetes de Python. Ejecuta el siguiente comando para instalar la versión específica de Streamlit:

pip install streamlit

Este comando descargará e instalará Streamlit y sus dependencias.

Verificación de la instalación

Para confirmar que la instalación se ha realizado correctamente, puedes verificar la versión instalada ejecutando:

streamlit --version

El resultado debería mostrar:

Streamlit, version 1.xx.x

Si aparece la versión correcta, significa que Streamlit se ha instalado exitosamente en tu entorno.

Configuración inicial (Opcional)

Streamlit cuenta con opciones de configuración que permiten personalizar ciertos aspectos de su comportamiento. Estos ajustes se definen en un archivo llamado config.toml, ubicado en la carpeta ~/.streamlit/ de tu directorio de usuario.

Puedes crear este archivo con uno de los siguientes comandos, dependiendo de tu sistema operativo:

# Símbolo del sistema de Windows
echo "" > config.toml

# PowerShell de Windows
New-Item -Path . -Name "config.toml" -ItemType "File"

# macOS y Linux
touch config.toml

Dentro del archivo config.toml, puedes establecer configuraciones como el puerto predeterminado, si se debe abrir el navegador automáticamente al ejecutar una aplicación, entre otros. Por ejemplo:

[server]
headless = true
port = 8501

Ejecutar una aplicación de prueba

Para comprobar que todo funciona correctamente, crea un archivo llamado app.py con el siguiente contenido:

import streamlit as st

st.title('Verificación de instalación')
st.write('¡Streamlit está funcionando correctamente!')

Guarda el archivo y ejecuta la aplicación con el comando:

streamlit run app.py

Al ejecutar este comando, Streamlit iniciará un servidor local y abrirá la aplicación en tu navegador predeterminado. Deberías ver un título y un mensaje confirmando que Streamlit está funcionando.

Para detener el servidor de Streamlit, presiona Ctrl+C en la terminal.

Cuando hayas terminado de usar este entorno, vuelve a tu shell normal escribiendo:

deactivate

Consideraciones adicionales

Actualizaciones: Para mantener tu instalación de Streamlit actualizada, puedes utilizar pip install --upgrade streamlit. Sin embargo, ten en cuenta que si deseas mantenerte en una versión específica, no deberías actualizar sin revisar los cambios.

Dependencias: Si en tu proyecto utilizas otras bibliotecas como NumPy, Pandas o Matplotlib, recuerda instalarlas dentro del mismo entorno virtual para garantizar la compatibilidad.

Resolución de problemas: Si encuentras problemas durante la instalación, verifica que estás utilizando la versión correcta de Python y que tu gestor de paquetes pip está actualizado (pip install --upgrade pip).

Si el comando streamlit run no funciona, usa el siguiente comando:

python -m streamlit run app.py

Configuración de variables de entorno

En algunos casos, puede ser necesario establecer variables de entorno para configurar aspectos específicos de Streamlit, como claves de API o configuraciones de seguridad. Puedes utilizar el módulo os de Python para acceder a estas variables dentro de tu aplicación:

import os

api_key = os.environ.get('API_KEY')
st.write(f'La clave de API es: {api_key}')

Asegúrate de definir las variables de entorno en tu sistema o a través de un archivo .env si utilizas paquetes como python-dotenv.

Primeros pasos, estructura de un archivo streamlit_app.py

Una vez que tienes Streamlit instalado y configurado, es momento de crear tu primera aplicación. El corazón de cualquier aplicación en Streamlit es un archivo Python, comúnmente llamado streamlit_app.py. Este archivo contiene el código que define la interfaz y la funcionalidad de tu aplicación.

Para empezar, crea un nuevo archivo llamado streamlit_app.py en el directorio de tu proyecto. Abre este archivo en tu editor de código preferido y sigue los siguientes pasos para construir la estructura básica de una aplicación en Streamlit.

Importación del módulo Streamlit

El primer paso es importar el módulo Streamlit en tu script. Esto se hace con la siguiente línea de código:

import streamlit as st

La convención es importar Streamlit utilizando el alias st para simplificar el uso de sus funciones en el código.

Añadir un título y un encabezado

Puedes comenzar añadiendo un título y un encabezado a tu aplicación para definir su propósito. Utiliza las funciones st.title() y st.header() para ello:

st.title('Mi Primera Aplicación en Streamlit')
st.header('Introducción')

La función st.title() muestra un texto de gran tamaño como título, mientras que st.header() muestra un encabezado ligeramente más pequeño.

Incluir texto y contenido descriptivo

Para añadir contenido descriptivo o instrucciones, utiliza la función st.write(). Esta función es versátil y permite mostrar texto, variables, y resultados de expresiones:

st.write('Esta es una aplicación de ejemplo para demostrar la estructura básica de un archivo **streamlit_app.py**.')

Agregar widgets interactivos

Streamlit proporciona una variedad de widgets que permiten la interacción del usuario. Por ejemplo, puedes añadir un slider para que el usuario seleccione un valor numérico:

valor = st.slider('Selecciona un valor', min_value=0, max_value=100, value=50)
st.write(f'El valor seleccionado es {valor}.')

En este caso, st.slider() crea un slider de 0 a 100, inicializado en 50. El valor seleccionado por el usuario se almacena en la variable **valor**.

Mostrar gráficos y visualizaciones

Para incluir gráficos, puedes utilizar bibliotecas como Matplotlib o Seaborn, y mostrarlos en tu aplicación con st.pyplot(). Por ejemplo:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y = np.sin(x)

fig, ax = plt.subplots()
ax.plot(x, y)

st.pyplot(fig)

Este código genera un gráfico de una función seno utilizando Matplotlib y lo muestra en la aplicación con st.pyplot().

Estructura general del archivo

Una buena práctica es organizar tu código en funciones para mejorar la legibilidad y mantenibilidad. Por ejemplo:

def main():
    st.title('Mi Primera Aplicación en Streamlit')
    st.header('Introducción')
    st.write('Esta es una aplicación de ejemplo para demostrar la estructura básica de un archivo **streamlit_app.py**.')

    valor = st.slider('Selecciona un valor', min_value=0, max_value=100, value=50)
    st.write(f'El valor seleccionado es {valor}.')

    mostrar_grafico()

def mostrar_grafico():
    x = np.linspace(0, 10, 100)
    y = np.sin(x)

    fig, ax = plt.subplots()
    ax.plot(x, y)

    st.pyplot(fig)

if __name__ == '__main__':
    main()

En este ejemplo, la función main() contiene la lógica principal de la aplicación, y mostrar_grafico() es una función separada para generar y mostrar el gráfico.

Ejecutar la aplicación

Para ejecutar tu aplicación, utiliza el comando:

streamlit run streamlit_app.py

Este comando iniciará el servidor de Streamlit y abrirá la aplicación en tu navegador predeterminado.

Consideraciones sobre el flujo de ejecución

Es importante recordar que Streamlit ejecuta el archivo streamlit_app.py de arriba a abajo cada vez que detecta una interacción del usuario. Por lo tanto, debes tener cuidado con el uso de operaciones costosas en términos de tiempo de ejecución, y aprovechar el decorador @st.cache_data para almacenar en caché resultados de funciones que no cambian con frecuencia.

Por ejemplo:

@st.cache_data
def cargar_datos():
    # Simula una carga de datos pesada
    datos = np.random.randn(1000)
    return datos

datos = cargar_datos()
st.write('Datos cargados con éxito.')

Al utilizar @st.cache_data, evitas que la función cargar_datos() se ejecute en cada interacción, mejorando la eficiencia de la aplicación.

Interactividad y actualizaciones

Los widgets como sliders, botones y selectores permiten que la aplicación responda a las entradas del usuario en tiempo real. Por ejemplo, puedes crear una gráfica que se actualice según el valor seleccionado en un slider:

frecuencia = st.slider('Selecciona la frecuencia', min_value=1, max_value=10, value=1)

x = np.linspace(0, 10, 100)
y = np.sin(frecuencia * x)

fig, ax = plt.subplots()
ax.plot(x, y)

st.pyplot(fig)

En este código, el valor de **frecuencia** obtenido del slider se utiliza para modificar la gráfica generada.

Comentarios y documentación

Es recomendable incluir comentarios y documentación en tu código para facilitar su comprensión y mantenimiento. Los comentarios se añaden utilizando el símbolo #:

# Importar las bibliotecas necesarias
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt

Estructura de carpetas y recursos adicionales

Si tu aplicación utiliza recursos adicionales como datos, imágenes o archivos, es importante organizar tu proyecto en carpetas. Por ejemplo:

mi_proyecto/
├── streamlit_app.py
├── data/
│   └── datos.csv
├── images/
│   └── logo.png

En tu código, puedes acceder a estos recursos utilizando rutas relativas.

Con los elementos anteriores, tienes la estructura básica de un archivo streamlit_app.py y los conocimientos necesarios para empezar a crear aplicaciones interactivas con Streamlit. A medida que avances, podrás explorar más funcionalidades y construir aplicaciones más complejas que aprovechen al máximo las capacidades de esta herramienta.

Comparación con otros frameworks como Dash y Flask

Al desarrollar aplicaciones web para ciencia de datos, es común considerar frameworks como Streamlit, Dash y Flask. Aunque los tres permiten crear interfaces web utilizando Python, presentan diferencias significativas en cuanto a su enfoque, facilidad de uso y capacidades específicas.

Streamlit se destaca por su simplicidad y enfoque directo en la creación de aplicaciones interactivas para ciencia de datos. Fue diseñado pensando en científicos de datos, permitiendo construir aplicaciones sin necesidad de conocimientos profundos de desarrollo web. Con Streamlit, estructuras tu aplicación de forma declarativa, y la interfaz se actualiza automáticamente en respuesta a cambios en los datos o las interacciones del usuario.

Por otro lado, Dash, desarrollado por Plotly, es un framework también orientado a construir aplicaciones web interactivas para análisis y visualización de datos. Dash combina Flask, React.js y Plotly.js, proporcionando más control sobre el layout y los componentes personalizados. Sin embargo, este mayor control viene con una mayor complejidad; es necesario familiarizarse con conceptos de desarrollo web como callbacks y estructuras de aplicación más detalladas.

Flask es un microframework web minimalista que proporciona las herramientas básicas para construir aplicaciones web en Python. A diferencia de Streamlit y Dash, Flask no está orientado específicamente a la ciencia de datos ni incluye componentes de interfaz de usuario predefinidos. Requiere que el desarrollador construya la estructura de la aplicación y defina rutas, templates y manejo de estado, generalmente utilizando HTML, CSS y JavaScript para la interfaz de usuario.

Facilidad de uso y prototipado rápido

Streamlit permite crear aplicaciones funcionales con muy poco código. Por ejemplo, para mostrar un dataframe de Pandas, solo necesitas:

import streamlit as st
import pandas as pd

df = pd.read_csv('datos.csv')
st.dataframe(df)

Esta sencillez lo convierte en una herramienta ideal para prototipado rápido y compartir resultados de análisis con colegas no técnicos.

En contraposición, en Dash, mostrar un dataframe implicaría definir un layout y callbacks, lo que añade complejidad:

import dash
from dash import Dash, html
import dash_table
import pandas as pd

app = Dash(__name__)

df = pd.read_csv('datos.csv')

app.layout = html.Div([
    dash_table.DataTable(
        data=df.to_dict('records'),
        columns=[{'name': i, 'id': i} for i in df.columns]
    )
])

if __name__ == '__main__':
    app.run_server(debug=True)

Aunque Dash proporciona más flexibilidad, requiere mayor esfuerzo inicial para desarrollar funcionalidades equivalentes.

Con Flask, la complejidad aumenta, ya que necesitarías gestionar rutas y renderizar templates manualmente:

from flask import Flask, render_template
import pandas as pd

app = Flask(__name__)

@app.route('/')
def mostrar_tabla():
    df = pd.read_csv('datos.csv')
    return render_template('tabla.html', tables=[df.to_html(classes='data')], titles=df.columns.values)

if __name__ == '__main__':
    app.run(debug=True)

Además, debes crear un archivo HTML (tabla.html) para renderizar el dataframe, lo cual implica manejar plantillas y posiblemente estilos CSS.

Personalización y control de la interfaz

Dash ofrece más opciones de personalización que Streamlit. Al estar construido sobre React.js, permite crear componentes personalizados e integrar elementos interactivos avanzados. Esto es útil cuando se requiere un alto grado de control sobre la interfaz y la experiencia del usuario.

Por su parte, Streamlit cuenta con una variedad de widgets y componentes predefinidos, pero es menos flexible en términos de personalización profunda. Aunque soporta la inyección de HTML y el uso de estilos con CSS, estas funcionalidades son limitadas en comparación con Dash.

Con Flask, tienes control total sobre la interfaz, ya que tú defines completamente las plantillas HTML y puedes integrar cualquier biblioteca de frontend. Esta libertad viene a costa de requerir conocimientos en tecnologías web adicionales y más tiempo de desarrollo para implementar las funcionalidades deseadas.

Escalabilidad y despliegue

En términos de despliegue en entornos de producción, Flask es el más adecuado debido a su madurez y flexibilidad. Es comúnmente utilizado para desarrollar aplicaciones web completas y APIs, y se integra bien con servidores web como Gunicorn y Nginx.

Dash y Streamlit también pueden desplegarse en producción, pero están más orientados a aplicaciones de análisis y visualización dentro de entornos empresariales o de investigación. Ambos proporcionan opciones para despliegue en la nube, y existen servicios como Heroku o Streamlit Cloud que facilitan este proceso.

Sin embargo, para aplicaciones que requieren una arquitectura más compleja, autenticación de usuarios, bases de datos, etc., Flask ofrece más herramientas y una comunidad más amplia en cuanto a extensiones y soporte.

Integración con bibliotecas científicas

Streamlit y Dash están diseñados para integrarse de manera efectiva con bibliotecas de ciencia de datos como NumPy, Pandas y librerías de visualización como Matplotlib y Plotly. Streamlit facilita la visualización de gráficos y datos con funciones integradas como st.line_chart() o st.map().

Dash, al ser desarrollado por los creadores de Plotly, tiene una integración muy fuerte con gráficos interactivos avanzados. Permite crear visualizaciones complejas y altamente personalizables utilizando Plotly Express y componentes de Dash.

Flask, al no estar enfocado en la ciencia de datos, no proporciona integraciones nativas con estas bibliotecas. Deberás implementar manualmente las visualizaciones y manejar la comunicación entre el backend y el frontend, lo que puede incrementar la complejidad del desarrollo.

Gestión del estado y reactividad

En Streamlit, la reactividad es automática. Cada interacción del usuario provoca la re-ejecución del script, actualizando la interfaz según el nuevo estado. Streamlit maneja el estado de los widgets y facilita la creación de aplicaciones interactivas sin necesidad de gestionar manualmente callbacks.

En Dash, la gestión del estado se realiza mediante callbacks explícitos que conectan los componentes de entrada y salida. Aunque esto ofrece más control, también requiere más código y comprensión de cómo se propagan los eventos en la aplicación.

En Flask, la gestión del estado es totalmente manual. Deberás implementar mecanismos para manejar sesiones, almacenar datos entre solicitudes y actualizar la interfaz en respuesta a las acciones del usuario, generalmente utilizando JavaScript y tecnologías del lado del cliente.

Casos de uso ideales

Streamlit es ideal para crear prototipos rápidos, dashboards y aplicaciones de ciencia de datos que necesitan ser desarrolladas rápidamente y compartidas con facilidad. Es perfecto para demostraciones y aplicaciones internas.

Dash es adecuado cuando se requiere una aplicación más personalizada, con una interfaz rica y componentes interactivos avanzados. Es útil para aplicaciones enfocadas en visualización de datos compleja y cuando se necesita más control sobre el comportamiento de la aplicación.

Flask es la mejor opción para desarrollar aplicaciones web completas, con múltiples rutas, autenticación, integración de bases de datos y lógica de negocio más elaborada. Es preferible cuando estás construyendo una aplicación que va más allá de visualizaciones y análisis de datos.

Para seguir leyendo hazte Plus

¿Ya eres Plus? Accede a la app

Plan mensual

19.00 € /mes

Precio normal mensual: 19 €
47 % DE DESCUENTO

Plan anual

10.00 € /mes

Ahorras 108 € al año
Precio normal anual: 120 €
Aprende Streamlit GRATIS online

Todas las lecciones de Streamlit

Accede a todas las lecciones de Streamlit y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Streamlit y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender qué es Streamlit y su objetivo principal.
  • Aprender a transformar scripts de Python en aplicaciones web interactivas.
  • Manejar la arquitectura de Streamlit y su ciclo de vida de aplicaciones.
  • Implementar widgets y gestionar el estado de la aplicación.
  • Comparar Streamlit con otros frameworks como Dash y Flask.
  • Configurar e instalar Streamlit en diferentes entornos.