La forma más rápida de iterar sobre una tabla de datosHola,
Tenemos una tabla JMP con millones de filas (datos de imagen), y cada operación es costosa y requiere mucho tiempo. Sin embargo, necesitamos agregar una nueva columna que se calculará a partir de las demás.
¿Cuál es la manera más rápida de hacer esto con conjuntos de datos grandes? Actualmente, usamos "Establecer fórmula" en la columna, pero su aplicación tarda mucho y, además, es probable que la fórmula se modifique varias veces durante el análisis. ¿Deberíamos usar vectores "obtener valores" o algo similar? También he visto la función "para cada fila". Agradecería cualquier comentario o sugerencia.Automatización y scriptingAnálisis y modelado de datos básicosRe: La forma más rápida de iterar sobre una tabla de datosMuchas veces, dejar de lado el JSL convencional fila por fila y optar por operaciones matriciales agiliza el procesamiento. Sin embargo, sería útil que proporcionaras un ejemplo de las fórmulas que utilizas.
Re: La forma más rápida de iterar sobre una tabla de datosHola,
Gracias por su respuesta.
Para añadir más contexto: A continuación se muestra un script con un ejemplo de la fórmula que utilizo. Basándome en las coordenadas X/Y de la imagen, la divido en zonas, 20 en total en mi fecha real. Si la clasificación de las zonas no es correcta, modifico la fórmula, por lo que digo que usaremos frecuentemente fórmulas fijas.
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: La forma más rápida de iterar sobre una tabla de datos@txnelson tiene razón, una matriz podría mejorar la velocidad. Asegúrate de usar <
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>El valor resultante utiliza el valor de verdad 0 o 1 en cmatxy1,2 para generar el valor 0, 1 o 2 para otros valores, como la zona 1 y la zona 2. Si es importante, podrías contraer algunas sentencias de la matriz para agilizar el proceso.</P> <BR />
Re: La forma más rápida de iterar sobre una tabla de datosMuchas gracias, ¡ahora es mucho más rápido!