Comment améliorer les performances lors de la transformation d'une colonne catégorielle en numériqueJ'extrais des données, traite des données le long de la ligne de production, à partir d'une base de données qui renvoie des données sous forme de couples paramètre-valeur (la valeur peut être manquante).
J'utilise une table fractionnée pour avoir des données avec un paramètre comme colonne (plus de données manquantes sont attendues dans de nombreuses colonnes).
Ensuite, j'exécute un script pour convertir un caractère en numérique le cas échéant.
Le problème est que le nombre de colonnes peut être très élevé, dans mon exemple autour de 60000 (11 lignes dans l'exemple)
Donc, dans mon exemple, j'ai 8 secondes pour récupérer les données de la base de données,
18 secondes pour appliquer l'algorithme qui vérifie toutes les colonnes qui deviennent 80 secondes pour transformer également la colonne.
Quelqu'un peut-il suggérer un moyen plus efficace d'obtenir le résultat final?
C'est l'algorithme que j'ai utilisé:
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");
);
);ScriptingRe: Comment améliorer les performances lors de la transformation d'une colonne catégorielle en numériquePeut-être que cela fonctionne plus rapidement?
Il évite la boucle entre les lignes et laisse les algorithmes de table de JMP fonctionner, en supposant qu'ils sont plus efficaces.
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 );
Re: Comment améliorer les performances lors de la transformation d'une colonne catégorielle en numériqueLe débogueur JSL a également un profileur qui montrera quelles instructions utilisent le plus de temps. Je ne vois pas pourquoi 60 000 colonnes sur 11 lignes devraient prendre autant de temps, mais le profileur pourrait suggérer quelque chose. (Si je devinais, je devinerais peut-être le changement réel du caractère au numérique, pas toute la boucle.)
À l'aide du profileur du débogueur - sélectionnez le script de débogage, puis appuyez sur l'icône #clock, puis sur le bouton aller.
Appuyez d'abord sur l'icône #clock
le résultat
Couleurs de la carte thermique!
Re: Comment améliorer les performances lors de la transformation d'une colonne catégorielle en numériqueMéthode très intelligente, George! Malheureusement, les performances sont pires que celle que j'ai utilisée. La raison en est qu'il applique deux fois le changement de colonne, étant
le type de colonne change l'opération la plus longue, comme j'ai confirmé l'application de la suggestion de Craige pour évaluer les performances de l'énoncé.
J'ai fait une autre analyse, en "anonymisant" le tableau (cela signifie ne changer que les données de caractères, à la fois les données de colonne et de ligne).
Les performances sont passées de 80 secondes à 55 secondes. Cela suggère que les chaînes ont un impact significatif (8315 colonnes de caractères contre 55729 numériques)
J'ai joint la comparaison entre les deux méthodes et le tableau de données que j'ai utilisé.
Re: Comment améliorer les performances lors de la transformation d'une colonne catégorielle en numériqueVoici une autre option à essayer. Après votre lecture initiale des données de votre machine de production, enregistrez le fichier jmp dans un emplacement temporaire en tant que fichier csv. Puis retournez-vous et relisez-le. Vous pouvez définir le nombre de lignes qu'il lit pour déterminer si le fichier est numérique ou caractère, puis il le lit. Comme cela utilise du code C ++, il peut y avoir un gain de temps significatif.