DEV Community

Abel Fernando PACOMPIA ORTIZ
Abel Fernando PACOMPIA ORTIZ

Posted on

Cómo construí y desplegué un dashboard de ventas con Python, Streamlit y Plotly

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.

🔗 Probar el dashboard

💻 Ver el código en GitHub

Todos los datos son ficticios y están identificados como datos de demostración. No representan operaciones de una empresa real.

1. Datos reproducibles

El proyecto genera 2.400 pedidos del año 2025. Cada registro incluye:

  • Identificador del pedido.
  • Fecha.
  • Categoría.
  • Región.
  • Unidades.
  • Ventas y costos.

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.

2. Indicadores con definiciones claras

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.

3. Filtros y visualizaciones

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:

  • Evolución diaria de ventas: permite observar el comportamiento durante el período, incluyendo los días sin ventas como cero.
  • Ventas por categoría: facilita comparar las categorías de productos.
  • Resultados por región: compara ventas y ganancias simuladas.

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.

4. Tabla y descarga en CSV

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:

  • Encabezados en español.
  • Codificación UTF-8 con BOM.
  • Coma como separador.
  • Importes expresados en PEN.

Esto permite continuar el análisis en una hoja de cálculo u otra herramienta.

5. Separar los cálculos de la interfaz

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
Enter fullscreen mode Exit fullscreen mode

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.

6. Ejecutar el proyecto localmente

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
Enter fullscreen mode Exit fullscreen mode

Después, abre:

http://localhost:8501
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

requirements.txt contiene las dependencias de la aplicación. requirements-dev.txt incorpora también pytest para ejecutar las pruebas.

7. Comprobar los cálculos y filtros

La validación local incluyó nueve pruebas automatizadas, todas aprobadas.

Las pruebas verifican:

  • Reproducibilidad de los datos.
  • Consistencia entre ventas, costos y ganancias.
  • Indicadores con valores conocidos.
  • Fechas inclusivas y selección de un solo día.
  • Combinación de filtros.
  • Selecciones vacías.
  • Contenido del CSV.
  • Interacciones con la aplicación mediante AppTest de Streamlit.

Para ejecutarlas en Windows:

.\.venv\Scripts\python.exe -m pytest -q
Enter fullscreen mode Exit fullscreen mode

También comprobé el arranque del servidor y ejecuté pip check, que no encontró conflictos entre las dependencias instaladas.

8. Desplegar en Streamlit Community Cloud

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
Enter fullscreen mode Exit fullscreen mode

El proceso consiste en:

  1. Iniciar sesión en Streamlit Community Cloud y conectar GitHub.
  2. Crear una aplicación desde el repositorio.
  3. Seleccionar la rama y el archivo principal.
  4. Configurar la versión de Python.
  5. Pulsar Deploy y revisar los registros.

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.

9. Actualizaciones automáticas y GitHub Actions

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.

Qué aprendí construyéndolo

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.

🔗 Explorar la aplicación

💻 Consultar el repositorio

Top comments (0)