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.
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:
- Texto y cabeceras
- Widgets de entrada y selección
- Gráficos y visualizaciones
- Disposición y organización
- 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:
- El script se ejecuta por completo al cargar la página por primera vez.
- Cada vez que el usuario interactúa (por ejemplo, hace clic en un botón), el script vuelve a ejecutarse de arriba a abajo.
- 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:
- Cargar datos con
pandas
. - Limpiar y procesar los datos.
- Construir un modelo con Scikit-learn.
- 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:
- Heroku: Subiendo tu app con un
Procfile
y requisitos enrequirements.txt
. - AWS, GCP o Azure: Configurando un contenedor Docker y lanzándolo en un servicio como AWS ECS/EKS o Google Cloud Run.
- 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
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 StreamlitOtras tecnologías
Vuejs
Vuejs
Frontend
Framework de JS progresivo para construir interfaces de usuario reactivas y modulares.
Laravel
Laravel
Backend
Framework de PHP para desarrollo web backend.
C
C
Backend
Lenguaje de propósito general, eficiente y de bajo nivel.
ScikitLearn
ScikitLearn
Backend
Biblioteca de aprendizaje automático en Python.
Java
Java
Backend
Lenguaje de programación versátil y multiplataforma.
PySpark
PySpark
Big Data
Motor unificado de análisis de datos distribuido para grandes volúmenes.
TypeScript
TypeScript
Full Stack
Superconjunto de JavaScript con tipado estático.
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
Frontend
Librería framework para frontend interfaces de usuario.
PHP
PHP
Backend
Lenguaje de programación para desarrollo web del lado del servidor.
Nest
Nest
Backend
Framework Node.js para crear aplicaciones escalables y eficientes.
Go
Go
Backend
Lenguaje de programación eficiente y concurrente creado por Google.
Docker
Docker
DevOps
Plataforma de contenedores para aplicaciones portátiles.
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
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
Backend
Biblioteca Python para redes neuronales en Deep Learning
Git
Git
DevOps
Sistema de control de versiones distribuido.
Selenium
Selenium
Testing / QA (Quality Assurance)
Suite de herramientas open-source para automatizar navegadores web y pruebas de software de interfaz de usuario.
TailwindCSS
TailwindCSS
Frontend
Framework de utilidades CSS para diseños rápidos y personalizables.
Kotlin
Kotlin
Backend
Lenguaje de programación moderno y seguro para aplicaciones Android.
Numpy
Numpy
Ciencia de Datos e Inteligencia artificial
Biblioteca Python para computación científica y matrices.
HTML
HTML
Frontend
Lenguaje de marcado para estructurar contenido web.
Bash
Bash
Administración de sistemas
Intérprete de comandos para sistemas Unix y Linux.
Bootstrap
Bootstrap
Frontend
Framework CSS para diseños web responsive y modernos.
Matplotlib
Matplotlib
Ciencia de Datos e Inteligencia artificial
Biblioteca Python para crear gráficos y visualizaciones.
Hibernate
Hibernate
Backend
ORM para Java, simplifica el acceso a bases de datos.
Pandas
Pandas
Ciencia de Datos e Inteligencia artificial
Herramienta Python para análisis y manipulación de datos.
JavaScript
JavaScript
Full Stack
Lenguaje de scripting para desarrollo web interactivo.
Angular
Angular
Frontend
Framework web de Google para aplicaciones dinámicas.
CSS
CSS
Frontend
Lenguaje de estilo para diseñar páginas web atractivas.
Python
Python
Backend
Lenguaje de programación fácil de aprender y versátil.