Schnellster Weg, über eine Datentabelle zu iterierenHallo,
Wir haben eine JMP-Tabelle mit Millionen von Zeilen (Bilddaten), und jeder Vorgang ist kostspielig und zeitaufwändig. Wir müssen jedoch eine neue Spalte hinzufügen, die aus den anderen Spalten berechnet wird.
Wie lässt sich dies bei großen Datensätzen am schnellsten bewerkstelligen? Derzeit verwenden wir die Funktion „Formel festlegen“ für die Spalte, die Anwendung dauert jedoch lange, und außerdem wird die Formel während der Analyse zwangsläufig mehrmals geändert. Sollten wir Vektoren zum Abrufen von Werten oder ähnliches verwenden? Ich habe auch die Funktion „für jede Zeile“ gesehen. Ich freue mich über Feedback und Tipps.Automatisierung und SkriptingGrundlegende Datenanalyse und -modellierungBetreff: Schnellste Möglichkeit, über eine Datentabelle zu iterierenHäufig führt die Abkehr vom herkömmlichen zeilenweisen JSL-Verfahren zugunsten von Matrixoperationen zu einer schnelleren Verarbeitung. Es wäre jedoch hilfreich, wenn Sie ein Beispiel für die tatsächlich verwendeten Formeln angeben könnten.
Betreff: Schnellste Möglichkeit, über eine Datentabelle zu iterierenHallo,
Vielen Dank für Ihre Antwort.
Um mehr Kontext hinzuzufügen: Unten finden Sie ein Skript mit einem Beispiel für die von mir verwendete Formel. Basierend auf den X/Y-Koordinaten des Bildes teile ich es in Zonen ein, insgesamt 20 an meinem tatsächlichen Datum. Sollte die Einteilung der Zonen nicht korrekt sein, passe ich die Formel an. Deshalb sage ich, dass wir häufig feste Formeln verwenden werden.
dt = New Table( "Reprex",
Add Rows( 1000000 ),
New Column( "X", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) ),
New Column( "Y", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) )
);
R_debut_X = 10;
largeur = 50;
ecart_X = 5;
debut_Y = 20;
hauteur = 30;
ecart_Y = 5;
// Slow way: row formula
dt << New Column( "Zone_slow", Character,
Formula(
If( R_debut_X < :X <= R_debut_X + largeur & debut_Y < :Y <= debut_Y + hauteur, "Zone 1",
R_debut_X + largeur + ecart_X < :X <= R_debut_X + 2*largeur + ecart_X & debut_Y < :Y <= debut_Y + hauteur, "Zone 2",
"Other"
)
)
);
Betreff: Schnellste Möglichkeit, über eine Datentabelle zu iterieren@txnelson hat Recht, eine Matrix könnte die Geschwindigkeit verbessern. Stellen Sie sicher, dass Sie <
dt = New Table( "Reprex",
Add Rows( 1000000 ),
New Column( "X", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) ),
New Column( "Y", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) )
);
R_debut_X = 10;
largeur = 50;
ecart_X = 5;
debut_Y = 20;
hauteur = 30;
ecart_Y = 5;
start = hptime();
// Slow way: row formula
dt << New Column( "Zone_slow", Character,
Formula(
If( R_debut_X < :X <= R_debut_X + largeur & debut_Y < :Y <= debut_Y + hauteur, "Zone 1",
R_debut_X + largeur + ecart_X < :X <= R_debut_X + 2*largeur + ecart_X & debut_Y < :Y <= debut_Y + hauteur, "Zone 2",
"Other"
)
)
);
dt<
<RUNFORMULAS></RUNFORMULAS>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Craige_Hales_0-1758807317326.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Craige_Hales_0-1758807317326.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="Craige_Hales_0-1758807317326.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/83489iE50BBC18E746B0D5/Craige_Hales_0-1758807317326.png" role="button" title="Craige_Hales_0-1758807317326.png" alt="Craige_Hales_0-1758807317326.png" /></span></SPAN></SPAN></P> <BR /> <P>Der Ergebniswert verwendet den Wahrheitswert 0 oder 1 in cmatxy1,2, um den Wert 0, 1 oder 2 für andere, Zone1, Zone2 zu erstellen. Sie könnten wahrscheinlich einige der Matrixanweisungen zusammenfassen, um es noch schneller zu machen, wenn das wichtig ist.</P> <BR />
Betreff: Schnellste Möglichkeit, über eine Datentabelle zu iterierenVielen Dank, es geht jetzt viel schneller!