Come automatizzare l'analisi per i dati cicliciCara comunità JMP,
Ho un forno che cambia continuamente la temperatura (da caldo a freddo, poi da freddo a caldo e così via...).
Il forno fornisce la registrazione della temperatura in base al tempo.
Se tracciamo la temperatura sull'asse Y e il tempo sull'asse X, otteniamo il grafico allegato.
Dobbiamo calcolare qual è la velocità di variazione della temperatura entro un intervallo specifico di temperatura (in questo caso tra 0 °C e 130 °C).
Per esempio:
Le informazioni contrassegnate in verde si riferiscono a una rampa di discesa (da 130dgc a 0dgc).
Con il tempo rispettivo possiamo quindi calcolare la variazione della temperatura (130 diviso per la differenza di tempo).
Le informazioni contrassegnate in viola si riferiscono all'aumento graduale (da 0dgC a 130dgc).
Poi facciamo lo stesso per calcolare la velocità di variazione della temperatura.
Il verde (rampa in discesa) e il viola (rampa in salita) = 1 ciclo
In questo caso, dobbiamo calcolare l'intera rampa di salita e discesa per tutti i diversi cicli qui descritti.
In realtà, a scopo di esempio, mostriamo solo alcuni cicli, ma in realtà i cicli sono centinaia.
La mia domanda è: come calcoliamo la rampa di salita e di discesa per ogni ciclo e come li memorizziamo in un'altra tabella dati?
Naturalmente si può anche fare manualmente, ma è troppo noioso.
Esiste un modo automatizzato o "più semplificato" per farlo?
Allego i dati.
Il forno registra solo 2 colonne di dati (tempo e temperatura). Non ci sono dati per il ciclo (1° ciclo, 2° ciclo... ecc.).
Mi scuso per la lunga e-mail e grazie per i consigli.
Fratello,
Cristo
Automazione e scriptingEsplorazione e visualizzazione dei datiRe: Come automatizzare l'analisi per i dati cicliciPuoi farlo ad esempio utilizzando le formule. Potresti iniziare aggiungendo la colonna di stato

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"
)
Da lì è possibile aggiungere altri calcoli.
Re: Come automatizzare l'analisi per i dati cicliciCiao @ChrisLooi ,
Insieme a ciò che @jthi stava pensando, volevo aggiungere altro JSL che potesse aiutare ad automatizzarlo per le centinaia (migliaia?) di cicli che potresti dover gestire. Di seguito è riportato un codice che dovrebbe funzionare per l'intero set di dati, anche se è stato testato solo per quello che hai fornito (grazie, farlo aiuta davvero molto!). Non ho commentato il codice, ma se c'è una parte che non ha senso, fammelo sapere e ti spiegherò cosa fa.
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 );
Naturalmente è possibile renderlo più flessibile aggiungendo la possibilità di modificare l'intervallo di temperatura di interesse (in questo caso è codificato come 0 e 130), ma ciò aggiunge anche un po' più di complessità.
Comunque, spero che questo ti sia utile!
S.S.
Re: Come automatizzare l'analisi per i dati cicliciGrazie a jthi e SDF1 per l'aiuto. Lo apprezzo.