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.

Necesito el dv/dt para la siguiente tabla.

Cómo obtener el dv/dt de la tabla a continuación en psql
El concepto es regresión lineal, pero determinar la pendiente es el problema que estoy enfrentando.

voltage ||   time
0          2022-04-25 12:40:32.071 
0          2022-04-25 12:41:32.071
0          2022-04-25 12:42:32.071
9          2022-04-25 12:43:32.071
10         2022-04-25 12:44:32.071
11         2022-04-25 12:45:32.071
0          2022-04-25 12:46:32.071
0          2022-04-25 12:47:32.071
0          2022-04-25 12:48:32.071
0          2022-04-25 12:49:32.071

El nombre de la tabla es test_voltage

Resultado esperado:
voltage || time
0 2022-04-25 12:40:32.071 || idle
0 2022-04-25 12:41:32.071 || idle
0 2022-04-25 12:42:32.071 || idle
9 2022-04-25 12:43:32.071 || charging
10 2022-04-25 12:44:32.071 || charging
11 2022-04-25 12:45:32.071 || charging
0 2022-04-25 12:46:32.071 || idle
0 2022-04-25 12:47:32.071 || idle
0 2022-04-25 12:48:32.071 || idle
0 2022-04-25 12:49:32.071 || idle

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener la dv/dt (tasa de cambio de voltaje a lo largo del tiempo) de la tabla dada en PostgreSQL, podemos utilizar la regresión lineal para calcular la pendiente de la gráfica de voltaje versus tiempo.

    1. Primero, necesitamos crear una función de regresión lineal simple en plpgsql. Esta función tomará el nombre de la tabla como entrada y devolverá la pendiente de la línea de regresión.
    CREATE OR REPLACE FUNCTION regression_slope(table_name text)
    RETURNS float AS $$
    DECLARE
       slope float;
    BEGIN
       EXECUTE format('SELECT COALESCE(SUM((time - t_avg)*(voltage - v_avg))/SUM(POWER((time - t_avg),2)),0)
       FROM (SELECT AVG(time) AS t_avg, AVG(voltage) AS v_avg FROM %I) as sub', table_name)
       INTO slope;
       RETURN slope;
    END;
    $$ LANGUAGE plpgsql;
    
    1. Una vez creada la función, podemos llamarla con el nombre de la tabla para obtener el valor de la pendiente.
    SELECT regression_slope('test_voltage');
    

    Esto devolverá el valor de la pendiente, que representa la tasa de cambio de voltaje a lo largo del tiempo. Podemos utilizar este valor para determinar si el voltaje está cargando o descargando.

    1. Para obtener el resultado esperado como se muestra en la pregunta, necesitamos utilizar una sentencia CASE para clasificar el voltaje como “cargando” o “inactivo”.
    SELECT voltage, time, 
      CASE 
        WHEN regression_slope('test_voltage') > 0 THEN 
          CASE WHEN voltage > 0 THEN 'cargando'
               ELSE 'inactivo'
          END
        ELSE 'inactivo'
      END
    FROM test_voltage;
    

    Esta consulta devolverá una tabla con el voltaje, el tiempo y el estado de carga/inactivo basado en la pendiente de la línea de regresión.

Comments are closed.