Le moyen le plus rapide d'itérer sur une table de donnéesBonjour,
Nous disposons d'une table JMP contenant des millions de lignes (données image), et chaque opération est coûteuse et chronophage. Cependant, nous devons ajouter une nouvelle colonne qui sera calculée à partir des autres colonnes.
Quel est le moyen le plus rapide de procéder avec de grands ensembles de données ? Nous utilisons actuellement la fonction « Définir la formule » sur la colonne, mais son application est longue et, de plus, la formule est susceptible d'être modifiée plusieurs fois au cours de l'analyse. Devrions-nous utiliser des vecteurs « Récupérer les valeurs » ou une méthode similaire ? J'ai également vu la fonction « Pour chaque ligne ». N'hésitez pas à me faire part de vos commentaires et suggestions.Automatisation et scriptsAnalyse et modélisation des données de baseRe : Le moyen le plus rapide d'itérer sur une table de donnéesSouvent, abandonner le JSL ligne par ligne conventionnel au profit d'opérations matricielles permet un traitement plus rapide. Cependant, il serait utile de fournir un exemple des formules que vous utilisez.
Re : Le moyen le plus rapide d'itérer sur une table de donnéesBonjour,
Merci pour votre réponse.
Pour plus de contexte : voici un script avec un exemple de la formule que j'utilise. À partir des coordonnées X/Y de l'image, je la divise en zones, soit 20 au total à ma date réelle. Si la classification des zones est incorrecte, je modifierai la formule ; c'est pourquoi je précise que nous utiliserons fréquemment des formules prédéfinies.
dt = New Table( "Reprex",
Add Rows( 1000000 ),
New Column( "X", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) ),
New Column( "Y", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) )
);
R_debut_X = 10;
largeur = 50;
ecart_X = 5;
debut_Y = 20;
hauteur = 30;
ecart_Y = 5;
// Slow way: row formula
dt << New Column( "Zone_slow", Character,
Formula(
If( R_debut_X < :X <= R_debut_X + largeur & debut_Y < :Y <= debut_Y + hauteur, "Zone 1",
R_debut_X + largeur + ecart_X < :X <= R_debut_X + 2*largeur + ecart_X & debut_Y < :Y <= debut_Y + hauteur, "Zone 2",
"Other"
)
)
);
Re : Le moyen le plus rapide d'itérer sur une table de données@txnelson a raison, une matrice pourrait améliorer la vitesse. Assurez-vous d'utiliser <
dt = New Table( "Reprex",
Add Rows( 1000000 ),
New Column( "X", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) ),
New Column( "Y", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) )
);
R_debut_X = 10;
largeur = 50;
ecart_X = 5;
debut_Y = 20;
hauteur = 30;
ecart_Y = 5;
start = hptime();
// Slow way: row formula
dt << New Column( "Zone_slow", Character,
Formula(
If( R_debut_X < :X <= R_debut_X + largeur & debut_Y < :Y <= debut_Y + hauteur, "Zone 1",
R_debut_X + largeur + ecart_X < :X <= R_debut_X + 2*largeur + ecart_X & debut_Y < :Y <= debut_Y + hauteur, "Zone 2",
"Other"
)
)
);
dt<
<RUNFORMULAS></RUNFORMULAS>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Craige_Hales_0-1758807317326.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Craige_Hales_0-1758807317326.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="Craige_Hales_0-1758807317326.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/83489iE50BBC18E746B0D5/Craige_Hales_0-1758807317326.png" role="button" title="Craige_Hales_0-1758807317326.png" alt="Craige_Hales_0-1758807317326.png" /></span></SPAN></SPAN></P> <BR /> <P>La valeur résultante utilise la valeur de vérité 0 ou 1 de cmatxy1,2 pour générer les valeurs 0, 1 ou 2 pour other, zone1 et zone2. Vous pourriez probablement réduire certaines instructions de la matrice pour accélérer le processus, si cela est important.</P> <BR />
Re : Le moyen le plus rapide d'itérer sur une table de donnéesMerci beaucoup, c'est beaucoup plus rapide maintenant !