devto 2026-10-19 원문 보기 ↗
Convertir datos en una herramienta interactiva permite responder preguntas como: ¿cómo evolucionan las ventas?, ¿qué categorías generan más ingresos?, ¿qué regiones aportan mayores ganancias?
Para explorar estas preguntas, construí un dashboard de ventas en español con Python, Streamlit y Plotly, y lo desplegué en Streamlit Community Cloud, conectado a GitHub.
Todos los datos son ficticios y están identificados como datos de demostración. No representan operaciones de una empresa real.
El proyecto genera 2.400 pedidos del año 2025. Cada registro incluye:
La generación utiliza random.Random(42), una semilla fija que permite obtener los mismos datos al repetir la ejecución en el mismo entorno.
Los importes se almacenan en céntimos enteros y se convierten a soles peruanos al mostrarlos. Así evitamos acumular errores de representación decimal en las sumas.
El dashboard presenta cuatro indicadores:
| Indicador | Cálculo |
|---|---|
| Ventas | Suma de los importes vendidos |
| Ganancias | Ventas menos costos simulados |
| Pedidos | Cantidad de identificadores únicos |
| Ticket promedio | Ventas divididas entre pedidos |
Si no hay pedidos, el ticket promedio se muestra como cero para evitar una división entre cero.
Con el conjunto completo, los resultados son:
| Indicador | Resultado |
|---|---|
| Ventas | S/ 2.437.981,88 |
| Ganancias simuladas | S/ 656.355,02 |
| Pedidos | 2.400 |
| Ticket promedio | S/ 1.015,83 |
La simulación no incorpora impuestos ni devoluciones. Por eso, las ganancias representan la diferencia entre las ventas y los costos generados, no un beneficio neto contable.
La barra lateral permite filtrar por fecha, categoría y región.
Las condiciones se combinan: cada pedido debe cumplir todos los filtros seleccionados. El período incluye la fecha inicial y la final.
Con Plotly, la aplicación muestra tres visualizaciones:
Los indicadores, los gráficos y la tabla responden a la misma selección.
Si los filtros no encuentran pedidos, aparece un mensaje explicativo y los indicadores quedan en cero.
Además de los gráficos, el dashboard incluye una tabla con el detalle de los pedidos filtrados.
El botón de descarga exporta exactamente esa selección a un archivo CSV, con:
Esto permite continuar el análisis en una hoja de cálculo u otra herramienta.
Organicé el proyecto con esta estructura:
data-visualization-dashboard/
├── app.py
├── sales.py
├── requirements.txt
├── requirements-dev.txt
├── .gitignore
├── .streamlit/
│ └── config.toml
├── .github/
│ └── workflows/
│ └── checks.yml
├── tests/
│ └── test_sales.py
└── docs/
└── articulo-borrador.md
app.py construye la interfaz de Streamlit y los gráficos de Plotly.
sales.py contiene la generación de datos, los filtros, los indicadores y la preparación del CSV.
Esta separación permite comprobar las reglas del dashboard sin depender de su presentación visual.
Para probarlo en Windows con Python 3.12:
git clone https://github.com/Abel-GG-777/data-visualization-dashboard.git
cd data-visualization-dashboard
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
.\.venv\Scripts\python.exe -m streamlit run app.py
Después, abre:
http://localhost:8501
En Linux o macOS:
git clone https://github.com/Abel-GG-777/data-visualization-dashboard.git
cd data-visualization-dashboard
python3.12 -m venv .venv
.venv/bin/python -m pip install -r requirements-dev.txt
.venv/bin/python -m streamlit run app.py
requirements.txt contiene las dependencias de la aplicación. requirements-dev.txt incorpora también pytest para ejecutar las pruebas.
La validación local incluyó nueve pruebas automatizadas, todas aprobadas.
Las pruebas verifican:
AppTest de Streamlit.Para ejecutarlas en Windows:
.\.venv\Scripts\python.exe -m pytest -q
También comprobé el arranque del servidor y ejecuté pip check, que no encontró conflictos entre las dependencias instaladas.
Una vez subido el código a GitHub, conecté el repositorio a Streamlit Community Cloud.
La configuración utilizada fue:
Repositorio: Abel-GG-777/data-visualization-dashboard
Rama: main
Archivo principal: app.py
Python: 3.12
El proceso consiste en:
El servicio instala las dependencias declaradas en requirements.txt. Esta aplicación no necesita claves de API ni secretos.
Después del despliegue, comprobé que el dashboard se podía abrir en una ventana de incógnito.
Puedes consultar la guía oficial de despliegue.
Community Cloud refleja los cambios que se suben a la rama conectada. Cuando cambian las dependencias, el servicio vuelve a instalarlas, lo que puede tardar más que una actualización de código.
Documentación oficial sobre actualizaciones.
El repositorio también incluye un workflow de GitHub Actions que instala las dependencias, compila el código y ejecuta las pruebas en cada push y pull request.
Ambos procesos tienen funciones distintas:
| Herramienta | Función |
|---|---|
| GitHub Actions | Comprobar el código y ejecutar las pruebas |
| Streamlit Community Cloud | Desplegar y actualizar la aplicación |
Un fallo de Actions no bloquea automáticamente el despliegue de Community Cloud. Para controlar qué cambios llegan a main, se pueden utilizar pull requests y protección de rama con comprobaciones obligatorias cuando estén disponibles.
Este proyecto conecta varias partes del desarrollo de una aplicación de datos: generar información reproducible, definir métricas, aplicar filtros coherentes, visualizar resultados, exportar datos y verificar el comportamiento antes de desplegar.
Streamlit permite construir la interfaz desde Python y Plotly aporta gráficos interactivos. Separar la lógica de la presentación facilita mantener el proyecto y probar sus cálculos.
Como siguiente mejora, se podría sustituir el generador de datos ficticios por una fuente real, definiendo antes cómo tratar pedidos duplicados, devoluciones, impuestos y datos faltantes.