Open Data · Consultora de Datos
Tu empresa ya genera los datos. Nosotros los convertimos en una ventaja real — decisiones más rápidas, métricas que importan, resultados que se ven.
Panel de Control · RetailCo · Marzo 2026
Limpio. Rápido. Accionable.
¿De dónde viene el $2,410,500?
Scrolleá para descubrirlo
Cada número
tiene un análisis detrás.
Dos consultas corren en el Data Warehouse cada vez que actualizás el dashboard.
-- KPI: Ingresos del Mes
-- Resultado → $2,410,500 · 1,247 órdenes
SELECT
SUM(o.monto) AS ingresos_total, -- 2,410,500
COUNT(DISTINCT o.cliente_id) AS clientes, -- 1,247
ROUND(AVG(o.monto), 2) AS ticket_promedio -- 1,932.00
FROM ventas.ordenes o
WHERE o.estado = 'completada'
AND DATE_TRUNC('month', o.fecha_creacion)
= DATE_TRUNC('month', CURRENT_DATE)
// Medida DAX en Power BI — misma lógica
Ingresos Mes =
CALCULATE(
SUM(ordenes[monto]),
DATESMTD(ordenes[fecha_creacion]),
ordenes[estado] = "completada"
)
// → 2,410,500
Los datos no llegan perfectos.
Alguien los procesa primero.
Este script descarta registros inválidos, normaliza fechas y carga solo lo que sirve al Data Warehouse.
import pandas as pd
from db import engine
# ── Extracción ─────────────────────────────────
df = pd.read_sql("SELECT * FROM sap.raw_ordenes WHERE mes='2026-03'", engine)
print(f"Extraídos: {len(df)}") # → 1,302
# ── Transformación ─────────────────────────────
df = df.dropna(subset=['monto', 'cliente_id']) # -18 nulls
df = df[df['estado'] == 'completada'] # -37 canceladas
df['fecha_creacion'] = pd.to_datetime(df['fecha'])
print(f"Válidos: {len(df)}") # → 1,247
print(f"Ingresos: ${df['monto'].sum():,.0f}") # → $2,410,500
# ── Carga ──────────────────────────────────────
df.to_sql('ordenes', engine, schema='ventas', if_exists='append', index=False)
print("✓ Cargado en ventas.ordenes")
Extraídos: 1,302
Válidos: 1,247
Ingresos: $2,410,500
✓ Cargado en ventas.ordenes
from airflow import DAG
from airflow.operators.python import PythonOperator
with DAG('pipeline_ventas', schedule_interval='0 2 * * *') as dag:
extraer = PythonOperator(task_id='extraer_sap', python_callable=extract)
limpiar = PythonOperator(task_id='transformar', python_callable=transform)
cargar = PythonOperator(task_id='cargar_dw', python_callable=load)
refrescar = PythonOperator(task_id='refrescar_powerbi', python_callable=refresh)
extraer >> limpiar >> cargar >> refrescar
Así es como se ven
tus datos sin procesar.
1,302 filas en bruto. El script filtrará 55 registros inválidos y cargará 1,247 al Data Warehouse.
| orden_id | cliente_id | producto | monto | fecha_creacion | estado |
|---|---|---|---|---|---|
| ORD-14821 | CLI-4821 | Laptop Pro 15" | 1,240.00 | 2026-03-01 09:14:22 | completada |
| ORD-14822 | CLI-0931 | Monitor 27" 4K | 890.50 | 2026-03-01 10:23:11 | completada |
| ORD-14823 | CLI-2847 | Teclado Mecánico | 125.00 | 2026-03-01 10:45:03 | cancelada |
| ORD-14824 | CLI-1203 | Mouse Inalámbrico | 45.00 | 2026-03-01 11:02:44 | completada |
| ORD-14825 | CLI-5512 | Auriculares BT | 210.00 | 2026-03-01 11:55:18 | completada |
| ORD-14826 | NULL | Webcam HD | 89.00 | 2026-03-01 12:10:00 | sin cliente |
| ORD-14827 | CLI-3301 | Hub USB-C 7p | 65.00 | 2026-03-01 13:22:09 | completada |
| ORD-14828 | CLI-0091 | SSD Externo 1TB | 145.00 | 2026-03-01 14:08:55 | completada |
| 1,302 registros · 1,247 incluidos · 55 excluidos | $2,410,500 (suma completadas) | ||||
Llegamos al origen.
¿De dónde vienen estos datos?
Tus datos viven en distintos sistemas. Los conectamos, limpiamos y unificamos. Esta es la arquitectura detrás del $2,410,500.
¿Tu empresa usa alguna de estas herramientas?
Podemos construir este camino con vos.
Trabajemos juntos
Contanos en qué etapa estás y te mostramos cómo podemos ayudarte a avanzar.