Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenEinige integrierte Spaltenformeln wie Col Mean() sind sehr schnell, da sie teure Werte nur einmal berechnen und sie für jede Zeile zurückgeben oder ändern.Bei benutzerdefinierten Formeln ist dies schwieriger zu erreichen, da jede Zeile separat ausgewertet wird.Manchmal kann die Verwendung einer separaten Spalte zum Speichern von Zwischenwerten die Arbeit beschleunigen (z. B. das Speichern der Zahlenreihe, die ein bestimmtes Kriterium erfüllt, anstatt sie jede Zeile neu zu berechnen), aber das wird chaotisch und schwer nachvollziehbar. Wenn es ein Konzept für einen Spaltenkontext gäbe, bei dem die Auswertung einer Zeile auf die in der vorherigen Zeile berechneten Zwischenwerte zugreifen könnte, könnte ein Skript die Ergebnisse für alle Zeilen gleichzeitig berechnen, diese dann schnell zurückgeben und die Zwischenergebnisse an die nächste weitergeben Reihe. Die Formel würde außerdem Zugriff auf die gesamte Spalte und nicht nur auf die aktuelle Zeile benötigen, daher sollte der Spaltenverweis ohne Auswertung übergeben werden.
Automatisierung und SkripterstellungBetreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenDiese Option oder Funktion würde es einfach machen, eine benutzerdefinierte Spaltentransformation zu erstellen, um das von beschriebene Problem zu lösen @hogi in einer der späteren Antworten auf zählen einzigartig
Betreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenDie Untersuchung dieses Problems ist im Gange und wir werden Sie informieren, wenn wir zu einer Lösung gelangen.
Betreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenEin weiteres Beispiel: Schreiben einer benutzerdefinierten Glättungsfunktion wie eines Savitzky-Golay-Filters, der ausgeschlossene Zeilen ignoriert.Dies kann effizient für die gesamte Spalte auf einmal berechnet werden, wenn die erste Zeile ausgewertet wird. Ich möchte die Werte für die gesamte Spalte bei der ersten Auswertung zwischenspeichern und dann einfach das vorberechnete Ergebnis in jeder Zeile zurückgeben, anstatt es neu zu berechnen jedes Mal.
Betreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenJa, das ist mir auch aufgefallen, aber sicher, wenn man es so nutzt. Es scheint, dass es den „konstanten“ Teil zu ernst nimmt, als ich es mir wünschen würde. Wir müssen dies untersuchen, aber wahrscheinlich sind neue Funktionen für die Abhängigkeits-/Wiederholungserkennung erforderlich.
In Fällen wie Ihrem mache ich die Formel normalerweise von einer Tabellenvariablen abhängig und aktualisiere die Tabellenvariable jedes Mal durch die Schleife, um einen neuen Zufallswert zu erhalten.
Betreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenHallo @XanGregg ,
Es könnte sein, dass mir etwas fehlt, aber ich konnte As Constant anscheinend nicht dazu bringen, eine Neuauswertung vorzunehmen, wenn die Tabellenformeln erneut ausgeführt werden.Es scheint (wahrscheinlich korrekt) seinen Wert zwischenzuspeichern, solange die Tabelle geöffnet ist. Hier finden Sie ausführlichere Beispiele, die dieses Problem mithilfe einer globalen Variablen lösen.
Mehr sehen...
here:dt = New Table( "Single Evaluation in Column Formula Example",
Add Rows( 1000 ),
New Column( "Timestamp",
Numeric,
"Continuous",
Format( "ddMonyyyy h:m:s", 22, 0 ),
Input Format( "ddMonyyyy h:m:s", 0 ),
Formula( Today() - (1000 + In Days( Row() )) )
),
New Column( "Local With As Constant",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Local( {startofweek},
startofweek = As Constant(
Random Uniform(
Col Min( :Timestamp ),
Col Max( :Timestamp ) - In Days( 7 )
)
);
If(
:Timestamp > startofweek & :Timestamp < startofweek
+In Days( 7 ),
1,
0
);
)
)
),
New Column( "Global With Evaluation in Row 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( Row() == 1,
::: startofweek = Random Uniform(
Col Min( :Timestamp ),
Col Max( :Timestamp ) - In Days( 7 )
)
);
If(
:Timestamp > ::: startofweek & :Timestamp < ::: startofweek
+In Days( 7 ),
1,
0
);
)
)
);
here:dt << Graph Builder(
Size( 833, 456 ),
Show Control Panel( 0 ),
Variables(
X( :Timestamp ),
Y( :Local With As Constant ),
Y( :Global With Evaluation in Row 1 )
),
Elements( Position( 1, 1 ), Line( X, Y, Legend( 7 ) ) ),
Elements( Position( 1, 2 ), Line( X, Y, Legend( 6 ) ) )
);
for each( {i}, 1::10,
wait(1);
here:dt << Rerun Formulas;
);
Betreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenHaben Sie die Funktion As Constant(x) gesehen? Damit sollte der nur einmal vorkommende Teil der Anfrage behandelt werden.
Local(
{startofweek = As Constant(
Random Uniform(
Col Min( :Timestamp ),
Col Max( :Timestamp ) - In Days( 7 )
)
)},
If( :timestamp > startofweek & :timestamp < startofweek + In Days( 7 ),
1,
0
)
)Betreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenVielen Dank für das Beispiel und die zusätzlichen Informationen @ich h . Der Status wurde auf „Wird untersucht“ geändert.
Betreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen Zeilen – Status geändert in: Wird untersuchtBetreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenHier sind ein paar mögliche Anwendungsfälle. Ich weiß, dass es noch andere gibt, die ich gerade vergesse.Viele dieser Probleme können bei kleinen Tabellen oder durch die Verwendung mehrerer Spalten oder Tabellenvariablen leicht gelöst werden, aber die Bereitstellung einer Spaltenkontextvariablen würde sie einfacher machen.
- Verwenden Sie einen Zufallswert in der Spaltenformel, damit dieser in einer Simulation ausgetauscht werden kann
// this value should be cached and re-used for all rows,
// but it should change each time the column is recalculated
startofweek = Random Uniform(
Col Min( :Timestamp ),
Col Max( :Timestamp ) - In Days( 7 )
);
If( :Timestamp > startofweek & :Timestamp < startofweek + In Days( 7 ),
1,
0
);
- Die Anzahl der Zeilen seit Beginn der letzten Stichprobe außerhalb der Spezifikation.
- Die Zeit bis zum Ende dieser Kampagne
- Gleitender Durchschnitt der letzten 10 Beispiele für diesen Produktcode
Betreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen ZeilenIch denke, dieser Beitrag könnte das Problem verdeutlichen Erstellen einer statistischen benutzerdefinierten (Formel-)Funktion mit byVar
Betreff: Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen Zeilen – Status geändert in: Informationen erforderlich@ich h Könnten Sie uns ein Beispiel einer Datentabelle mitteilen, die das von Ihnen beschriebene Problem veranschaulicht?