Python · SQL · DuckDB · Power BI

Robot Pipeline Management

Un almacén en 3D donde equipos de robots, cada uno con su personalidad, reparten cajas. Cada partida genera miles de datos, y todo su recorrido, desde la simulación hasta el informe, está automatizado.

A 3D warehouse where teams of robots, each with its own personality, deliver boxes. Every run produces thousands of data points, and their whole journey, from the simulation to the report, is automated.

Una partida: los robots recogen cajas de las cintas y las llevan a su zona A run: robots pick boxes from the conveyors and carry them to their zone
Una partida real, grabada de la simulaciónA real run, recorded from the simulation
10.00010,000
niveles simuladoslevels simulated
180.179180,179
cajas procesadasboxes handled
672.577672,577
decisiones registradasdecisions logged
114
comprobaciones de calidaddata quality checks

01 — El proyectoThe project

Es una simulación programada desde cero en Python. Cada robot tiene una personalidad, que decide cómo se comporta, y un cuerpo, que decide qué puede hacer. El equipo tiene que llevar las cajas a su sitio antes de que se acabe la batería o el plazo.

It is a simulation written from scratch in Python. Each robot has a personality, which decides how it behaves, and a body, which decides what it can do. The team has to get every box where it belongs before the battery or the deadline runs out.

La simulación es la excusa. Lo que me interesaba era responder preguntas con datos, como se haría en una empresa de logística: ¿qué tipo de robot rinde más?, ¿compensa añadir uno más al equipo?, ¿quién calcula mal lo que le va a costar una tarea?

The simulation is the excuse. What I wanted was to answer questions with data, the way a logistics company would: which kind of robot performs best? Is one more robot worth it? Who misjudges what a task will cost?

SimulaciónSimulation
Mapas al azar, 8 cuerpos, 13 personalidades, tráfico, batería, puertas y plazos. Unas 22.000 líneas de Python.Random maps, 8 bodies, 13 personalities, traffic, battery, doors and deadlines. About 22,000 lines of Python.
Fábrica de datosData factory
Miles de partidas en paralelo y sin ventana: 10.000 niveles en 4 o 5 horas en un portátil.Thousands of headless runs in parallel: 10,000 levels in 4 to 5 hours on a laptop.
TuberíaPipeline
Cada lote nuevo se limpia, se comprueba y se suma solo, sin repetir lo ya procesado.Each new batch is cleaned, checked and added on its own, without reprocessing old data.
CalidadQuality
114 comprobaciones antes de publicar. Si algo no cuadra, no llega al informe.114 checks before publishing. If something doesn't add up, it never reaches the report.
AnálisisAnalysis
12 preguntas en SQL con margen de error, gráficos y un informe de Power BI generado desde código.12 questions in SQL with confidence intervals, charts and a Power BI report generated from code.

02 — Arma un equipoBuild a team

Elige cuerpo y personalidad para hasta cinco robots. Las cifras no son inventadas: salen de los 10.000 niveles simulados con las reglas actuales.

Pick a body and a personality for up to five robots. The numbers are not made up: they come from the 10,000 levels simulated with the current rules.

CuerpoBody

PersonalidadPersonality

Tu equipoYour team · 0 / 5

    03 — Qué he descubiertoFindings

    La línea fina de cada dato es su margen de error al 95 %. Si no cruza la referencia, la diferencia es real y no cosa del azar.

    The thin line on each value is its 95% confidence interval. If it doesn't cross the reference line, the difference is real, not chance.

    El Controlador de minidrones hace un 16 % más de lo que le toca. El Gambler y el Gorila, bastante menos.The Drone Controller does 16% more than its share. The Gambler and the Gorilla, a lot less.

    El índice compara lo que hace cada robot con lo que le tocaría si el trabajo del equipo se repartiera a partes iguales (1 = su parte justa).

    The index compares what each robot does with what it would do if the team's work were split evenly (1 = its fair share).

    Más robots no siempre es mejor: el quinto sobra.More robots isn't always better: the fifth one is too many.

    Con cinco robots, cada uno rinde un 30 % menos que uno solo, porque se estorban en los pasillos y en la estación de carga. El equipo entero llega a ir más lento con cinco que con cuatro (3,58 frente a 3,67 entregas por cada 1.000 fotogramas). Es la pregunta de siempre al dimensionar un equipo, respondida con datos.

    With five robots, each one delivers 30% less than a robot working alone, because they get in each other's way in the aisles and at the charging station. The whole team is actually slower with five than with four (3.58 vs 3.67 deliveries per 1,000 frames). It's the classic team-sizing question, answered with data.

    Calcular bien no basta: el comportamiento cambia el resultado.Good estimates aren't enough: behaviour changes the outcome.

    Todos los robots calculan igual cuánta batería les costará una tarea, y aun así unas personalidades gastan más de lo calculado y otras menos. No es cuestión de optimismo, sino de lo que hacen por el camino: a qué cajas van, cuánto esperan o si ceden el paso.

    Every robot estimates a task's battery cost the same way, yet some personalities use more than estimated and others less. It isn't about optimism, it's about what they do along the way: which boxes they go for, how long they wait, whether they give way.

    04 — Informe de Power BIPower BI report

    El informe tiene cinco páginas que se generan desde código con cada actualización: modelo, relaciones, 31 medidas DAX y páginas. Aquí están las mismas páginas con los mismos datos, para verlas sin abrir Power BI. La página Robots se puede filtrar como en el informe.

    The report has five pages generated from code on every refresh: model, relationships, 31 DAX measures and pages. Here are the same pages with the same data, so you can explore them without opening Power BI. The Robots page can be filtered just like in the report.

    05 — Por dentroUnder the hood

    Todo lo lanza un solo comando, y cada lote lo llama solo al terminar.

    One command runs it all, and every batch triggers it when it finishes.

    1. SimulaciónSimulationmiles de niveles en paralelo, en JSONLthousands of levels in parallel, as JSONL
    2. BronceBronzeingesta incremental a Parquet (de 2 GB a 125 MB)incremental ingestion to Parquet (2 GB down to 125 MB)
    3. ModeloModelesquema en estrella en DuckDBstar schema in DuckDB
    4. OroGold12 preguntas en SQL con intervalos de confianza12 SQL questions with confidence intervals
    5. CalidadQuality114 pruebas; si alguna falla, se queda la versión anterior114 tests; if any fails, the previous version stays live
    6. Power BIproyecto .pbip generado, gráficos y diccionario de datosgenerated .pbip project, charts and data dictionary

    Decisiones de diseñoDesign decisions

    Nada escrito a manoNothing hard-coded
    Un cuerpo, una personalidad o una métrica nuevos aparecen solos en el modelo, la calidad, el diccionario y los gráficos.A new body, personality or metric shows up on its own in the model, the checks, the dictionary and the charts.
    Versión de las reglasRules version
    Una huella del código de la simulación: los datos de reglas distintas no se mezclan nunca.A fingerprint of the simulation code, so data from different rules never gets mixed.
    CuarentenaQuarantine
    Un nivel que no cuadra se marca como no válido y sale como aviso. No se pierde, pero no contamina.A level that doesn't add up is flagged as invalid and reported. Nothing is lost, nothing is polluted.
    Publicación atómicaAtomic publishing
    El modelo nuevo sustituye al anterior solo si todo ha ido bien. Power BI nunca ve datos a medias.The new model replaces the old one only if everything passed. Power BI never sees half-built data.
    ReproducibleReproducible
    Cada nivel tiene su semilla: el mismo lote da los mismos datos, con cualquier número de procesos.Every level has its seed: the same batch gives the same data, with any number of processes.
    Power BI como códigoPower BI as code
    El informe se genera en formato de proyecto (texto), así que se revisa en git y se rehace con cada lote.The report is generated in project format (plain text), so it's reviewable in git and rebuilt with every batch.

    HerramientasTools

    Python, SQL, DuckDB, Parquet, PyArrow, Power BI (TMDL, PBIR, DAX), Matplotlib, PyVista, unittest, Git

    06 — DatosData

    Los resultados que usa esta página, en CSV, para abrirlos en Excel o donde quieras.

    The results behind this page, as CSV files you can open in Excel or anywhere else.