El bucle JSL que agrega estadísticas por ID de ejecución para varias columnas lleva añosHola chicos.
Necesito su consejo con lo siguiente.
Busqué en este bucle que busca todas las columnas numéricas que su nombre comienza con "MEAS" (para la medición) y creo nuevas columnas de estadísticas basadas en los datos de esas columnas agrupadas por datos de runid.
El bucle está funcionando, pero lleva años completarlo, ¿alguna idea de por qué? ¿O qué se puede hacer para mejorarlo?
Gracias
dt_ncol=ncol(dt);
for(i=1,i<=dt_ncol,i++,
if(column(i)<<GET data="https://community.jmp.com/" type="="Numeric""></GET>
Re: bucle JSL que agrega estadísticas por ID de ejecución para varias columnas demoraMorgen thx para su repetición.
No podría agradecerle a tiempo, pero por casualidad tomé su consejo para resumir los datos dentro de una tabla temporal y actualizar las nuevas columnas de esa tabla en la principal.
Lo hice de forma un poco diferente a la secuencia de comandos que sugirió, principalmente debido a un problema que tuve con el uso de un nombre de lista en los cálculos de resumen (Media (cols)).
De todos modos, se me ocurrió este breve guión que funciona perfectamente para mí:
// Añadir estadísticas de mediciones
// Listar nombres de columnas relevantes
meascol = dt << obtener nombres de columna (numérico);
Measnc = N Artículos (meascol);
meascollist = {};
Para (i = 1, i <= measnc, i ++,
Si (Contiene (meascol [i], "MEAS"),
Insertar en (meascollist, meascol [i])
));
// Resumen de columnas relevantes y tabla de actualización
para (k = 1, k <= n elementos (meascollist), k ++,
dt << resumen (
Grupo (: RUNID),
Media (char (meascollist [k])),
Max (char (meascollist [k])),
Min (char (meascollist [k])),
nombre de la tabla de salida ("tempmeas")
);
dt << Actualizar (
Con (tabla de datos ("tempmeas")),
Coincidir con las columnas (: RUNID =: RUNID)
);
cerrar (tabla de datos ("tempmeas"), sin guardar));
Re: bucle JSL que agrega estadísticas por ID de ejecución para varias columnas demoraMorgen thx para su repetición.
No podría agradecerle a tiempo, pero por casualidad tomé su consejo para resumir los datos dentro de una tabla temporal y actualizar las nuevas columnas de esa tabla en la principal.
Lo hice de forma un poco diferente a la secuencia de comandos que sugirió, principalmente debido a un problema que tuve con el uso de un nombre de lista en los cálculos de resumen (Media (cols)).
De todos modos, se me ocurrió este breve guión que funciona perfectamente para mí:
// Añadir estadísticas de mediciones
meas_ncol = n col (dt);
// Listar nombres de columnas relevantes
meascol = dt << obtener nombres de columna (numérico);
Measnc = N Artículos (meascol);
meascollist = {};
Para (i = 1, i <= measnc, i ++,
Si (Contiene (meascol [i], "MEAS"),
Insertar en (meascollist, meascol [i])
));
// Resumen de columnas relevantes y tabla de actualización
para (k = 1, k <= n elementos (meascollist), k ++,
dt << resumen (
Grupo (: RUNID),
Media (char (meascollist [k])),
Max (char (meascollist [k])),
Min (char (meascollist [k])),
nombre de la tabla de salida ("tempmeas")
);
dt << Actualizar (
Con (tabla de datos ("tempmeas")),
Coincidir con las columnas (: RUNID =: RUNID)
);
cerrar (tabla de datos ("tempmeas"), sin guardar));
Re: bucle JSL que agrega estadísticas por ID de ejecución para varias columnas demoraEsto lleva tiempo debido a la cantidad de cálculos (orden) y al procesamiento (dibujo) de los valores de la tabla. Además, las fórmulas de columna podrían estar disminuyendo su velocidad en comparación con el uso de valores.
Tenga en cuenta que el método que está utilizando es encontrar y calcular las filas runid, por (: runid), 3 veces para cada columna. Dos métodos alternativos son:
- Usa la manipulación de tablas y olvida las fórmulas de columnas. A continuación se muestra un script de ejemplo, que utiliza la tabla de datos de muestra JMP Semiconductor Capability.jmp
- Agregar una columna de secuencia, la llamo seq que es row (). Use Summarize (rid = By (: runid), ibeg = Min (: seq), iend = Max (: seq)). Luego usa las asignaciones de tablas. No mostré un ejemplo de estos métodos porque creo que sería más lento que las manipulaciones de la tabla.
Names Default to Here(1);
dt = Open("$sample_data/semiconductor Capability.jmp");
//change lot_id column name to runid
dt:lot_id << set name("runid");
//select the columns here. I will just use columns with a name that starts with I
cols = {};
for(i=5, i<=ncol(dt), i++,
nme = column(dt,i) << get name;
if( substr(nme, 1, 1) == "I", insert into(cols, nme) );
);
sumdt = dt << Summary( Group(:runid), Mean(cols), Max(cols), Min(cols),
statistics column name format( "column stat" ), Invisible,
Link to original data table( 0 )
);
ord = {"runid"};
for(i=1, i<=ngrp, i++,
nme = cols[i];
column(sumdt, nme || "Mean") << Set Name(nme || "_MEAN");
column(sumdt, nme || "Min") << Set Name(nme || "_MIN");
column(sumdt, nme || "Max") << Set Name(nme || "_MAX");
insert into( ord, eval list({nme||"_MEAN", nme||"_MIN", nme||"_MAX"}))
);
newdt = sumdt << Subset( All Rows, Columns(ord), Invisible );
close(sumdt, NoSave);
wait(0);
dt2 = dt << Join(
With( newdt ),
By Matching Columns( :runid = :runid ),
Merge Same name columns(1),
Match Flag(0),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 )
);
close(newdt,NoSave);
nme = dt << get name;
Close(dt, NoSave);
dt = dt2;
dt << set name(nme);
dt << delete scripts("Source");Un buen JSL sería tener un mensaje de tabla de datos a Ordenar por (lista), dt << Ordenar columnas por (mylist) o dt << Mover columnas (lista, Después | Antes | Hasta Último | Hasta primero). Actualmente, encuentro el subconjunto (Columnas (lista)) el más rápido.