Ho un file CSV che memorizza i valori temporanei. Devo trovare la media del gruppo per un determinato set di campioni in base ai passaggi seguenti:
1. Rendere tutti i le con valori temporanei maggiori di 25 uguali a zero iecolumn post_process
2. La colonna group_avg viene derivata ignorando le righe con maggiore o uguale a 4 zeri consecutivi. Seguito calcolando la media del gruppo di campioni come mostrato di seguito
3. la colonna final_average è i risultati generati dalla colonna group_avg
Come possiamo scrivere questo processo usando jsl?
Allegare il file csv
Il risultato finale è definitivo _average come nella tabella seguente:

Ecco uno script che crea la tabella dati con la sola colonna TEMP, quindi vengono create le colonne rimanenti e viene utilizzata la formula per popolarle.
Names Default To Here( 1 );
dt = New Table( "temp_temp",
Add Rows( 54 ),
New Column( "TEMP",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[23.23019577, 23.44946668, 23.56111955, 23.47601143, 23.36428639,
23.24016499, 32.42091411, 23, 32.26821731, 32.14990084, 32.42091411,
32.26821731, 32.14990084, 23.23019577, 23.44946668, 23.56111955,
23.47601143, 23.36428639, 23.24016499, 32.15353181, 32.16785998, 21,
32.502366, 32.16261133, 32.15757688, 32.16790474, 23.23019577,
23.44946668, 23.56111955, 23.47601143, 23.36428639, 23.24016499,
32.42091411, 10, 32.26821731, 32.14990084, 32.41334166, 32.17456755,
32.52383338, 32.17310331, 19.28571429, 19.28571429, 19.28571429,
19.28571429, 34.62948075, 34.28766971, 34.29470736, 34.61532486,
34.386807, 34.36554216, 34.58410721, 34.28726312, 23.57142857,
23.57142857]
)
)
);
dt << New Column( "post process", formula( If( :TEMP <= 25, 0, :TEMP ) ) );
dt:post process << delete formula;
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
Show( "start", Row(), flag );
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
Show( "cap", Row(), captureMatrix );
If( zeroCounter == 4 | Row() == N Rows( dt ),
For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);
value = Mean( captureMatrix );
Show( value );
Show( Row(), captureMatrix, zeroCounter, Index( 1, N Cols( captureMatrix ) - (zeroCounter - 1) ) );
flag = 0;
zeroCounter = 0;
Show( flag );
captureMatrix = [];
);
);
value;
)
);
dt << new column("final Avg",
formula(
if(row()==1,
theRows = current data table() << get rows where(isMissing(:group_avg)==0);
);
If(row()<= nrows(theRows),
value=:group_avg[theRows[Row()]],
value=.
)
)
);
Questo script funziona bene per file di piccole dimensioni. Ma in caso di file di grandi dimensioni in cui abbiamo 16000 zeri invece di 4, JMP smette di rispondere. C'è un modo per impedirlo ed eseguire lo script senza bloccarsi?
Sospetto che il problema sia che, per errore, ho lasciato diverse istruzioni "Show ()" nel codice, che hanno costretto a scrivere molto nel log di JMP.
Di seguito è riportata la specifica della colonna "post-elaborazione", che è la parte che presumo stia avendo il problema che causa il blocco di JMP.Prova a eseguirlo e vedi se funzionerà senza bloccarsi
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
If( zeroCounter == 4 | Row() == N Rows( dt ),
/*For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);*/
if( Row() == N Rows( dt ), zerocounter++ );
value = Mean( captureMatrix[ 1:: ncols(captureMatrix) - (zeroCounter - 1)] );
flag = 0;
zeroCounter = 0;
captureMatrix = [];
);
);
value;
)
);Il primo script fornisce la risposta corretta ma l'output di entrambi gli script non è lo stesso, perché hai commentato una parte del codice
La seconda versione del codice è più efficiente. Data la quantità di dati in esecuzione, ho pensato che sarebbe stato d'aiuto.Dovrebbe fornire gli stessi risultati.In caso contrario, puoi provare a rimuovere tutte le istruzioni Show () dalla prima versione del codice e se funziona.