Streamlit

Curso de programación con Streamlit

Streamlit permite crear aplicaciones web orientadas a ciencia de datos y machine learning con Python e Interfaz de usuario nativa sin necesidad de HTML.

Aprende Streamlit GRATIS y certifícate

Streamlit es un framework de Python que permite crear aplicaciones web interactivas de manera sencilla y rápida, enfocándose principalmente en la visualización y manipulación de datos, así como en la construcción de prototipos de herramientas de machine learning y data science.

La idea principal de Streamlit es que puedas centrarte en escribir código Python y, sin necesidad de aprender HTML, CSS o JavaScript, obtengas una aplicación web lista para compartir con otros.


2. Instalación y primeros pasos

2.1 Instalación

La instalación de Streamlit se realiza, generalmente, a través de pip:

pip install streamlit

También es posible instalarlo con conda si usas Anaconda o Miniconda:

conda install -c conda-forge streamlit

2.2 Estructura básica de un script con Streamlit

Para empezar, creas un archivo Python, por ejemplo app.py, con el siguiente contenido:

import streamlit as st

st.title("Hola, Streamlit!")
st.write("Mi primera aplicación con Streamlit.")

2.3 Ejecutar la aplicación

Para arrancar el servidor local de Streamlit y ver tu aplicación en el navegador, escribe en la terminal:

streamlit run app.py

Automáticamente se abrirá una ventana de tu navegador en la dirección http://localhost:8501, donde verás tu aplicación en acción.


3. Fundamentos de la interfaz en Streamlit

Streamlit proporciona una serie de elementos y widgets para crear interfaces interactivas de forma muy sencilla. Sus funciones se dividen en varias categorías:

  1. Texto y cabeceras
  2. Widgets de entrada y selección
  3. Gráficos y visualizaciones
  4. Disposición y organización
  5. Interactividad avanzada y estado de sesión

3.1 Mostrar texto y encabezados

  • st.title("Título")
  • st.header("Encabezado")
  • st.subheader("Subencabezado")
  • st.write("Texto genérico"): La función más genérica para mostrar texto o incluso valores de variables.

Ejemplo:

st.title("Mi Aplicación de Análisis de Datos")
st.header("Introducción")
st.write("Esta es la introducción a mi aplicación...")

3.2 Widgets de entrada

Streamlit ofrece varios widgets para capturar datos de usuarios:

  • st.button("Haz clic")
  • st.checkbox("Marca esta casilla")
  • st.radio("Elige una opción", ["Opción A", "Opción B"])
  • st.selectbox("Desplegable", ["Elemento 1", "Elemento 2"])
  • st.multiselect("Selecciona uno o más", ["Elemento 1", "Elemento 2", "Elemento 3"])
  • st.slider("Escoge un valor", 0, 100, 50)
  • st.text_input("Introduce texto")
  • st.number_input("Introduce un número")
  • st.date_input("Selecciona una fecha")
  • st.file_uploader("Sube un archivo")

Ejemplo:

nombre = st.text_input("Ingresa tu nombre")
if st.button("Saludar"):
    st.write(f"¡Hola, {nombre}!")

3.3 Visualización de datos y gráficos

Streamlit se integra fácilmente con librerías de gráficos de Python como Matplotlib, Plotly, Altair, Bokeh o Seaborn. Normalmente, tras generar la figura, basta con pasarla a una función de Streamlit para mostrarla:

import plotly.express as px
import pandas as pd

df = pd.DataFrame({
    "x": [1, 2, 3, 4],
    "y": [10, 30, 20, 40]
})

fig = px.line(df, x="x", y="y", title="Ejemplo Plotly")
st.plotly_chart(fig)

Para tablas de datos, podemos usar:

  • st.table(df) para mostrar una tabla estática.
  • st.dataframe(df) para mostrar una tabla interactiva (ordenar columnas, etc.).

3.4 Disposición y organización

Para ordenar la interfaz, Streamlit ofrece:

  • Layouts con columnas: st.columns(n) para crear múltiples columnas en la misma fila.
  • Expanders: st.expander("Título del expander") para mostrar u ocultar secciones.
  • Tabs: st.tabs(["Tab 1", "Tab 2"]) para agrupar contenido en pestañas.
  • Sidebar: st.sidebar.* para colocar widgets en una barra lateral.

Ejemplo:

col1, col2 = st.columns(2)
with col1:
    st.write("Contenido de la primera columna")
with col2:
    st.write("Contenido de la segunda columna")

3.5 Interactividad avanzada con st.session_state

Para almacenar y compartir datos entre widgets o partes de la aplicación (sin perder la información cuando el script se vuelve a ejecutar), puedes usar la variable st.session_state:

if "contador" not in st.session_state:
    st.session_state.contador = 0

if st.button("Incrementar"):
    st.session_state.contador += 1

st.write(f"Valor del contador: {st.session_state.contador}")

Esto es muy útil para construir flujos más complejos y mantener valores a lo largo de la sesión del usuario.


4. Flujo de ejecución en Streamlit

Un punto clave de Streamlit es entender que el código se ejecuta de arriba a abajo cada vez que el usuario interactúa con un widget. Esto significa que:

  1. El script se ejecuta por completo al cargar la página por primera vez.
  2. Cada vez que el usuario interactúa (por ejemplo, hace clic en un botón), el script vuelve a ejecutarse de arriba a abajo.
  3. Hay que tener en cuenta la forma de conservar estados (usando st.session_state) y la organización del código para que la aplicación sea eficiente y no recargue datos innecesariamente.

5. Mecanismos de optimización y rendimiento

5.1 Caché con @st.cache_data (antes @st.cache)

Para evitar repetir operaciones costosas (por ejemplo, cargar datos desde un archivo o realizar consultas largas), podemos usar la función de caché. En versiones recientes de Streamlit, se introducen decoradores como @st.cache_data y @st.cache_resource.

import time

@st.cache_data
def cargar_datos_simulado():
    time.sleep(5)  # Simula una carga costosa
    return [1, 2, 3, 4, 5]

datos = cargar_datos_simulado()
st.write(datos)

La primera vez que se ejecuta la función, tardará 5 segundos. Las siguientes llamadas la obtendrán de la caché, acelerando el proceso.

5.2 Control de reruns y eventos

A veces, querrás controlar cuándo se recarga la aplicación. Además del flujo normal, hay formas más avanzadas de gestionar eventos. Por ejemplo, con el parámetro on_change en los widgets para ejecutar acciones específicas cuando un valor cambia.


6. Integración con librerías de Machine Learning y Data Science

Streamlit se integra perfectamente con librerías como Pandas, NumPy, Scikit-learn, TensorFlow, PyTorch, etc. Un típico flujo de trabajo de data science podría ser:

  1. Cargar datos con pandas.
  2. Limpiar y procesar los datos.
  3. Construir un modelo con Scikit-learn.
  4. Hacer predicciones y visualizarlas en la app.

Ejemplo sencillo:

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier

st.title("Clasificador de Iris")

iris = load_iris()
X = iris.data
y = iris.target

clf = RandomForestClassifier()
clf.fit(X, y)

sep_len = st.slider("Sepal length", 4.0, 8.0, 5.0)
sep_wid = st.slider("Sepal width", 2.0, 4.5, 3.0)
pet_len = st.slider("Petal length", 1.0, 7.0, 1.5)
pet_wid = st.slider("Petal width", 0.1, 2.5, 0.2)

prediccion = clf.predict([[sep_len, sep_wid, pet_len, pet_wid]])
st.write(f"La especie predicha es: {iris.target_names[prediccion][0]}")

7. Personalización y temas en Streamlit

7.1 Configuración de temas

En el archivo ~/.streamlit/config.toml (o dentro de la carpeta de tu proyecto en .streamlit/config.toml), puedes personalizar elementos como el tema, color primario, fuente, etc.

Ejemplo de archivo config.toml:

[theme]
primaryColor = "#F39C12"
backgroundColor = "#1F2C56"
secondaryBackgroundColor = "#2E4057"
textColor = "#FFFFFF"
font = "sans serif"

7.2 Modo oscuro

También puedes activar el modo oscuro o claro directamente:

[theme]
base = "dark"  # o "light"

8. Control avanzado de la aplicación

8.1 Navegación con multipáginas

Streamlit permite crear aplicaciones multipágina. Simplemente coloca cada página como un archivo Python en una carpeta pages dentro de tu proyecto. Por ejemplo:

app.py
pages/
    1_PáginaUno.py
    2_PáginaDos.py

Cuando ejecutes streamlit run app.py, Streamlit detectará automáticamente esas páginas y mostrará un menú de navegación.

8.2 Callbacks y eventos

Algunos widgets como st.text_input o st.slider permiten definir la opción on_change para disparar una función cada vez que cambia el valor del widget, evitando que tengas que evaluar todo el script constantemente. Por ejemplo:

def actualizar():
    st.session_state.resultado = st.session_state.input_texto.upper()

st.text_input("Escribe algo", key="input_texto", on_change=actualizar)
if "resultado" in st.session_state:
    st.write(st.session_state.resultado)

9. Compartir y desplegar aplicaciones Streamlit

9.1 Streamlit Community Cloud (antes llamado Streamlit Sharing)

Streamlit ofrece un servicio gratuito de despliegue en la nube (aunque con ciertas limitaciones). Basta con tener el proyecto en un repositorio de GitHub y conectarlo con tu cuenta de Streamlit. De este modo obtendrás una URL pública para tu aplicación.

9.2 Despliegue en otras plataformas

Existen varias maneras de desplegar aplicaciones de Streamlit:

  1. Heroku: Subiendo tu app con un Procfile y requisitos en requirements.txt.
  2. AWS, GCP o Azure: Configurando un contenedor Docker y lanzándolo en un servicio como AWS ECS/EKS o Google Cloud Run.
  3. Plataformas como Railway, Render, etc.: Configuraciones similares a Heroku.

Ejemplo de Procfile para Heroku:

web: streamlit run app.py --server.port=$PORT --server.address=0.0.0.0
Aprende Streamlit GRATIS online

Tutoriales de Streamlit

Aprende Streamlit con tutoriales de programación en Streamlit.

Tipo de tecnología

Biblioteca

Categoría laboral

Backend

Año de lanzamiento

2019

Developers

Streamlit Inc

Todos los módulos de Streamlit

Ver todos los módulos de Streamlit

Otras tecnologías

Vue.js
Vuejs

Vuejs

Frontend

Framework de JS progresivo para construir interfaces de usuario reactivas y modulares.

Laravel
Laravel

Laravel

Backend

Framework de PHP para desarrollo web backend.

C
C

C

Backend

Lenguaje de propósito general, eficiente y de bajo nivel.

scikit-learn
ScikitLearn

ScikitLearn

Backend

Biblioteca de aprendizaje automático en Python.

Java

Java

Backend

Lenguaje de programación versátil y multiplataforma.

Apache Spark
PySpark

PySpark

Big Data

Motor unificado de análisis de datos distribuido para grandes volúmenes.

TypeScript
TypeScript

TypeScript

Full Stack

Superconjunto de JavaScript con tipado estático.

OpenCV
OpenCV

OpenCV

Ciencia de Datos e Inteligencia artificial

Biblioteca de Python para el aprendizaje automático, incluyendo clasificación, regresión, clustering y reducción de dimensionalidad.

React
React

React

Frontend

Librería framework para frontend interfaces de usuario.

PHP
PHP

PHP

Backend

Lenguaje de programación para desarrollo web del lado del servidor.

NestJS
Nest

Nest

Backend

Framework Node.js para crear aplicaciones escalables y eficientes.

Go
Go

Go

Backend

Lenguaje de programación eficiente y concurrente creado por Google.

Docker
Docker

Docker

DevOps

Plataforma de contenedores para aplicaciones portátiles.

Spring Boot
SpringBoot

SpringBoot

Backend

Framework para desarrollo rápido de aplicaciones Java.

CSharp

CSharp

Backend

Lenguaje de programación de Microsoft para aplicaciones robustas.

SQL

SQL

Administración de bases de datos

Lenguaje para gestionar bases de datos relacionales.

Node.js
Node

Node

Backend

Node.js es un entorno de ejecución de JavaScript basado en el motor V8 de Google.

Seaborn

Seaborn

Ciencia de Datos e Inteligencia artificial

Biblioteca de visualización de datos para Python.

Fundamentos

Fundamentos

Full Stack

Fundamentos y bases de la programación de software moderna.

TensorFlow
TensorFlow

TensorFlow

Backend

Biblioteca Python para redes neuronales en Deep Learning

Git
Git

Git

DevOps

Sistema de control de versiones distribuido.

Selenium
Selenium

Selenium

Testing / QA (Quality Assurance)

Suite de herramientas open-source para automatizar navegadores web y pruebas de software de interfaz de usuario.

Tailwind CSS
TailwindCSS

TailwindCSS

Frontend

Framework de utilidades CSS para diseños rápidos y personalizables.

Kotlin
Kotlin

Kotlin

Backend

Lenguaje de programación moderno y seguro para aplicaciones Android.

NumPy
Numpy

Numpy

Ciencia de Datos e Inteligencia artificial

Biblioteca Python para computación científica y matrices.

HTML5
HTML

HTML

Frontend

Lenguaje de marcado para estructurar contenido web.

GNU Bash
Bash

Bash

Administración de sistemas

Intérprete de comandos para sistemas Unix y Linux.

Bootstrap
Bootstrap

Bootstrap

Frontend

Framework CSS para diseños web responsive y modernos.

2022-09-27T22:26:51.030457 image/svg+xml Matplotlib v3.6.0, https://matplotlib.org/
Matplotlib

Matplotlib

Ciencia de Datos e Inteligencia artificial

Biblioteca Python para crear gráficos y visualizaciones.

Hibernate
Hibernate

Hibernate

Backend

ORM para Java, simplifica el acceso a bases de datos.

pandas
Pandas

Pandas

Ciencia de Datos e Inteligencia artificial

Herramienta Python para análisis y manipulación de datos.

JavaScript
JavaScript

JavaScript

Full Stack

Lenguaje de scripting para desarrollo web interactivo.

Angular
Angular

Angular

Frontend

Framework web de Google para aplicaciones dinámicas.

CSS3
CSS

CSS

Frontend

Lenguaje de estilo para diseñar páginas web atractivas.

Python
Python

Python

Backend

Lenguaje de programación fácil de aprender y versátil.

Acceder a todas las tecnologías