Media móvil dinámica: 6 enfoques con SCAN, MMULT y MAP

Un miembro de la comunidad tiene un rango con ventas mensuales y necesita generar una columna con la media móvil de los últimos 3 meses usando funciones de desbordamiento. La comunidad respondió con 6 enfoques distintos, generando una de las conversaciones más ricas del mes.

Nacho propone SCAN + PROMEDIO + TOMAR:

``
=SCAN(0;B2:B25;LAMBDA(_a;_i;PROMEDIO(TOMAR(B2:_i;-3))))
`

Elegante y conciso: SCAN recorre acumulando y en cada paso calcula el promedio de los últimos 3 valores con TOMAR(B2:_i;-3).

Leo ofrece un enfoque matricial con MMULT:

`
=LET(r;B2:B25;v;SECUENCIA(FILAS(r));h;ENFILA(v);
MMULT((v>=h)(v<h+3)(v>2);r)/3)
`

Crea una matriz booleana que selecciona ventanas de 3 elementos y usa MMULT para sumar cada ventana de golpe. Los primeros 2 valores salen 0.

La versión parametrizable de Leo permite elegir la ventana con una variable k:

`
=LET(r;B2:B25;k;3;v;SECUENCIA(FILAS(r));h;ENFILA(v);
SI(v<k;NOD();MMULT((v>=h)(v<h+k);r)/k))
`

Devuelve #N/D para los primeros períodos incompletos. Y su variante más completa incluye todos los valores:

`
=LET(r;B2:B25;v;SECUENCIA(FILAS(r));h;ENFILA(v);
b;(v>=h)(v<h+3);MMULT(b;r)/MMULT(b;r^0))
`

El truco: divide por MMULT(b;r^0) en vez de por 3, así los primeros períodos calculan con los datos disponibles.

Alejandro aporta un enfoque con MAP + TOMAR + INDICE:

`
=LET(rango;B2:B25;
MAP(rango;LAMBDA(x;PROMEDIO(TOMAR(INDICE(rango;1):x;-3)))))
`

Similar al enfoque SCAN pero construye un rango dinámico desde el inicio hasta cada celda.

Otro miembro usa MAP con constante matricial:

`
=MAP(SECUENCIA(FILAS(_gDatos));LAMBDA(i;
SI(i<3;NOD();PROMEDIO(INDICE(_gDatos;i+{0;-1;-2})))))
`

La constante {0;-1;-2}` actúa como offset para obtener los 3 valores relativos a cada posición.

Como aplicación real, Alejandro (de Colombia) compartió cómo usa la media móvil en su clínica para pronósticos epidemiológicos, aplicando la regla 68-95-99.7 para elegir el tamaño óptimo del bloque: la desviación estándar del bloque entre la de los datos crudos debe ser lo más próxima a 3 sin pasarse. Compartió datos reales de influenza estacional 1998-2018.

Más contenido de Excel en InflueXcel