Cómo automatizar el análisis de datos cíclicosEstimada comunidad de JMP:
Tengo un horno que cambia la temperatura continuamente (de caliente a fría, luego de fría a caliente y repite...).
El horno proporciona registro de la temperatura en función del tiempo.
Si graficamos la temperatura en el eje Y y el tiempo en el eje X, obtenemos el gráfico adjunto.
Necesitamos calcular cuál es la tasa de cambio de temperatura dentro de un rango específico de temperatura (en este caso entre 0 °C y 130 °C).
Por ejemplo:
La información marcada en verde se refiere a una reducción gradual (de 130 dgc a 0 dgc).
Con el tiempo respectivo entonces podemos calcular la tasa de cambio de temperatura (130 dividido por la diferencia horaria).
La información marcada en púrpura se refiere al aumento gradual (de 0 dgC a 130 dgC).
Luego hacemos lo mismo para calcular la tasa de cambio de temperatura.
El verde (rampa descendente) y el morado (rampa ascendente) = 1 ciclo
En este caso, necesitamos calcular todas las rampas de subida y bajada para todos los ciclos aquí.
En realidad, a modo de ejemplo sólo mostramos algunos ciclos, pero en realidad hay cientos de ciclos.
Mi pregunta es ¿cómo calculamos la aceleración y la desaceleración de cada ciclo y las almacenamos en otra tabla de datos?
Por supuesto, se puede hacer manualmente, pero es demasiado tedioso.
¿Existe alguna forma automatizada o "más simplificada" de hacer esto?
Adjunto los datos.
El horno solo registra 2 columnas de datos (tiempo y temperatura). No hay datos para el ciclo (primer ciclo, segundo ciclo, etc.).
Perdón por el correo tan largo y gracias por cualquier consejo.
Hno.,
Cristóbal
Automatización y scriptingExploración y visualización de datosRe: Cómo automatizar el análisis de datos cíclicosPuede hacerlo, por ejemplo, utilizando fórmulas. Puede comenzar agregando la columna de estado

If(
0 < :Temp Profile < 130 & Dif(:Temp Profile) < 0, curstate = "Down Ramp",
0 < :Temp Profile < 130 & Dif(:Temp Profile) > 0, curstate = "Ramp Up",
curstate = "No Ramp"
)
Desde allí podrás agregar más cálculos.
Re: Cómo automatizar el análisis de datos cíclicosHola @ChrisLooi ,
Junto con lo que @jthi estaba pensando, quería agregar algo más de JSL que pudiera ayudar a automatizarlo para los cientos (¿miles?) de ciclos con los que podrías estar lidiando. A continuación, se incluye un código que debería funcionar para todo el conjunto de datos, aunque se probó solo para el que proporcionaste (¡gracias, hacer eso realmente ayuda mucho!). No comenté el código, pero si hay alguna parte que no tenga sentido, házmelo saber y te explicaré lo que hace.
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "State",
"Character",
"Nominal",
Formula(
If(
0 <= :Temp Profile < 130 & Dif( :Temp Profile ) < 0, "Ramp down",
0 <= :Temp Profile < 130 & Dif( :Temp Profile ) > 0, "Ramp up",
"No Ramp"
)
)
);
dt << New Column( "Cycle No", "Numeric", "Ordinal" );
dt << New Column( "Phase", "Character", "Nominal" );
l = 1;
:"Cycle No"n[1] = 1;
For( i = 2, i <= N Rows( dt ) - 1, i++,
If(
(:State[i] == :State[i - 1]), :"Cycle No"n[i] = l,
((:State[i] != :State[i - 1]) & (:State[i] == "Ramp down" & :State[i - 1] == "No Ramp")),
:"Cycle No"n[i] = l;
:Phase[i] = "Start";,
((:State[i] != :State[i - 1]) & (:State[i] == "No Ramp" & :State[i - 1] == "Ramp down")),
:"Cycle No"n[i] = l;
:Phase[i - 1] = "End";,
((:State[i] != :State[i - 1]) & (:State[i] == "Ramp up" & :State[i - 1] == "No Ramp")),
:"Cycle No"n[i] = l;
:Phase[i] = "Start";,
((:State[i] != :State[i - 1]) & (:State[i] == "No Ramp" & :State[i - 1] == "Ramp up")),
:Phase[i - 1] = "End";
l++;
:"Cycle No"n[i] = l;
)
);
:"Cycle No"n[N Row( dt )] = l;
dt << Row Selection( Select Where( :Phase == "Start" ) );
dt << Row Selection( Select Where( :Phase == "End" ), Current Selection( "Extend" ) );
dtsubset = dt << Subset( Selected Rows( 1 ), Selected columns only( 0 ), Suppress Formula Eval( 1 ) );
dt << Clear Select;
dt_results = dtsubset << Summary(
Group( :State, :Cycle No ),
Mean( :Time ),
Mean( :Temp Profile ),
Subgroup( :Phase ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
Close( dtsubset, no save );
dt_results << New Column( "Temp Rate Change (°C/sec)",
"Numeric",
"Continuous",
Formula( (:"Temp Profile, End"n - :"Temp Profile, Start"n) / (:"Time, End"n - :"Time, Start"n) )
);
dt_results << Sort( By( :Cycle No, :"Time, End"n, :State ), Order( Ascending, Ascending, Ascending ), Replace Table, Suppress Formula Eval( 0 ) );
dt_results << Delete Columns( :"N Rows"n );
Por supuesto, puedes hacerlo más flexible agregando la capacidad de cambiar el rango de temperatura de interés (aquí está codificado como 0 y 130), pero eso también agrega un poco más de complejidad.
De todos modos, ¡espero que esto ayude!
DS
Re: Cómo automatizar el análisis de datos cíclicosGracias a jthi y SDF1 por la ayuda. Lo aprecio.