Open Data · Consultora de Datos

Convertimos datos
en decisiones

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.

Scrolleá para ver cómo funciona

Panel de Control · RetailCo · Marzo 2026

Tu CEO ve los datos así.

Limpio. Rápido. Accionable.

Ingresos del mes $2,410,500 ↑ +12% vs mes anterior
Órdenes completadas 1,247 ↑ +8% vs mes anterior
Ticket promedio $1,932 ↑ +3% vs mes anterior
Clientes nuevos 148 → sin cambio
Ingresos mensuales (Oct 2025 – Mar 2026)
1.6M 1.85M 2.1M 1.9M 2.1M 2.41M ↑ Oct Nov Dic Ene Feb Mar

¿De dónde viene el $2,410,500?

Scrolleá para descubrirlo

Capa 2 / 5

Cada número
tiene un análisis detrás.

Data Warehouse

Así se construye el $2,410,500

Dos consultas corren en el Data Warehouse cada vez que actualizás el dashboard.

Object Browser RetailCo DW
ventas
└─ordenes1,247 rows
├─orden_idPK
├─cliente_id
├─monto→ SUM
├─fecha_creacion
└─estado
staging
└─raw_ordenes1,302 rows
└─sin procesarraw
kpi_ingresos.sql
-- 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_ingresos.dax
// Medida DAX en Power BI — misma lógica
Ingresos Mes =
CALCULATE(
    SUM(ordenes[monto]),
    DATESMTD(ordenes[fecha_creacion]),
    ordenes[estado] = "completada"
)
// → 2,410,500
Capa 3 / 5

Los datos no llegan perfectos.
Alguien los procesa primero.

Data Engineering

De 1,302 filas crudas a un
número en el dashboard.

Este script descarta registros inválidos, normaliza fechas y carga solo lo que sirve al Data Warehouse.

etl/transform.py
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")
$ output
Extraídos: 1,302
Válidos:   1,247
Ingresos:  $2,410,500
✓ Cargado en ventas.ordenes
ERP
SAP ERP Fuente 1,302 registros
extract.py
02:00 AM
PY
Python ETL Transformación 1,247 válidos
load.py
02:45 AM
DW
PostgreSQL DW ventas.ordenes cargado ✓
refresh
03:00 AM
BI
Power BI Dashboard $2,410,500 ✓
dags/pipeline_ventas.py
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
Capa 4 / 5

Así es como se ven
tus datos sin procesar.

Datos Crudos

Los registros detrás
del $2,410,500

1,302 filas en bruto. El script filtrará 55 registros inválidos y cargará 1,247 al Data Warehouse.

orden_idcliente_idproducto montofecha_creacionestado
ORD-14821CLI-4821Laptop Pro 15"1,240.002026-03-01 09:14:22completada
ORD-14822CLI-0931Monitor 27" 4K890.502026-03-01 10:23:11completada
ORD-14823CLI-2847Teclado Mecánico125.002026-03-01 10:45:03cancelada
ORD-14824CLI-1203Mouse Inalámbrico45.002026-03-01 11:02:44completada
ORD-14825CLI-5512Auriculares BT210.002026-03-01 11:55:18completada
ORD-14826NULLWebcam HD89.002026-03-01 12:10:00sin cliente
ORD-14827CLI-3301Hub USB-C 7p65.002026-03-01 13:22:09completada
ORD-14828CLI-0091SSD Externo 1TB145.002026-03-01 14:08:55completada
1,302 registros · 1,247 incluidos · 55 excluidos $2,410,500 (suma completadas)
Capa 5 / 5

Llegamos al origen.
¿De dónde vienen estos datos?

Fuentes de Datos

Todo empieza aquí.

Tus datos viven en distintos sistemas. Los conectamos, limpiamos y unificamos. Esta es la arquitectura detrás del $2,410,500.

SAP S/4HANA
Excel
SharePoint
Shopify
Google Sheets
CSV Files
JSON API
Oracle ERP
Salesforce
HubSpot
PostgreSQL
MySQL
REST API
AWS S3
Power BI
Tableau
Stripe
dbt
Webhook
Snowflake
SAP S/4HANA
Excel
SharePoint
Shopify
Google Sheets
CSV Files
JSON API
Oracle ERP
Salesforce
HubSpot
PostgreSQL
MySQL
REST API
AWS S3
Power BI
Tableau
Stripe
dbt
Webhook
Snowflake

¿Tu empresa usa alguna de estas herramientas?
Podemos construir este camino con vos.

Hablemos →

Trabajemos juntos

¿Querés esto
para tu empresa?

Contanos en qué etapa estás y te mostramos cómo podemos ayudarte a avanzar.

  • Respuesta en menos de 24 horas
  • Primera consulta sin costo
  • Soluciones a medida — sin plantillas
matiasmarcon@openosdata.com