Problema con el script para eliminar mediciones redundantes específicas de ciertas condicionesTengo una tabla de datos que se compone de varias filas de medidas individuales en serie que estoy recortando antes de hacer una función de división de tabla, sin embargo, tengo un problema con algunas medidas redundantes que me gustaría eliminar, pero el código actual no Estoy usando es extremadamente lento y probablemente ineficiente para lo que necesito.
Información de contexto:
- Cada fila es el resultado de una medición automatizada individual en una pieza de material realizada en serie y produce un informe con las siguientes columnas:
- Un ID de pieza único asignado a cada pieza individual de material [ ID de pieza ]
- El ID de lote asociado con la materia prima utilizada para crear la pieza individual de material [ID de lote]
- El valor de medición real para la medición realizada [Valor]
- Resultado de la medición asignado en función del valor de la medición (Pasa/Falla/Reelaboración) [Resultado]
- Marca de tiempo de la medición [Fecha_creada]
Mi equipo produce docenas de filas de mediciones por pieza de material y procesa miles de piezas de material por informe; esos informes luego se introducen en JMP como mi tabla de datos original.Cada informe también contiene varios lotes, por lo que la tabla de datos tiene varias referencias a "PartID = 1" porque a cada lote se le asigna un número secuencial que comienza en 1, por lo que necesito usar tanto PartID como LotID para referirme a una determinada pieza de material.En el caso de que el resultado sea "Retrabajo", el equipo de medición detiene cualquier medición adicional en esa pieza individual de material, reorienta la pieza de material y la devuelve al inicio de la línea volviendo a medir todas las pruebas anteriores en la misma. pero conservando el mismo ID de pieza único que estaba asociado con la pieza de material.
Resultado deseado:
Quiero usar un script para revisar la tabla de datos y eliminar todas las medidas hasta (e incluyendo) el resultado del retrabajo, ya que después del retrabajo todas las medidas se repiten y el retrabajo puede afectar los valores de medición.Para hacer esto, actualmente estoy usando el script JSL para recorrer cada fila y hacer lo siguiente:
- Identificar si el resultado es "Retrabajo"; si es así entonces haz lo siguiente:
- Identifique el PartID para la pieza dada de material como "xPartID"
- Identifique el LotID para la pieza dada de material como "xLot"
- Identifique Date_Created para la medida dada como "xDate"
- Seleccione y elimine todas las filas donde (PartID = xPartID) y (LotID = xLot) y (Date_Created <= xDate)
- Si el resultado no es "Reelaboración", entonces salga del ciclo, no es necesario continuar.
Sigo teniendo ralentizaciones extremas y, básicamente, el código hace que el programa se bloquee.Si lo ejecuto paso a paso, parece funcionar, pero si lo dejo correr, eventualmente muere. Aquí está el código real:
//Recoding the two potential "Rework" results into a shared value "aRework"; putting the letter "a" in front of it so if I sort by the column ascending then all of these values are at the start of the list, to hopefully make it easier and faster to process them.
dt << Recode Column(
dt:result,
{Map Value(
_rcOrig,
{"FailOnHighRework", "aRework",
"FailOnLowRework", "aRework"},
Unmatched( _rcNow )
)},
Update Properties( 1 ),
Target Column( :result )
);
//Sorting the table using the result column after the recode, so all of the rework rows are at the start of the table
SortColumn = "result";
dt << Sort( By( :result ), Replace Table, Order( Ascending ), Suppress formula evaluation( 1 ) );
//now run the row-by-row script
dt << begin data update;
for each row(
If( :result == "aRework",
xRow = Row();
xPartID=:PartID[Row()];
xLot=:lot[Row()];
xDate=:date_created[Row()];
dt <<SELECT where=""></SELECT>Estoy en JMP 16.2.0 (570548).
secuencias de comandosRe: Problema con el script para eliminar mediciones redundantes específicas de ciertas condicionesCreo que se está encontrando con un problema en el que está recorriendo una tabla de datos usando For Each Row, y sigue cambiando la tabla por la que está recorriendo eliminando filas, y el ciclo se está confundiendo.
Aquí hay una pieza de código no probada que creo que eliminará el problema y debería ejecutarse de manera bastante eficiente.
Names Default To Here( 1 );
//Recoding the two potential "Rework" results into a shared value "aRework"; putting the letter "a" in front of it so if I sort by the column ascending then all of these values are at the start of the list, to hopefully make it easier and faster to process them.
dt << Recode Column(
dt:result,
{Map Value( _rcOrig, {"FailOnHighRework", "aRework", "FailOnLowRework", "aRework"}, Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( :result )
);
dt << select where( :result == "aRework" );
dt2 = dt << subset( selected rows( 1 ), selected columns( 0 ) );
// Remove aRework rows from original table
dt << delete rows;
// Loop across the aRework table and delete rows in orininal table
For( i = 1, i <= N Rows( dt2 ), i++,
dt << select where(
(dt:partid == dt2:PartID[i] & dt:lot == dt2:Lot[i] & dt:date_created <= dt2:Date_created[i]);
If( N Rows( dt << get selected ) > 0,
dt << delete rows
);
)
);
close( dt2, nosave );
No tenía una tabla de datos de muestra para trabajar, por lo que el código no está probado, pero el enfoque debería permitirle solucionar cualquier problema y hacer que funcione.
Re: Problema con el script para eliminar mediciones redundantes específicas de ciertas condiciones¡Hola y gracias!
Estoy ejecutando el script en mi tabla de datos ahora; Creo que definitivamente tenía razón en mi iteración a través de las filas en una tabla que está considerando eliminar activamente la fila, lo que probablemente estaba interfiriendo con la lógica del bucle.
Estoy ejecutando el código en mi tabla de datos ahora y le informaré.También intentaré ver si puedo desinfectar algún fragmento de mi tabla de datos para permitirme incluirlo en esta publicación.¡Muchas gracias por tu asistencia!
Re: Problema con el script para eliminar mediciones redundantes específicas de ciertas condicionesAquí hay una versión de la secuencia de comandos que se imprime después de que se hayan procesado cada 100 filas en dt
dt = Current Data Table();
dt << select where( :result == "aRework" );
dt2 = dt << subset( selected rows( 1 ), selected columns( 0 ) );
// Remove aRework rows from original table
dt << delete rows;
// Loop across the aRework table and delete rows in orininal table
//dt << begin data update;
start = 1;
end = 0;
alldt2 = N Rows( dt2 );
While( N Rows( dt2 ) > 100,
TotalRows = N Rows( dt2 );
If( TotalRows > 100,
TotalRows = 100
);
end = end + TotalRows;
For( i = 1, i <= TotalRows, i += 1,
dt << select where(
dt:partid == dt2:PartID[i] & dt:lot == dt2:Lot[i] & dt:date_created <= dt2
:Date_created[i]
);
If( N Rows( dt << get selected rows ) > 0,
dt << delete rows
);
);
//dt << end data update;
dt2 << delete rows( 1 :: 100 );
Show(
"Rows " || Char( start ) || " to " || Char( end ) || " of " || Char( alldt2 ) ||
" processed"
);
);
Close( dt2, nosave );
También puede configurarlo para que solo procese x número de filas y luego volver a ejecutarlo para procesar más filas.
Re: Problema con el script para eliminar mediciones redundantes específicas de ciertas condicionesHola,
El script parece estar funcionando según lo previsto, y cuando se ejecuta en un conjunto de datos muy pequeño (10k filas en total) parece ser bueno y rápido, sin embargo, estoy teniendo ralentizaciones significativas con el conjunto de datos real con el que estoy trabajando (1,6 millones de filas ) de modo que no puedo decir si está matando el programa (no responde, lo dejó funcionando durante aproximadamente 1,5 horas y aparentemente todavía estaba funcionando, pero el proceso no respondió y finalmente tuvo que "Finalizar tarea" a través del administrador de tareas) - ¿Algún consejo sobre cómo mejorar?Correr contra 10k filas tomó tal vez <10 segundos, por lo que espero que para 1.6 millones tomaría tal vez 30 minutos si se escalara linealmente, pero ese no parece ser el caso.
Estoy cargando un subconjunto desinfectado de la tabla de datos como referencia con la mejora de secuencia de comandos sugerida guardada en la tabla de datos.La tabla desinfectada solo tenía un único LotID presente, pero este no suele ser el caso y es solo para minimizar el tamaño total del archivo para cargar.
Aquí está la versión actual de la secuencia de comandos que estoy tratando de ejecutar en la tabla:
dt = current data table();
dt << select where( :result == "aRework" );
dt2 = dt << subset( selected rows( 1 ), selected columns( 0 ) );
// Remove aRework rows from original table
dt << delete rows;
// Loop across the aRework table and delete rows in orininal table
dt << begin data update;
TotalRows=N Rows(dt2);
For( i = 1, i <= N Rows( dt2 ), i+=1,
dt << select where(dt:partid == dt2:PartID[i] & dt:lot == dt2:Lot[i] & dt:date_created <= dt2:Date_created[i]);
If( N Rows( dt << get selected rows ) > 0,
dt << delete rows
);
);
dt << end data update;
close( dt2, nosave );
Una vez más, ¡muchas gracias por la ayuda!