Optimieren Sie die SchleifeHallo,
Ich habe JSL-Code, dessen Ausführung für größere Datasets lange dauert.
Der Code führt eine for-Schleife innerhalb einer for-Schleife aus, um den mittleren Versatz in Streifen zu berechnen. Ich suche nach einem schnelleren Weg, dies zu tun.
Gibt es eine Möglichkeit, die Bearbeitung zu beschleunigen? Das aktuelle Skript benötigt ca. 20 Minuten, um die Schleife abzuschließen
Hier ist das folgende Skript:
Names Default To Here( 1 );
dt1 =Data table( "Reference data table.jmp" );
dt2 = Current data table(); /// Select Data table.jmp
Col_List1 = dt2 << Get Column Names( "String" );
For( c = 1, c <= N Col( dt2 ) -1, c++,
theMatrix = [];
name = Column( Col_List1[c] ) << Get name;
if (Contains( Col_List1[c], "Currents" )| Contains( Col_List1[c], "Voltage" )| Contains( Col_List1[c], "Resistance" ),
For( r = 1, r <= N Rows( dt2 ), r++,
mean = dt1:Mean[dt1 << Get Rows Where( :Tests == name )];
measure = mean - Col Mean( If( dt2:Strips == dt2:Strips[r], Column( dt2, c ), . ) );
theMatrix = theMatrix || Column( dt2, c )[r] + measure;
);
Column( dt2, c ) << Set Values( theMatrix );
););
SkripterstellungRe: Schleife optimierenVielen Dank Jim.
Re: Schleife optimierenIch habe Ihren Code geändert, um die Verarbeitung zu umgehen, wenn die Spalteneigenschaft "theMean" nicht festgelegt wurde
Names Default To Here( 1 );
start = Today();
dt1 = Data Table( "Reference data table.jmp" );
dt2 = Current Data Table(); /// Select Data table.jmp
For( i = 1, i <= N Rows( dt1 ), i++,
theTest = dt1:Tests[i];
Try( Column( dt2, theTest ) << set property( "TheMean", dt1:mean[i] ) );
);
Col_List1 = dt2 << Get Column Names( "String" );
For( c = 1, c <= N Col( dt2 ) - 1, c++,
theMatrix = [];
name = Column( Col_List1[c] ) << Get name;
If( Contains( Col_List1[c], "Currents" ) | Contains( Col_List1[c], "Voltage" ) | Contains( Col_List1[c], "Resistance" ),
//For( r = 1, r <= N Rows( dt2 ), r++,
mean = .;
Try( mean = Column( dt2, col_list1[c] ) << get property( "theMean" ) );
// Don't process if a value for theMean does not exist
If( Is Missing( mean ) == 0,
For Each Row(
r = Row();
//mean = dt1:Mean[dt1 << Get Rows Where( :Tests == name )];
//measure = mean - Col Mean( If( dt2:Strips == dt2:Strips[r], Column( dt2, c ), . ) );
measure = mean - Col Mean( As Column( dt2, c ), :Strips );
theMatrix = theMatrix || Column( dt2, c )[r] + measure;
);
Column( dt2, c ) << Set Values( theMatrix );
);
);
);
Show( (start - Today()) / 60 );Re: Schleife optimierenHallo @txnelson ,
Es gibt ein Problem in der von Ihnen vorgeschlagenen Logik. Wenn die Referenzdatentabelle den Test nicht enthält, der sich in der Hauptdatentabelle befindet, werden die Zeilenwerte aus diesen Tests gelöscht. Ich habe nur den Test kompensiert, der in der Referenzdatentabelle steht. Jede Hilfe wäre sehr willkommen

Die Datentabellen habe ich unten angehängt. Ich möchte nur die Tests ausgleichen, die in der Referenztabelle angegeben sind
Re: Schleife optimierenDanke Jim. Es funktioniert wie ein Zauber
Re: Schleife optimieren@Jacksmith12 , Ich bin mir nicht sicher, was die Bedingung dt2:Strips == dt2Strips[r] soll lösen, aber es tut wahrscheinlich nicht das, was Sie wollen.
Ohne Testdaten zum Testen würde ich hier mit der Optimierung beginnen - die wichtigste ist, dt1 zu nehmen << Zeilen abrufen Wo( :Tests == name ) außerhalb der Schleife.
Names Default to Here( 1 );
dt1 = Data Table( "Reference Data Table.jmp" );
dt2 = Current Data Table();
col list1 = dt2 << Get Column Names( "String" );
Summation( c = 1, N Col( dt2 ) - 1, //summation is faster that For() if you don't need to use Break() or Continue()
values = [];
name = Column( dt2, c ) << Get Name;
If( Contains( name, "Currents" ) | Contains( name, "Voltage" ) | Contains( name, "Resistance" ),
rows = dt1 << Get Rows Where( :tests == name ); // As Constant() prevents JMP from doing a lookup per row
col = Column( dt2, c );
col mean = Col Mean( col );
For Each Row( dt2,
mean = dt1:Mean[rows];
measure = mean - If( dt2:Strips == dt2:Strips /* always true */, col mean, 0 );
values |/= col[] + measure // append value to
);
col << Set Values( values )
);
0 // summation needs to end in a numeric
)
Re: Schleife optimierenDie 2 Stellen, an denen ich Probleme sehe, sind die
mean = dt1:Mean[dt1 << Get Rows Where( :Tests == name )];
Und
measure = mean - Col Mean( If( dt2:Strips == dt2:Strips[r], Column( dt2, c ), . ) );
Hier ist eine Lösung für die Probleme. Überprüfen Sie sie und prüfen Sie, ob die Antworten richtig sind
Names Default To Here( 1 );
start=today();
dt1 =Data table( "Reference data table.jmp" );
dt2 = Current data table(); /// Select Data table.jmp
For(i=1,i<=nrows(dt1),i++,
theTest = dt1:Tests[i];
try(column(dt2,theTest) << set property("TheMean", dt1:mean[i]));
);
Col_List1 = dt2 << Get Column Names( "String" );
For( c = 1, c <= N Col( dt2 ) -1, c++,
theMatrix = [];
name = Column( Col_List1[c] ) << Get name;
if (Contains( Col_List1[c], "Currents" )| Contains( Col_List1[c], "Voltage" )| Contains( Col_List1[c], "Resistance" ),
//For( r = 1, r <= N Rows( dt2 ), r++,
For Each Row( r=row();
//mean = dt1:Mean[dt1 << Get Rows Where( :Tests == name )];
mean = column(dt2,col_list1[c]) << get property("theMean");
//measure = mean - Col Mean( If( dt2:Strips == dt2:Strips[r], Column( dt2, c ), . ) );
measure = mean - Col Mean(as Column( dt2, c ),:Strips);
theMatrix = theMatrix || Column( dt2, c )[r] + measure;
);
Column( dt2, c ) << Set Values( theMatrix );
););
show((start-today())/60);