Sto riscontrando problemi nel far sì che Column Stats funzioni in un ciclo?Sto provando a scrivere uno script che rimuove i valori anomali da più colonne in una tabella usando un ciclo per esaminare il nome di ogni colonna e passare questo in una funzione che ha la seguente riga di codice per calcolare il 99 ° percentile.
test_upper_quantile = Col Quantile (Column (Test_Number), 0.99);
Quindi utilizzo un ciclo For Each Row per confrontare i valori con il percentile calcolato e rimuovere le righe che non rientrano in questo.
Il codice funziona bene se faccio solo una colonna tuttavia se imposto il ciclo con più colonne che leggono i nomi delle colonne nella variabile Test_Number, jmp usa sempre il valore del quantile prima calcolato per la prima colonna, non ricalcola per ogni colonna . Il ciclo sembra impostato correttamente poiché visualizza la variabile Test_Number nel log e questo cambia in modo che corrisponda alla colonna come previsto. Quindi se faccio 10 colonne ottengo i 10 nomi di colonne corretti visualizzati ma solo il quantile della prima colonna ripetuto 10 volte !!!
Inoltre, quando lo script termina se evidenzi la riga di codice sottostante, calcola il valore per l'ultima colonna che ha rilevato correttamente.
test_upper_quantile = Col Quantile (Column (Test_Number), 0.99);
Ho provato a cancellare il globale test_upper_quantile che contiene il valore quantile all'inizio della funzione, ma questo non fa differenza?
Qualche idea? Ho notato quando si passa il cursore sul comando quantile della colonna che dice di essere stato memorizzato nella cache. È questo il mio problema se è così c'è un modo per svuotare la cache?
Viene mostrata la funzione completa
remove_outliers = Funzione ({Test_Number},
mostra (test_number);
test_lower_quantile = Col Quantile (Column (Test_Number), 0.01);
test_upper_quantile = Col Quantile (Column (Test_Number), 0.99);
mostra (test_upper_quantile);
lower_cutoff = test_lower_quantile;
upper_cutoff = test_upper_quantile;
Per ogni riga (
If (Column (test_number) [] Escluso (Stato riga ()) = 1
);
Se (Column (numero_Prova) []> upper_cutoff,
Escluso (Stato riga ()) = 1
);
);
);
Il messaggio è stato modificato da: apedenRi: Ho problemi a far funzionare le colonne in un ciclo?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Prova la funzione As Column () per convertire ciò che ottieni dalla casella di riepilogo Col () << viene selezionato come riferimento di una colonna.
Nomi predefiniti qui ( 1 ) ;
dt = Aperto ( "$ SAMPLE_DATA / solubility.jmp" ) ;
nw = Nuova finestra ( "Seleziona colonne per quantili" ,
libbre = Col List Box ( tutti ) ,
Scatola dei pulsanti ( "Ok" ,
Cols = libbre << essere selezionato ;
nw << chiudi la finestra ;
)
) ;
Per ( io = 1 , io <= N articoli ( Cols ) , io ++,
Mostrare ( Col Quantile ( Come colonna ( Cols [ io ] ) , .5 ) )
) ;
-Jeff
Ri: Ho problemi a far funzionare le colonne in un ciclo?Ciao Jeff,
Il tuo codice funziona anche per me. È molto simile al mio codice, l'unica differenza che posso vedere è come viene generata la lista dei nomi delle colonne. Da una finestra di dialogo, io uso:
| | | | ButtonBox ( "Ok", |
| | | | | yParamNames = colListY << ottieni elementi; |
che restituisce un elenco di stringhe, ogni nome di colonna tra virgolette. colListY è una casella di riepilogo delle colonne compilata dall'utente.
Ho trovato una soluzione così così. Afferra tutto nella colonna invece di lasciare che JMP faccia il lavoro. Lo svantaggio della soluzione che vedo è che non ignora i dati nascosti ed esclusi a meno che non lo programmi manualmente.
tempList1 = {} ; tempList1 = colonna ( dtData , yParamList [ io ]) << ottenere come matrice ; medVal [ io ] = quantile ( 0.5 , tempList1 ) ; q1Val [ io ] = quantile ( 0.25 , tempList1 ) ; q3Val [ io ] = quantile ( 0.75 , tempList1 ) ; // medVal = col quantile (colonna (dtData, yParamList ), 0,5); // q1Val = col quantile (colonna (dtData, yParamList ), 0,25); // q3Val = col quantile (colonna (dtData, yParamList ), 0,75); | |
Ri: Ho problemi a far funzionare le colonne in un ciclo?Forse potresti pubblicare del codice che ti crea difficoltà.
Questo funziona per me:
dt = Aperto ( "$ SAMPLE_DATA / Solubility.jmp" ) ;
nc = dt << ottieni i nomi delle colonne ( Numerico ) ;
per ( io = 1 , io <= nitems ( nc ) , io ++,
mostrare ( col quantile ( colonna ( nc [ io ]) , .5 )) ;
) ;
/ *:
Col Quantile (Colonna (nc ), 0,5) = 1,36;
Col Quantile (Colonna (nc ), 0,5) = 1,21;
Col Quantile (Colonna (nc ), 0,5) = 0,95;
Col Quantile (Colonna (nc ), 0,5) = 0,445;
Col Quantile (Colonna (nc ), 0.5) = -0.015;
Col Quantile (Colonna (nc ), 0,5) = -0,62;
Ri: Ho problemi a far funzionare le colonne in un ciclo?So che questo post ha anni, ma esiste una soluzione per questo problema? Sto vedendo esattamente la stessa cosa. L'uso di col quantile in un ciclo comporterà solo la prima iterazione del ciclo che viene memorizzata nella mia lista.
C'è un lavoro da fare per ottenere dati quantili che non coinvolgono la funzione col quantile ()? Non voglio davvero fare tabelle di riepilogo (sommario con dati quantili) perché aumenterà il tempo di esecuzione di diverse migliaia di colonne.
Grazie