Pronóstico de series de tiempo de JS: análisis de datos para la interfaz más pequeña

En este artículo, explicaré por qué a veces está bien hacer análisis de datos en el navegador.





¿Cuál es el punto de?

En mi trabajo como desarrollador de React Front-end, suelo trabajar con paneles y varios tipos de datos. En algún momento, tuvimos que agregar predicciones por métricas, y el equipo no tenía analistas de datos que pudieran hacer esto.





Nuestra pila es React + Java.





Problema 1

Gran cantidad de datos para predecir y pocos registros: miles de posibles segmentos de datos, pero pocos datos históricos.





Problema 2

Los chicos del backend están muy ocupados, por lo que físicamente no pudieron hacer frente a esta tarea. Cuota limitada de instancias de Java en la empresa por proyecto. Todos los expertos están ocupados, lleva mucho tiempo coordinarse, lleva mucho tiempo, espera mucho tiempo para el backend





Por lo tanto, decidimos hacer predicciones de filas en el lado del cliente, en el navegador. ¡Somos desarrolladores front-end!





Comprobemos que la serie se puede predecir en absoluto.

Para hacer esto, llevaremos los datos a Excel y veremos los resultados de la función FORECAST.ETS()



. Nuestras previsiones estacionales parecen plausibles. Hemos verificado que es posible obtener algo adecuado en nuestros datos, por lo que ahora podemos buscar JS-libs para obtener predicciones.





Predicciones de la serie JS

Si decide hacer predicciones al principio (y ahorrar tiempo a los backendrs), entonces necesita encontrar algo ya hecho y no hacer predicciones desde cero.





Tensorflow.js RNN , , , . , : 1000+ 40-50 .





ARIMA JS , Nostradamus, -.





:





predict = (
    data,
    a = 0.95,
    b = 0.4,
    g = 0.2,
    p = this.PERIODS_TO_PREDICT,
  ) => {
    const alpha = a;
    const beta = b;
    const gamma = g;

    const predictions = forecast(data, alpha, beta, gamma, this.OBSERVATIONS_PER_SEASON, p);
    return predictions;
  };
      
      



Forecast , p . .





- . , client-side :





  1. , : , “”. , , , , 12 .





  2. 1, - 2 . , 24 (2 ).





  3. , , , , . , (//) . ( ). , , .





  4. , . - , 12 (), , , 24/36/48 .





: , , , (, 2 , 3 , 12), . 3 , - , .





La línea azul es el año actual.  El morado es el anterior.  La línea punteada es el pronóstico.
- . - . - .
Pronóstico por tres métricas independientes (líneas discontinuas).  La línea azul es el año actual.
( ). - .

-

const adjustParams = (period) => {
      const iter = 10;
      const incr = 1 / iter;
      let bestAlpha = 0.0;
      let bestError = -1;
      let alpha = bestAlpha;
      let bestGamma = 0.0;
      let gamma = bestGamma;
      let bestDelta = 0.0;
      let delta = bestDelta;

      while (alpha < 1) {
        while (gamma < 1) {
          while (delta < 1) {
            const pred = this.predict(data, alpha, delta, gamma, period);
            const error = this.computeMeanSquaredError(data, pred);
            if (error < bestError || bestError === -1) {
              bestAlpha = alpha;
              bestGamma = gamma;
              bestDelta = delta;
              bestError = error;
            }
            delta += incr;
          }
          delta = 0;
          gamma += incr;
        }
        gamma = 0;
        alpha += incr;
      }
      alpha = bestAlpha;
      gamma = bestGamma;
      delta = bestDelta;
      return {
        alpha,
        gamma,
        delta,
        bestError,
      };
    };
      
      



2

Después de publicar en  Medium, varias personas me escribieron con una solicitud para asesorarles con más detalle sobre este asunto y, como resultado, tengo un repositorio sandbox en el que puedes profundizar en cómo funciona. Código del proyecto .






¿Qué tareas resolvió del lado del cliente? ¡Escribe tu historia en los comentarios!

Traducido por Daniil Okhlopkov .








All Articles