Anfänger versucht, ein Skript zu schreiben / Wie iteriere ich innerhalb der Formelfunktion?Hallo, ich bin ein Anfänger im Skriptschreiben in jeder Sprache. Ich arbeite mich gerade durch etwas, von dem ich dachte, es wäre eine einfache Übungsaufgabe. Ich verwende JMP18. Mein Ziel ist es, eine Routineoperation zu automatisieren, die ich mit im Laufe der Zeit wachsenden Datensätzen durchführe. Die Routineoperation besteht darin, zuerst die Zeitskala zu bestimmen und dann die Datenänderung über diese Zeitskala für große Datensätze anzuzeigen. Die grundlegende Vorgehensweise besteht darin, neue Spalten zu erstellen, um alle Anfangsdaten einzutragen, und Formeln auf mehr Spalten anzuwenden, um Unterschiede zu ermitteln. Wenn jemand einen besseren Vorschlag hat, wäre ich dankbar. Unten sehen Sie, wo ich stehe:
Im Wesentlichen habe ich einen Datensatz und möchte Folgendes erreichen.
1) Ich möchte die Datums- und Zeitspalten nehmen, sie in einer einzigen Spalte zusammenführen, dann das Minimum ermitteln und daraus ein Startdatum erstellen. Dann kann ich die Zeiten subtrahieren, um den Zeitunterschied zwischen den Daten zu sehen. Mit den Formelfunktionen war das alles ganz einfach. Hier funktioniert alles hervorragend.
2) Ich möchte mit mehreren Datenspalten etwas Ähnliches machen, kann aber nicht das tun, was ich vorher getan habe, um den Anfangswert zu finden. Die Anfangsdaten werden durch die Mindestzeit bestimmt, die ich in dem gefunden habe, was ich vorher für jedes eindeutige Element in einer dritten Spalte getan habe (im Code unten Unique_Fruit genannt). Für dieses Forum möchte ich für jede eindeutige Frucht eine Spalte erstellen, die die Anfangswerte der Daten für diese Frucht enthält, damit ich dann schnell die Änderungen aus der eigentlichen Datenspalte berechnen kann.
Mein aktuelles JSL-Skript ist unten. Ich habe eine Dummy-Codeformel, bei der ich noch nicht herausgefunden habe, was ich tun soll. Es sind die Schritte, bei denen ich die If-Funktion verwendet habe, festgestellt habe, dass die Zeiten gleich sind, und den Wert nur für diese Zellen festgelegt habe. Mein ursprünglicher Gedanke war, eine For-Schleife zu verwenden und in der Formel zu iterieren, aber das schien nicht zu funktionieren.
DataTable = Current Data Table();
New Column( "Date Number Format", Numeric, "Continuous" );
For( i = 1, i <= N Rows( DataTable ), i++,
DataTable:Date Number Format[i] = Num( DataTable:Key_Date[i] );
);
New Column( "Time Number Format", Numeric, "Continuous" );
For( i = 1, i <= N Rows( DataTable ), i++,
DataTable:Time Number Format[i] = Num( DataTable:Key_Time[i] );
);
New Column( "Current_Time", Numeric, "Continuous" );
For( i = 1, i <= N Rows( DataTable ), i++,
DataTable:Current_Time[i] = DataTable:Date Number Format[i] + DataTable:Time Number Format[i];
);
New Column( "Unique_Fruit", Character, "Nominal" );
For( i = 1, i <= N Rows( DataTable ), i++,
DataTable:Unique_Fruit[i] = DataTable:Fruit[i] || "-" || DataTable:Type[i];
);
New Column( "Starting_Date_Number_Format", Numeric, "Continuous",
Formula( Col Minimum( :Current_Time, :Unique_Fruit ) )
);
New Column( "Minutes", Numeric, "Continuous",
Formula( Date Difference( :Starting_Date_Number_Format, :Current_Time, "Minute", "fractional" ) )
);
New Column( "Days", Numeric, "Continuous",
Formula( Date Difference( :Starting_Date_Number_Format, :Current_Time, "Day", "fractional" ) )
);
New Column( "Weeks", Numeric, "Continuous",
Formula( Date Difference( :Starting_Date_Number_Format, :Current_Time, "Week", "fractional" ) )
);
New Column( "Months", Numeric, "Continuous",
Formula( Date Difference( :Starting_Date_Number_Format, :Current_Time, "Month", "fractional" ) )
);
New Column( "Initial_Taste", Numeric, "Continuous",
Formula(
If( :Current_Time == :Starting_Date_Number_Format, :Key_Taste, . )
)
);
For( i = 1, i <= N Rows( DataTable ), i++,
If( DataTable:Current_Time[i] == DataTable:Starting_Date_Number_Format[i],
DataTable:Initial_Taste[i] = DataTable:Key_Taste[i];
);
);
New Column( "Delta_Taste", Numeric, "Continuous",
Formula( :Key_Taste - :Initial_Taste )
);
New Column( "%_Change_Taste", Numeric, "Continuous",
Formula( ( :Delta_Taste / :Initial_Taste ) * 100 + 100 )
);</CODE></P><BR /></LINGO-BODY><LINGO-LABS id="lingo-labs-844919" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatisierung und Skripting</LINGO-LABEL></LINGO-LABS><LINGO-SUB id="lingo-sub-844929" slang="en-US" mode="CREATE">Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?</LINGO-SUB><LINGO-BODY id="lingo-body-844929" slang="en-US" mode="CREATE"><P>Können Sie einen Beispieldatensatz + eine Spalte mit der richtigen Antwort angeben? Höchstwahrscheinlich können Sie die Anfangswerte mit so etwas erhalten, aber Sie müssen den Vergleich ändern, da dieser den ersten Wert für jede Kategorie erhält</P>
<BR />
<PRE><CODE class=" language-jsl">Col Cumulative Sum(If(Row() == Col Min(Row(), :age), :height, .), :age)
wobei :age unique_fruit und :height Ihre Wertespalte ist. Sie können auch Lag() und Variablen verwenden.
Ich würde auch einige Änderungen an Ihrem Skript vornehmen, um es robuster zu machen.
- Beginnen Sie Ihr Skript mit „Names Default To Here(1).“
- Wenn Sie auf eine Datentabelle verweisen, verwenden Sie diese
- DataTable << Neue Spalte(...
- Ich würde auch in Betracht ziehen, DataTable in dt oder etwas Ähnliches zu ändern, da JMP eine Funktion namens Datatable() hat
- Beim Durchlaufen einer Datentabelle verwenden Sie For Each Row anstelle von For, da dies ein spezieller Anwendungsfall ist.
- Wenn Sie neue Spalten in der JMP-Tabelle haben möchten, ohne Formeln zu haben, haben Sie einige Optionen:
- Verwenden Sie die Kombination Neue Spalte + Formel + Formeln ausführen + Formel löschen
- Neue Spalte erstellen und durch die Datentabelle laufen lassen (wie Sie es tun)
- Dann gibt es noch eine etwas knifflige Methode, << Formel anwenden zu verwenden, aber ich würde mich zunächst an diese halten (normalerweise verwende ich die erste)
Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?Willkommen in der Community.
Ich stimme mit Jarmo überein, eine Beispieldatentabelle.
Ich schlage außerdem vor, dass Sie ein simuliertes Beispiel Ihrer erwarteten Ergebnisse bereitstellen.
Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?Vielen Dank für den Vorschlag. Ich versuche, einen simulierten Datensatz zu erstellen und das, was ich derzeit manuell mache. Um die Anfangswerte festzulegen, schaue ich mir jedes einzelne Element an, rufe die Daten aus dieser Zelle ab und fülle die gesamte Spalte auf, damit ich dann mit dem nächsten Teil der Berechnung fortfahren kann. Ich werde versuchen, auch den Rest des Skripts mit Ihren Vorschlägen zu aktualisieren, aber ich glaube, das Hauptproblem ist für mich noch nicht gelöst (oder ich habe es noch nicht verstanden).
Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?hallo @bub , schau dir bitte https://marketplace.jmp.com/appdetails/Normalization+GUI an
Es erleichtert die Aufgabe, Daten durch einen Anfangswert zu normalisieren (Subtrahieren oder Dividieren) – pro Gruppe.
Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?Es wurde nicht gelöst, da es im Allgemeinen mehr Zeit in Anspruch nimmt, Mockup-Daten zu erstellen, als die richtige Frage zu beantworten. Sie sollten in der Lage sein, so etwas für Anfangswerte zu verwenden
Col Min(If(:Date Number Format == Col Min(:Date Number Format, :Unique_Fruit), :Key_Taste, .), :Unique_Fruit)
Dies ist nicht die einzige Möglichkeit, diese zu bauen, aber so etwas funktioniert ziemlich oft
Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?Vielen Dank. Nur um das klarzustellen: Ich wollte nicht Ihre erste Antwort beschuldigen, sondern eher, dass ich versucht habe, sie in einigen Iterationen umzusetzen und dachte, dass mir immer noch etwas fehlt. Ich hätte weitermachen sollen, weil ich wahrscheinlich (irgendwann) bei der Antwort gelandet wäre, die Sie hier gezeigt haben, aber wie ich bereits sagte, bin ich neu im Skripten dieser Dinge, also geht es langsam voran.
Nur aus Neugier: Warum steht im anderen der "."?
Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?Der fehlende Wert dient dazu, den Col Min zu „zwingen“, nur eine Auswahlmöglichkeit zu haben, da fehlende Werte ignoriert werden.
Sie können diese Art von Formeln in mehrere Teile aufteilen, um sie besser zu verstehen (manchmal können sie immer noch sehr kryptisch sein).
//col1
Col Min(:Date Number Format, :Unique_Fruit)
//col2
:Date Number Format == :col1
//col3
If(:col2, :Key_Taste, .)
//col4
Col Min(:col3, :Unique_Fruit)

Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?In Zukunft werden Aufgaben wie diese superleicht:
https://community.jmp.com/t5/JMP-Wish-List/Group-by-sooo-useful-how-about-Interpolate/idc-p/828679/highlight/true#M6896
Zusammen mit Col Interpolate werden viele neue Funktionen (und Funktionalitäten) zu den Col-Aggregationen hinzugefügt:)
Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?Hey, mir ist noch ein zusätzlicher Gedanke gekommen, als ich damit herumprobierte. Wenn ich etwas tun wollte, das näher an dem liegt, was ich ursprünglich tun wollte, als ich das gepostet habe, wie geht das? Ich schreibe gerade eine Variable, die eine Liste speichert, und versuche dann, den Code durch diese Liste iterieren zu lassen, um die Formel zu füllen. Anstatt sie zu füllen, bleibt die Variable in der Formel, anstatt auf einen der Listenwerte aktualisiert zu werden. Ist das etwas, das innerhalb der Formelfunktion getan werden kann?
Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?Vielen Dank für die Erklärung. Ich spiele damit herum, während ich dieses kleine Projekt für mich selbst weiterführe und sehe, wohin ich es bringen kann.
Betreff: Anfänger versucht, ein Skript zu schreiben / Wie iteriert man innerhalb der Formelfunktion?Sie können eine Liste von Werten abrufen/eine Liste von Werten innerhalb einer Formel sammeln, müssen dabei aber vorsichtig sein, wie Sie die Werte aktualisieren (die Verwendung von As Constant oder If(Row() == 1,...) kann hilfreich sein). Außerdem sollten Sie Schleifen innerhalb von Formeln vermeiden, da diese recht häufig ausgelöst werden.
Sie könnten Lag() verwenden, aber dazu müssten Ihre Daten sortiert werden (geht auch ohne Sortierung, aber das kann schnell kompliziert werden), aber normalerweise ist die Idee so ähnlich
If(Row() == 1,
init_taste = :Key_Taste
);
If(:Unique_Fruit != Lag(:Unique_Fruit),
init_taste = :Key_Taste;
);
init_taste;
Beachten Sie, dass ich die Daten nach Datumszahlenformat und Unique_Fruit sortiert habe.