es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo mapear / reducir una serie de valores limitados por fecha a un total acumulado en JavaScript / RXJS?

Tengo un observable que emite valores de medición con una fecha para una clave. Algo como:

{ "date" : "2021-11-01",
  "temp" : 23.4,
  "hum"  : 74.5
}

Necesito un total y promedio de los últimos 7 días para temp y hum. Si tuviera un valor para cada semana, podría escribir:

const weeklyReducer = (accumulator, currentValue, index) => {
  const key = Math.floor((index-1)/7);
  const workValue = accumulator[key] || {key, temp: 0, hum:0};
  workValue.temp = workValue.temp + currentValue.temp;
  workValue.hum = workValue.hum + currentValue.hum;
  accumulator[key] = workValue;
  return accumulator;
}

Sin embargo, necesito un total acumulado de los últimos 7 días como este:

Total acumulado 1: 1
Total acumulado 2: 1,2
...
Total acumulado 7:  1,2,3,4,5,6,7
Total acumulado 8:  2,3,4,5,6,7,8
Total acumulado 9:  3,4,5,6,7,8,9
Total acumulado 10: 4,5,6,7,8,9,10

¿Cómo diseñaría un reducidor para esto? Estoy abierto a enfoques alternativos.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Un enfoque para diseñar el reductor para un total y promedio de 7 días de ejecución para temp y hum podría ser:

    const runningTotalReducer = (acumulador, valorActual, índice) => {
       // Añade el valor actual a cada ventana
       acumulador.forEach(ventana => {
           ventana.temp += valorActual.temp;
           ventana.hum += valorActual.hum;
           ventana.values.push(valorActual);
       });
    
       // Elimina los valores fuera de la ventana de 7 días para cada ventana
       acumulador.forEach(ventana => {
           let numValuesToRemove = ventana.values.length - 7;
           if (numValuesToRemove > 0) {
               let valuesToRemove = ventana.values.splice(0, numValuesToRemove);
               valuesToRemove.forEach(value => {
                  ventana.temp -= value.temp;
                  ventana.hum -= value.hum;
               });
           }
       });
    
       // Calcula el promedio de ejecución para cada ventana
       acumulador.forEach(ventana => {
           ventana.tempAvg = ventana.temp / ventana.values.length;
           ventana.humAvg = ventana.hum / ventana.values.length;
       });
    
       return acumulador;
    }
    

    En esta implementación, usamos una matriz de ventanas donde cada ventana contiene los valores acumulados para temp y hum de los últimos 7 días, así como una matriz de valores que pertenecen a esa ventana. Añadimos cada valor nuevo a todas las ventanas, luego eliminamos los valores fuera de la ventana de 7 días para cada ventana. Finalmente, calculamos el promedio de ejecución para cada ventana.

    Tenga en cuenta que esta es solo una forma de abordar el problema y puede haber otras formas de lograr el mismo resultado.

Comments are closed.