Grabaciones del Club de guionistas: consejos y trucosVídeo 1 @thickey1 : Gestión de tablas de datos.
- Modificar nombres de columnas.
- Método alternativo para hacer referencia a los nombres de columnas.
- Agregue o incorpore un script en la tabla. El usuario podrá ejecutarlo cuando lo desee.
(Archivos: Consejos y trucos y Sondeo)
Vídeo 2 @Georg : Consejos generales sobre cómo escribir scripts y utilizar el editor de scripts JMP
- plegado de código
- manejo de expresiones
- JSL en fórmulas
- eval (eval expr(algún código con expr(que se evaluará primero)))
- prueba sobre tipo de variables
- matriz asociativa
(Archivos: 20241120_Scripters_Club_tipps_and_tricks-inspec)
Vídeo 3 @Mauro_Gerber : Abrir múltiples importaciones y obtener la ruta de un script actual
(Archivos: SC-2024_ini y SC-2024_multi-import)
Vídeo 4 @Daniel_Valente : Descripción general de JMP Marketplace
https://marketplace.jmp.com/
No me atreví a poner Ndoubled a 10 : )
Mi sueño: un sistema rápido, dinámico y fácil de usar :folded_hands: está en especificaciones (valor)
Siguiendo con la idea de "asar nuestro código": ¿alguna idea para mejorar la velocidad?
¿Y cómo hacer que este enfoque sea accesible para otros usuarios con menos experiencia en JSL?


Re: Grabaciones del Scripters Club: consejos y trucosÉste es más rápido, pero no activa una actualización cuando se ajustan las especificaciones.
Así que por el momento: no hay ningún beneficio real en comparación con
para cada (... dt[0,colname] = ...)
o nueva columna(establecer valores())
Names Default To Here( 1 );
Ndoubled = 10;
dynamic = 1;
Try( Close( cdt, NoSave ) );
cdt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
Wait( 0 );
bigger = Expr(
cdt = cdt << concatenate( cdt, append to first table( 1 ) )
);
For( I = 1, i <= Ndoubled, i++, bigger );
col_lst = cdt << get column group( "Processes" );
Wait( 0 );
cdt << New Table Variable( "trigger update", 1 ); // can this be used to force an update?
cdt << begin data update();
t0 = HP Time();
If( dynamic,
col_lst = cdt << get column group( "Processes" );
For Each( {col}, col_lst,
col_Name = col << get name() || "_inSpecDynamic";
colnew = New Column( col_Name, Nominal );
col_Name = colnew << get name();
Eval(
Substitute(
Expr(
Column( col_Name ) << set Formula(
Local(
{t0 = As Constant(
dt = Current Data Table();
limits = _col_ << get property( "Spec Limits" );
nr = nrows(dt);
usl = limits["USL"];
lsl = limits["LSL"];
myRows = Where( _col_ > lsl & _col_ < usl );
NmyRows = N Items( myRows );
dt[0, _col_Name_] = J( nr, 1, 0 );
If( NmyRows,
dt[myRows, _col_Name_] = J( NmyRows, 1, 1 )
);
1
)},
Stop();
)
)
),
Expr( _col_ ), Name Expr( col ), Expr(_col_name_), col_name
)
);
cdt << move selected columns( {Column( col_name )}, after( col ) );
);
);
cdt << run formulas() << end data update();
Show( (HP Time() - t0) / 1000000 );
Wait( 0 );
Caption( "Process screening - don't dare ..." );
Stop();
// TEST THE RESULT
// check result in table visually
ps = cdt << Process Screening( Process Variables( Eval( col_lst ) ), Spec Limits Dialog( "No (skip columns with no spec limits)" ) );
ps << Color Out Of Spec Values( 1 );
ps << Close Window;
cdt << Clear Select << Clear Column Selection;
Re: Grabaciones del Scripters Club: consejos y trucosDer @hogi , gracias por analizar el código y la implementación adicional. Para la presentación, no me centré demasiado en la velocidad, etc., mi objetivo era mostrar diferentes formas y enfoques. En la vida real, la mejor implementación depende de las condiciones límite, por lo que creo que es específica para cada caso.
Si observa el flujo del programa, puede que no sea ideal extraer los límites de especificación en cada fila utilizando el método de fórmula, pero en algunos casos puede ser útil. Sin embargo, JMP puede mejorar internamente el programa en tiempo de ejecución evitando cálculos innecesarios. Me resulta imposible conocer todos estos detalles, pero es por eso que necesitamos probar diferentes enfoques.
Generalmente, cuando la velocidad es un factor importante, utilizaría las opciones de la plataforma, por ejemplo, a través de colores en el proceso de selección, porque supongo que están optimizadas para datos de gran tamaño.
Tal vez podamos volver a analizarlo durante la serie de pruebas. Y sí, una vez más, creo que in_spec sería una función incorporada muy buena. Solo la implementación puede volverse difícil cuando se cuidan todos los detalles; espero que los desarrolladores encuentren una buena manera.
Re: Grabaciones del Scripters Club: consejos y trucosPara comparar el rendimiento con el de la plataforma oficial, elimine o comente el stop().
Re: Grabaciones del Scripters Club: consejos y trucosUna cosa que hay que recordar sobre los límites de especificaciones son las especificaciones unilaterales. Pueden causar todo tipo de problemas divertidos.
Re: Grabaciones del Scripters Club: consejos y trucosSí, claro.
Por el bien de la simplicidad, creo que está bien utilizar especificaciones de dos lados.
La contabilización de especificaciones en un solo lado (o columnas sin ninguna especificación) es bastante sencilla, pero no hay que olvidarlo.
¿Tienes algún truco para acelerar el cálculo y hacerlo dinámico?
Re: Grabaciones del Scripters Club: consejos y trucosLo más probable es que dependa mucho del problema que se esté resolviendo (por lo que la solución depende mucho del caso de uso).
Re: Grabaciones del Scripters Club: consejos y trucoscaso de uso:
una nueva columna con una fórmula para generar valores 0/1 para valores fuera de especificación/dentro de especificación.
Si hay un error tipográfico en las especificaciones, o el usuario desea ajustar la especificación, los valores de la columna deberían actualizarse automáticamente (no deberían permanecer estancados con la configuración anterior).
Quizás para 10-30 columnas.
100k - 10 millones de filas.
Una solución que se puede compartir fácilmente con nuevos colegas que quieran utilizar JMP para analizar información de aprobación/desaprobación.
Re: Grabaciones del Scripters Club: consejos y trucosEsto podría desviarse un poco del tema:
Te faltan algunas especificaciones (?) (Me considero un solucionador profesional de problemas XY y realmente no creo que quieras ser uno):
- Entrada: solo una tabla de datos
- ¿Utilizar TODAS las columnas que tienen límites de especificación establecidos?
- Pero tenga en cuenta que es posible que estén configurados incorrectamente (un problema mucho mayor en mi opinión).
- ¿Qué tan incorrectamente? ¿Es posible que falten valores en ambos? ¿Los mismos valores en ambos incluso si tenemos una medición continua? ¿O simplemente valores "erróneos" (antes se podían tener valores "no evaluados" como límites de especificación en JMP que aún se mostraban como valores numéricos correctos. No estoy seguro de si esto sigue siendo así con JMP18).
- Un caso aparte es que el usuario quiera ajustarlos (consideraría este caso de uso diferente al de una sola columna con 0/1)
- ¿Cuál es el caso de uso? Estoy bastante seguro de que los usuarios no analizarán visualmente 30 columnas y 10 millones de celdas de una tabla.
- ¿Cómo están utilizando los resultados? ¿Podría implementarse el cálculo allí? -> ¿Tienen una plataforma personalizada para este tipo de trabajo?
Si tuviera que "resolver un problema" en este caso, empezaría por resolver los límites de especificación incorrectos, o quizás más bien la situación en la que se modifican. ¿Qué es lo que realmente intentas ver? Dudo mucho que sea tener una columna con 0/1 en función de los límites de especificación cuando tienes 10 millones de filas de datos.
Podrías (o yo podría) crear una funcionalidad para crear dicha columna (no estoy seguro de qué tan rápido podrías hacerlo) pero ¿es esa realmente la solución al problema ? Si solo quieres tener una columna 0/1 basada en los límites de especificaciones actuales para TODAS las columnas, no creo que tenga que ser dinámica (actualizar inmediatamente). El usuario puede presionar un solo botón en el menú para actualizar los resultados (estoy pensando en un complemento que use nombres de columnas específicos o tal vez variables de tabla). Si el propósito es ajustar las especificaciones, no tiene ningún valor (en mi opinión) ver que 0 cambia a 1 cuando tienes 10 filas (crea una plataforma especial SÓLO para ese caso de uso, si no hay nada más y "solo" te preocupa la velocidad, lo más probable es que sea más rápido).
¿O es solo una pregunta teórica sobre cómo hacer esto rápido?
Re: Grabaciones del Scripters Club: consejos y trucosHola Jarmo, gracias por tus comentarios.
Tienes razón, con la ayuda de un solo "clic aquí para actualizar" todos los problemas desaparecen.
Pero, para ser honesto, me encanta el enfoque de "Generador de gráficos: simplemente configúrelo y JMP se encargará de los detalles".
No es necesario discutir o implementar los detalles a través de la comunidad (está claro cómo ampliar una fórmula para que también funcione con especificaciones unilaterales). Aquí incluso prefiero un código breve que muestre el concepto.
Además de eso, no hay necesidad de dudar si un :folded_hands: rápido, dinámico y fácil de usar está en especificación (valor) se utilizará para algo útil.
Entonces, hasta que :folded_hands: esté en la especificación (valor) está disponible. Si alguien tiene una mejor solución, cómo configurarlo manualmente, estaré muy feliz y lo usaré de inmediato. No es una pregunta teórica.:)