Itération plus rapideSalut,
Essayer d'optimiser les itérations.
J'ai une table de référence où chaque colonne est un nom d'une colonne de la table de données principale. Je souhaite parcourir chaque ligne de la table de données de référence, puis ajouter les valeurs de Column(dt_main, "Values") aux nouvelles colonnes A et New B dans la table de référence si Column(dt_ref, "Nrows")>2 & Comment [i] == "A > B".
J'utilise un tableau associatif car je m'intéresse uniquement aux dernières valeurs enregistrées de chaque type A et B, mappées à l'ID X/Y/Wafer correspondant.
Le script ci-dessous prend très longtemps. Y a-t-il un moyen d'optimiser ?
Names Default To Here( 1 );
start = Tick Seconds();
dt_main = Data Table( "maintable" );
dt_ref = Data Table( "referencetable" );
Try( dt_ref << delete columns( :New N, :New R ) );
dt_ref << New Column( "New A", "Numeric" );
dt_ref << New Column( "New B", "Numeric" );
nrows = [];
For( nn = 1, nn <= N Rows( dt_ref ), nn++,
Insert Into( nrows, nn )
);
dt_ref << begin data update;
For Each( {r, i}, nrows,
If( dt_ref:N Rows[i] > 2 & dt_ref:Comment[i] == "A > B",
/// Create AA to get the last recorded values for each A and B to the corresponding X/Y/Wafer ID from dt_main
countsessions = Associative Array(
dt_main:Type[dt_main << get rows where( dt_main:X Coord == dt_ref:X Coord[i] & dt_main:Y Coord == dt_ref:Y Coord[i] & dt_main:Wafer ID == dt_ref:Wafer ID[i] )],
dt_main:Value[dt_main << get rows where( dt_main:X Coord == dt_ref:X Coord[i] & dt_main:Y Coord == dt_ref:Y Coord[i] & dt_main:Wafer ID == dt_ref:Wafer ID[i] )];
);
Try( dt_ref:New A[i] = countsessions["A"] );
Try( dt_ref:New B[i] = countsessions["B"] );
)
);
dt_ref << end data update;
end = Tick Seconds();
Show( Char( end - start ) );
Automatisation et scriptsRe : Itération plus rapideJ'ai emprunté un chemin différent, en utilisant les plateformes intégrées JMP Select, Join, Split et Update. Cela fonctionne très rapidement et il semble que j'obtienne les mêmes résultats, à l'exception des lignes A> B qui, dans votre table de référence, ont des valeurs manquantes... mais les valeurs que je propose correspondent aux valeurs N(A) et N(b). ) Colonnes. Je suis donc peut-être complètement hors de propos.
Names Default To Here( 1 );
start = Tick Seconds();
dt_main = Data Table( "maintable" );
dt_ref = Data Table( "referencetable" );
Try( dt_ref << delete columns( :New A, :New B ) );
// Create a subset of the maintable that contains only data for the rows in
// the reference table that have comment value of A>B
// Select only A>B rows in reference table
dt_ref << select where(:Comment == "A > B");
dtAB = dt_ref<<SUBSET>0, dtMainJoin << delete rows);
dtMainJoin = dtMainJoin << sort(by(:RowNum), Order(ascending), Replace table(1));
dtMainJoin << delete columns(:RowNum);
// Split the table to create the New A and New B Columns
dtSplit = dtMainJoin <<
Split(
Split By( :Type ),
Split( :Value ),
Group( :X Coord, :Y Coord, :Wafer ID ),
Output Table(
"Split of Join of maintable with Subset of referencetable 2 by Type"
),
Sort by Column Property
);
// Clean up dtMainJoin table by closing it
close(dtMainJoin, nosave);
// Rename the A and B columns
dtSplit:A << set name("New A");
dtSplit:B << set name("New B");
// Use Update to merge the dtSplit data into the reference table
dt_ref << Update(
With(
Data Table(
dtSplit
)
),
Match Columns( :X Coord = :X Coord, :Y Coord = :Y Coord, :Wafer ID = :Wafer ID )
);
// Clean up
close( dtSplit, nosave );
dt_ref << end data update;
end = Tick Seconds();
Show( Char( end - start ) );</SUBSET>