Synchronisationsmodus?Hallo zusammen,
Ich habe Probleme mit den asynchronen Teilen von JMP / JSL. Ich verstehe jetzt, dass Sie "Run Formulas ()" verwenden können, um die Auswertung einer Formel vor der Verwendung zu erzwingen, aber ich habe ähnliche Probleme mit anderen Funktionen:
Wenn der Wert verwendet wird, kann er falsch sein. Das ist sehr gefährlich!
Gibt es einen "Zwangs-Sync-Modus", in dem JSL Befehl für Befehl abläuft und systematisch darauf wartet, dass einer beendet wird, bevor er zum nächsten wechselt?
Als Beispiel für meine aktuellen Ausgaben extrahiere ich Werte aus einer Auswahl von Zeilen (selRows) aus einer Tabelle (dt), um eine Zeile in einer anderen Tabelle (sumdt) zu füllen:
thisCol = Column(sumdt, thisName||"_Q10");
valueSet = Column(dt, colList[i])[selRows];
thisValue = Quantile(0.10, valueSet);
thisCol[] = thisValue;
thisCol = Column(sumdt, thisName||"_Q25");
thisValue = Quantile (0.25, valueSet);
thisCol[] = thisValue;
thisCol = Column(sumdt, thisName||"_Q50");
thisValue = Quantile (0.50, valueSet);
thisCol[] = thisValue;
thisCol = Column(sumdt, thisName||"_Q75");
thisValue = Quantile (0.75, valueSet);
thisCol[] = thisValue;
thisCol = Column(sumdt, thisName||"_Q90");
thisValue = Quantile (0.90, valueSet);
thisCol[] = thisValue;Das funktioniert manchmal! Manchmal sind jedoch alle Daten in der Sumdt-Spalte gleich und manchmal kommt überhaupt nichts heraus.
Ich kenne einige empfehlenswerte Anweisungen für den Befehl wait (0), aber ich lese jemanden, der sagt, es sei auch keine Garantie.
Wie kann ich sicherstellen, dass die Berechnungen abgeschlossen sind?
Vielen Dank!
Re: Synchronisationsmodus?AAARGH!
Ich habe das Problem gefunden, es war ... eingehende Daten!
Ich habe mir gedacht, dass einige Spalten in einigen Dateien einen Namen haben, der mit den wichtigsten am Anfang identisch ist, nur mit einer anderen Ziffer (die ich abstreife), ABER mit nur einem Wert.
Ich entschuldige mich für die Irreführung! Ich habe immer noch etwas über gute Praxis gelernt, dafür bin ich dankbar.
Danke an alle für die Unterstützung!
Re: Synchronisationsmodus?Antwort an mich selbst:
Nein, es ist nicht die statistische Funktion, es ist die Art, wie ich die Werte abrufe. Die Zahlen sind falsch.
Re: Synchronisationsmodus?Ich habe beides behoben und mein Problem nicht geändert.
Ich glaube nicht mehr, dass es ein Rennen ist. Es ist ziemlich systematisch und geschieht an derselben Stelle mit den gleichen Datensätzen. Ich habe versucht, die Reihenfolge der Elemente zu ändern oder den Gültigkeitsbereich auf ein Element zu reduzieren, den std dev als erste Berechnung zu verwenden, die Reihenfolge der Elemente zu ändern, und ich habe immer noch die gleichen genauen oder falschen Zahlen an der Ausgabe.
Gibt es bekannte Fehler in 12.1 statistischen Funktionen?
Re: Synchronisationsmodus?- entferne das aktuelle Datentabelle (dt); und verwenden Sie bei Bedarf ein explizites DT. Die aktuellen Daten können sich ändern, wenn Sie bei laufender JSL auf eine Tabelle klicken.
- Verwenden Sie keine Spalte [/ * leere Klammern ohne Index * /], es sei denn, Sie setzen eine aktuelle Zeile. Das leere [] bedeutet "die aktuelle Zeile". Leere Klammern werden normalerweise nicht benötigt. Für Ihr Beispiel ist wahrscheinlich ein expliziter Zeilenindex erforderlich.
Re: Synchronisationsmodus?Hi wieder,
Danke für Ihre Antwort und Einsicht.
Leider habe ich immer noch die gleichen Probleme: fehlende Werte, doppelte Werte im Ausgabesatz (von Q10 bis Mean, StdDev fehlt).
Ich habe mehrere Dinge ausprobiert. Ich habe auf der Seite einen Index erstellt, um einige der anormalen Werte "manuell" zu überprüfen, und sie kamen gut heraus.
Ich habe viele "wait" -Anweisungen hinzugefügt.
Ich habe keine Ideen mehr!
Hier ist das Skript (fast alles, entfernt einige Überprüfungen für das Vorhandensein von Spalten usw., es ist groß genug):
Names Default To Here(1);
dt = Current Data Table();
colNames = dt << Get Column Names (String);
Summarize(itemsList = by("Item"));
binsList = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D"};
colNamesSum = sumdt << Get Column Names (String);
For (k=1, k <= Nitems(itemsList), k++,
itemID = itemsList[k];
dt << Select All Rows << Exclude(0);
dt << Select Where (dt:Item == itemID);
itemRows = dt << Get Selected Rows;
prodID = Right(Column (dt, "proc_id")[itemRows[1]],4);
lotID = Regex(Column(dt, "lot_id")[itemRows[1]], "\d{6}");
show(lotID,itemID);
checkDup = sumdt << Get Rows Where (:Lot == lotID & :Item == itemID);
If(NRows(checkDup) == 0,
newIt = 1;
show(newIt);
sumdt << AddRows(1);
Column(sumdt, "Test Date")[] = Column(dt, "finish_t")[itemRows[1]];
Column(sumdt, "Item")[] = itemID;
Column(sumdt, "N ")[] = NRow(itemRows);
Column(sumdt, "Product")[] = prodId;
Column(sumdt, "Lot")[] = lotID;
dt << Invert Row Selection << Exclude(1);
Current Data Table(dt);
Summarize(bins = by(:SBIN_NUM), countTable = count());
dt << Select All Rows << Exclude(0);
Current Data Table(sumdt);
For (i=1, i <= Nitems(binsList), i++,
binPos = Contains(bins, binsList[i]);
Column(sumdt, "Bin"||binsList[i])[] =
If(binPos == 0, 0, countTable[binPos]);
);
colNamesSum = sumdt << Get Column Names (String);
For (i=1, i<= Nitems(colList), i++,
thisName = colNames[colList[i]];
show(thisName);
valueSet = Column(dt, colList[i])[itemRows];
thisValueQ10 = Quantile(0.10, valueSet);
wait(0);
thisValueQ25 = Quantile (0.25, valueSet);
wait(0);
thisValueQ50 = Quantile (0.50, valueSet);
wait(0);
thisValueQ75 = Quantile (0.75, valueSet);
wait(0);
thisValueQ90 = Quantile (0.90, valueSet);
wait(0);
thisValueMean = Mean (valueSet);
wait(0);
thisValueStdDev = Std Dev (valueSet);
wait(0);
show(thisValueStdDev);
thisColQ10 = Column(sumdt, thisName||"_Q10");
thisColQ25 = Column(sumdt, thisName||"_Q25");
thisColQ50 = Column(sumdt, thisName||"_Q50");
thisColQ75 = Column(sumdt, thisName||"_Q75");
thisColQ90 = Column(sumdt, thisName||"_Q90");
thisColMean = Column(sumdt, thisName||"_Mean");
thisColStdDev = Column(sumdt, thisName||"_StdDev");
thisColQ10[] = thisValueQ10;
thisColQ25[] = thisValueQ25;
thisColQ50[] = thisValueQ50;
thisColQ75[] = thisValueQ75;
thisColQ90[] = thisValueQ90;
thisColMean[] = thisValueMean;
thisColStdDev[] = thisValueStdDev;
);
show("Item completed"),
newIt = 0;
show(newIt);
show("Item already exists in summary table!");
New Window("WARNING",
<< modal,
Text Box("Item "||lotId||"-"||itemID||" already in the table"),
Text Box("Skipping this item"),
Button Box("OK")
);
);
);
show("Lot completed");
sumdt << Save();Re: Synchronisationsmodus?In meiner letzten Antwort habe ich eine kleine Tabelle verwendet, die Synchronisationsprobleme nicht unbedingt hervorhebt. Wenn es eine Verzögerung gibt, wird es die Berechnung der Quantile sein. Der folgende Code berechnet ein Quantil für 10 Millionen Datenpunkte. Die Funktion läuft synchron wie erwartet, dh die Show wird erst ausgeführt, wenn der Wert von q festgelegt wurde. Wenn es ein Synchronisationsproblem gab, wird der Wert von q als Null angezeigt.
vals = J(10000000,1,Random Normal());
q = 0;
q = Quantile(0.5,vals);
show(q);
Als allgemeine Bemerkung würde ich jedoch Wait (0) verwenden, wenn ich die Synchronisierung sicherstellen wollte - dies bezieht sich normalerweise nur auf E / A-Probleme. Es gibt nur selten Fälle, in denen Wait nicht funktioniert. Dies liegt daran, dass die Ausführung in einem separaten Thread ausgeführt wird.
Re: Synchronisationsmodus?Es ist viel einfacher zu diagnostizieren, wenn Sie Beispielcode zur Verfügung stellen können, mit dem das Problem repliziert wird. Ohne das habe ich meine eigene Version geschrieben. Es enthält Ihren gesamten Code, aber ich habe die Quelle und das Ziel der Tabelle (sumdt) angegeben. Der einzige Unterschied besteht darin, dass Sie die Notation thisCol [] haben, was bedeutet, dass Sie eine For Each Row-Schleife verwenden. Ich habe den Kontext nicht verstanden, also habe ich einfach eine For-Schleife verwendet:
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colList = dt << Get Column Names(string,numeric);
N = NItems(colList);
sumdt = new table("sumdt",
Add Rows(N),
new column("name", character),
new column("Q10"),
new column("Q25"),
new column("Q50"),
new column("Q75"),
new column("Q90"),
);
selRows = dt << Get Rows Where(:sex=="F");
For (i=1,i<=N,i++,
thisName = colList[i];
Column(sumdt,"name")[i] = thisName;
thisCol = Column(sumdt, "Q10");
valueSet = Column(dt, colList[i])[selRows];
thisValue = Quantile(0.10, valueSet);
thisCol[i] = thisValue;
thisCol = Column(sumdt, "Q25");
thisValue = Quantile (0.25, valueSet);
thisCol[i] = thisValue;
thisCol = Column(sumdt, "Q50");
thisValue = Quantile (0.50, valueSet);
thisCol[i] = thisValue;
thisCol = Column(sumdt, "Q75");
thisValue = Quantile (0.75, valueSet);
thisCol[i] = thisValue;
thisCol = Column(sumdt, "Q90");
thisValue = Quantile (0.90, valueSet);
thisCol[i] = thisValue;
);
Dieser Code funktioniert ohne Synchronisierungsprobleme. Möglicherweise möchten Sie den Code vergleichen und sehen, was anders ist.
Re: Synchronisationsmodus?Sie könnten versuchen, eine Schleife zu verwenden. Sie können einen Schritt in die Schleife integrieren, der den Wert in eine Matrix oder ein assoziatives Array kopiert, bevor die nächste Schleife beginnt. Das würde wahrscheinlich dazu führen, dass die Dinge der gewünschten Trittfrequenz folgen.
Beste,
M