Re: ¿Hay una forma más rápida de hacer un bucle?¿Existe una necesidad específica de tener todas esas filas de 350k si al final termina con 4 valores en cada columna (si entendí el código correctamente), una media por oblea por columna? Posiblemente podría usar Resumen para hacer una tabla mucho más pequeña.
Re: ¿Hay una forma más rápida de hacer un bucle?Sí, corrija una media por oblea. Sí, me gustaría procesar todo a la vez porque estoy desarrollando un script que funciona como una herramienta multifunción para mi equipo. Cualquier sugerencia sera agradecida jarmo
Re: ¿Hay una forma más rápida de hacer un bucle?El uso de Resumen (o Resumir si no necesita una tabla de datos) debería ser bastante rápido (puede unir/actualizar la tabla de Resumen de nuevo a datos grandes si es necesario)
Names Default To Here(1);
dt_ref = Open("$DOWNLOADS/Reference data table.jmp", invisible);
dt_dt = Open("$DOWNLOADS/Data table.jmp", invisible);
dt_dt << clear select;
dt_ref << clear select;
aa_means = Associative Array(Column(dt_ref, "Tests"), Column(dt_ref, "Mean"));
col_list = Filter Each({col_name}, dt_dt << Get Column Names("String"),
Contains({"Currents", "Voltage", "Resistance"}, Word(1, col_name));
);
dt_summary = dt_dt << Summary(
Group(:Wafer ID),
Mean(Eval(col_list)),
Freq("None"),
Weight("None"),
statistics column name format("column"), // this is important here
Link to original data table(0)
);
For Each({col_name}, col_list,
Eval(EvalExpr(
Column(dt_summary, col_name) << Set Each Value(
aa_means[col_name] - AsColumn(col_name)
);
));
);
Recuerda comprobar que los valores son correctos
Re: ¿Hay una forma más rápida de hacer un bucle?Ah... se perdió el col[] en su guión. Escribiré una nueva versión pronto.
Re: ¿Hay una forma más rápida de hacer un bucle?Gracias Jarmo! 

Re: ¿Hay una forma más rápida de hacer un bucle?Esperemos que esto esté calculando correctamente. No es el script más simple, pero está algo optimizado para la velocidad (en mi computadora portátil, el cálculo de una columna tomó 200 ms, por lo que en total aproximadamente 6 s).
Names Default To Here(1);
dt_ref = Open("$DOWNLOADS/Reference data table.jmp", invisible);
dt_dt = Open("$DOWNLOADS/Data table.jmp", invisible);
dt_dt << clear select;
dt_ref << clear select;
aa_means = Associative Array(Column(dt_ref, "Tests"), Column(dt_ref, "Mean"));
col_list = Filter Each({col_name}, dt_dt << Get Column Names("String"),
Contains({"Currents", "Voltage", "Resistance"}, Word(1, col_name));
);
dt_dt << Add Row(1, At Start);
dt_dt << Begin Data Update;
For Each({col_name, idx}, col_list,
start = Hp Time();
Eval(Eval Expr(
Column(dt_dt, col_name) << Set Each Value(
//AsColumn(col_name) + aa_means[col_name] - Col Mean(AsColumn(col_name), :Wafer ID);
//Col Mean(Expr(Name Expr(AsColumn(col_name))), :Wafer ID);
//Col Mean(:Currents A17, :Wafer ID);
Expr(Name Expr(AsColumn(col_name)))+ Expr(aa_means[col_name]) - Col Mean(Expr(Name Expr(AsColumn(col_name))), :Wafer ID);
);
));
show((Hp Time() - start)/1e6);
);
dt_dt << Delete Row(1);
dt_dt << End Data Update;
//Summarize(dt_dt, b = by(:WAFER ID), m = Mean(:Currents A17));
//show(b,m, Col Mean(:Currents A17));
Tuve que agregar 1 fila al principio y luego eliminarla más tarde para evitar algún problema de cálculo extraño al usar << Establecer cada valor (podrían ser solo mis expresiones) y es por eso que tiene algunas líneas comentadas extrañas en el código. Me pondré en contacto con el soporte de JMP al respecto cuando tenga tiempo.
Editar: Ticket creado TS-00036082. Dependiendo de la respuesta que obtenga, haré una publicación separada con respecto a Col Mean
Re: ¿Hay una forma más rápida de hacer un bucle?Aquí está mi intento, las dos tablas en la parte inferior "stacked_table" y "summary_table_delta_by_wafer" podrían ser la forma correcta para esto.
Es rápido en menos de 1 segundo para todo
(HP Time() - inicio) / 1000000 = 0.664238;
Names Default To Here(1);
dt_ref = Open("$DOWNLOADS/Reference data table.jmp", invisible);
dt_dt = Open("$DOWNLOADS/Data table.jmp", invisible);
dt_dt << clear select;
dt_ref << clear select;
start = Hp Time();
curr_col_names_list = dt_dt << Get Column Names("string");
obj = dt_dt << Tabulate(
Show Control Panel( 0 ),
Add Table(
Column Table(
Analysis Columns(
eval list(curr_col_names_list)
),
Statistics( Mean )
),
Row Table( Grouping Columns( :Wafer ID ) )
)
);
my_new_table = obj << Make Into Data Table;
curr_col_names_list = my_new_table << Get Column Names("string");
transposed_table = my_new_table << Transpose(
columns(
eval list(curr_col_names_list)
),
Label( :Wafer ID ),
Output Table( "transposed_table" )
);
transposed_table << new column ("join_key"
,char
,formula(
regex(:Label,"\(([^\)]+)\)", "\1")
)
);
transposed_table_join = (
transposed_table << Join(
With( dt_ref )
,Match Columns( :join_key = :Tests),
,Merge same name columns
,output table("transposed_table_join")
)
);
// clean up
close(transposed_table,nosave);
close(my_new_table,nosave);
transposed_table_join << delete columns(:"Match Flag", :"Label","join_key");
transposed_table_join:"Mean" << Set Name( "Ref_Value" );
curr_col_names_list = transposed_table_join << Get Column Names("string");
matches_i_dont_want_to_stack = {"Tests","Ref_Value"};
clean_col_list = Associative Array(curr_col_names_list) << Remove(Associative Array(matches_i_dont_want_to_stack)) << get keys;
stacked_table = transposed_table_join << Stack(
columns( clean_col_list ),
Source Label Column( "Wafer_ID" ),
Stacked Data Column( "Measured_Value" ),
Output Table( "stacked_table" )
);
//Is this the formula you wanted on each value? A-B?
stacked_table << new column ("delta"
,numeric
,continuous
,formula(
(:Ref_Value -:Measured_Value)
)
);
//stacked table and final summary_table_delta_by_wafer seems like the useful combo here.
close(transposed_table_join,nosave);
//final output?
summary_table_delta_by_wafer = stacked_table << Transpose(
columns( :delta ),
By( :Wafer_ID ),
Label( :Tests ),
Output Table( "summary_table_delta_by_wafer" )
);
show((Hp Time() - start)/1e6);
Re: ¿Hay una forma más rápida de hacer un bucle?....
¿Hay una forma más rápida de hacer un bucle?Hola comunidad JMP,
Estoy analizando grandes cantidades de datos, normalmente 350k filas.
Para cada fila, el código ejecuta un bucle para calcular el desplazamiento medio por " ID de oblea ". Estoy buscando una manera más rápida de hacer esto.
¿Hay alguna manera de hacer que el procesamiento sea más rápido? El guión actual toma ~1 hora r para completar el bucle.
Names Default To Here( 1 );
dt1 = Data Table( "Reference Data Table.jmp" );
dt2 = Data Table("Data table");
Col_List1 = dt2 << Get Column Names( "String" );
Summation(
c = 1,
N Col( dt2 ) - 1,
values = [];
name = Column( dt2, c ) << Get Name;
If( Contains( name, "Currents" ) | Contains( name, "Voltage" ) | Contains( name, "Resistance" ),
rows = dt1 << Get Rows Where( :tests == name );
col = Column( dt2, c );
col mean = Col Mean( col );
For Each Row(
dt2,
mean = dt1:Mean[rows];
measure = mean - Col Mean( As Column( dt2, c ), :Wafer ID );
values |/= col[] + measure
;
);
col << Set Values( values );
);
0
);Modelado Estadístico AvanzadoAutomatización y secuencias de comandosAcceso a los datos