Come migliorare le prestazioni durante la trasformazione di colonne categoriali in numericheEstraggo i dati, elaboro i dati lungo la linea di produzione, da un database che restituisce i dati come coppie valore parametro (il valore può mancare).
Uso una suddivisione della tabella per avere dati con parametro come colonna (sono previsti più elementi mancanti in molte colonne).
Quindi eseguo uno script per convertire i caratteri in numerici quando appropriato.
Il problema è che il numero di colonne può essere molto alto, nel mio esempio circa 60000 (11 righe nell'esempio)
Quindi, nel mio esempio, ho 8 secondi per recuperare i dati dal database,
18 secondi per applicare l'algoritmo che controlla tutte le colonne che diventano 80 secondi per trasformare anche la colonna.
Qualcuno può suggerire un modo più efficiente per avere il risultato finale?
Questo è l'algoritmo che ho utilizzato:
names = <FONT face="Courier New" size="3">current data table()</FONT> << Get Column Names( Character, String );
for(I = 1, I <=N items(names), I++,
values= column( names[I]) << get values;
numerical=1;
for(j=1, j<=N items(values),j++,
if(!Is Missing(values[j]) & Is Missing( Num(values[j]) ),
numerical=0;
break();
);
);
if(numerical,
column( names[I]) << data Type("Numeric") << set Modeling Type ("Continuous");
);
);ScriptingOggetto: Come migliorare le prestazioni durante la trasformazione di colonne categoriali in numericheForse funziona più velocemente?
Evita il ciclo attraverso le righe e consente agli algoritmi di tabella di JMP di funzionare, supponendo che siano più efficienti.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// set all columns to character
For( i = 1, i <= N Cols( dt ), i++,
Column( i ) << set data type( character )
);
wait(3);
// copy data table
dt_copy = dt << Subset( All rows, Selected columns only( 0 ) );
// Convert only numerics, use copied table for testing
For( i = 1, i <= N Cols( dt ), i++,
Column( dt_copy, i ) << set data type( numeric );
If( Col N Missing( Column( dt_copy, i ) ) == Col N Missing( Column( dt, i ) ),
Column( dt, i ) << set data type( numeric ) << set modeling type( continuous )
);
);
Close(dt_copy, nosave );
Oggetto: Come migliorare le prestazioni durante la trasformazione di colonne categoriali in numericheIl debugger JSL ha anche un profiler che mostrerà quali istruzioni stanno utilizzando più tempo. Non è ovvio per me perché 60.000 colonne per 11 righe dovrebbero richiedere così tanto tempo, ma il profiler potrebbe suggerire qualcosa. (Se stavo indovinando, potrei indovinare l'effettivo cambiamento da carattere a numerico, non tutto il ciclo.)
Utilizzando il profiler del debugger: scegli lo script di debug, quindi premi l'icona #clock e quindi premi il pulsante go.
Premere prima l'icona #clock
il risultato
Colori della mappa termica!
Oggetto: Come migliorare le prestazioni durante la trasformazione di colonne categoriali in numericheMetodo molto intelligente, George! Purtroppo le prestazioni sono peggiori di quella che ho usato. Il motivo è che applica il cambio di colonna due volte, essendo
il tipo di colonna cambia l'operazione che richiede più tempo, come ho confermato applicando il suggerimento di Craige per valutare le prestazioni dell'istruzione.
Ho fatto un'altra analisi, "anonimizzando" la tabella (ciò significa cambiare solo i dati dei caratteri, sia i dati di colonna che di riga).
Le prestazioni sono migliorate da 80 secondi a 55 secondi. Ciò suggerisce che le stringhe hanno un impatto significativo (8315 colonne di caratteri contro 55729 numeriche)
Ho allegato il confronto tra i due metodi e la tabella dati che ho utilizzato.