Delta-BerechnungenIch habe einen Datensatz mit stündlichen Beobachtungen verschiedener Wasserzähler der letzten drei Jahre.
Das Problem besteht darin, dass die Beobachtungen den Zählerstand und nicht den Wasserverbrauch anzeigen.
Ich möchte für jede Stunde und jeden Wasserzähler eine Delta-Änderung berechnen/anzeigen. Wie gehe ich da vor?
Ein Teil der Analyse, die ich mit diesem Datensatz durchführen möchte, besteht darin, herauszufinden, ob ein Zähler an einer Stelle einen negativen Verbrauch aufweist (was darauf hindeutet, dass Wasser in die falsche Richtung fließt) oder ob ein Zähler ein zu großes Delta aufweisen muss, was auf ein Leck hinweist.
Mein Arbeitsplatz beginnt mit der Arbeit an der Datenqualität, daher möchte ich zusätzlich zu den oben genannten Dingen auch darauf achten, ob die Zeitstempel konsistent sind oder ob sich die Zeitstempel geändert haben (wenn die Beobachtungen für einen bestimmten Zähler nicht in derselben Minute zurückkommen). -Nummer jede Stunde).
Ein Analysetool, auf dessen Erkundung ich mich freue, ist die Prozessqualität
Datenexploration und -visualisierungQualitäts- und VerfahrenstechnikBetreff: Delta-BerechnungenDanke. Ich kann es morgen versuchen.
Aber wird dies in der Lage sein, zwischen jedem einzelnen Zähler zu unterscheiden?
(Im Moment habe ich 22, später skaliere ich auf mehrere Tausend).
Ich habe die Zeilen: MeterNumber; Terminzeit; Zählerwert;
Exportierte Daten aus der Messsoftware sind standardmäßig nach Datum und Uhrzeit sortiert (17.09.2023, 13:09 Uhr).
Betreff: Delta-BerechnungenKeine Angst,
if(:meter != lag(:meter,1)
wird dafür sorgen - aber Sie müssen die Daten entsprechend sortieren:
Wählen Sie mit dem Messgerät auf der linken Seite die Spalten für Messgerät und Zeit aus und gehen Sie dann wie folgt vor:

Betreff: Delta-BerechnungenUm die Aufgabe zu erleichtern:
Dies ist definitiv ein Fall, der in die Liste aufgenommen werden sollte Normalisierungs-GUI 


Betreff: Delta-BerechnungenIch weiß nicht, um welchen Typ der Eingabedatei es sich handelt, aber wenn es sich um eine Excel-Datei oder eine CSV-Datei handelt, sollten Ihre DateTime-Werte als JMP-Datums-/Uhrzeitwerte in JMP eingelesen werden.Wenn nicht, sollten Sie sich die Zeit nehmen, sie zu konvertieren.
Nachfolgend finden Sie ein einfaches Beispiel, das Ihnen bei der Berechnung der Nutzungsdaten einen Vorsprung verschaffen könnte
Names Default To Here( 1 );
dt = Current Data Table();
// Sort the data if not already sorted
dt << sort( by( :MeterNumber, :DateTime ), Replace table( 1 ) );
// Create the new Usage column
dt << New Column( "Usage",
formula(
//As Constant( Usage = 0 );
If( :MeterNumber != Lag( :MeterNumber ),
usage = 0,
:Usage = :CounterValue - Lag( :CounterValue )
);
)
);
Betreff: Delta-BerechnungenSie können auch verwenden Col Moving Average() um den Wert aus der vorherigen Zeile abzurufen (kann die Arbeit mit Gruppenspalten erleichtern)
Names Default To Here(1);
// sample data
dt = New Table("Untitled",
Add Rows(6),
Compress File When Saved(1),
New Column("Meter", Character, "Nominal", Set Values({"A", "A", "A", "B", "B", "B"})),
New Column("Time", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 1, 2, 3])),
New Column("Value", Numeric, "Continuous", Format("Best", 12), Set Values([1, 0, 2, 0, 1, 2]))
);
// Data should be sorted by time
dt << New Column("D", Numeric, Continuous, Formula(
:Value - (Col Moving Average(:Value, 1, 1, 0, Meter) * 2 - :Value)
// 2 * :Value - (Col Moving Average(:Value, 1, 1, 0, Meter) * 2
));Betreff: Delta-BerechnungenSie können die Daten nach Zähler und Zeit sortieren und dann verwenden Verzögerung Funktion ( Verzögerung (:Spalte, 1) = Wert der vorherigen Zeile ), um den Verbrauch zu berechnen:
new table("test",add rows(100),
new column ("meter", Nominal, Set Each value (Step(row(),10*(0::11)+1,(0::11)))),
new column ("time",Format( "m/d/y h:m"), set each value(Date DMY( 17, 9, 2023 )+mod(row()-1,10)*3600)),
new column ("reading"));
new column("consumption", set each value(if(row()==1 |:meter != lag(:meter,1),0,random uniform(0,10))));
for each row( if(row()==1 |meter != lag(:meter,1), :reading =random uniform(0,10000),: reading = lag(:reading,1)+ :consumption));
new column("consumption-calc",Formula( if(row()==1 |:meter != lag(:meter,1),0, :reading - lag(:reading,1))));
Betreff: Delta-BerechnungenCool!
viel robuster und kompakter 
Betreff: Delta-BerechnungenGuter Rat. Ich werde morgen meinen Tag beginnen und etwas Zeit mit der Formatierung von Datum und Uhrzeit verbringen.
Es fällt mir etwas schwer, die Syntax für Ihr und das vorherige Beispiel zu verstehen.
Ich hoffe, dass ich die R /dplyr-Bibliothek in JMP verwenden kann? Ich denke, ich kann etwas schreiben, das den Zweck erfülltBetreff: Delta-BerechnungenIch habe diesen R-Code, der den Zweck erfüllen sollte.
Bibliothek(dplyr)
Ihre_Daten <- Ihre_Daten %>%
arrangieren(MeterName, DateTime) %>%
group_by(MeterName) %>%
mutate(DeltaMeterValue = MeterValue - lag(MeterValue, default = first(MeterValue))) %>%
Gruppierung aufheben()
Betreff: Delta-BerechnungenSie können R mit JMP verwenden, aber diese Lösung sieht der Lösung mit ziemlich ähnlich Verzögerung() in JMP (Sie könnten auch verwenden Dif() ). Meine Lösung mit Col Moving Average ist schwieriger zu verstehen, aber die Idee besteht darin, Col Moving Average zu verwenden, um den Wert der vorherigen Zeile zu erhalten.
Skripthandbuch > JMP erweitern > Mit R arbeiten
JSL-Syntaxreferenz > JSL-Funktionen, Operatoren und Nachrichten > R-Integrationsfunktionen
Betreff: Delta-BerechnungenWenn ich versuche, eine der hier aufgeführten Lösungen zu verwenden, erhalte ich nur das erste Datum (=0) und nicht den Rest. Ich habe versucht, auf unterschiedliche Weise zu sortieren, um festzustellen, ob ich hier etwas falsch mache

Betreff: Delta-BerechnungenIhre Spaltennamen scheinen falsch zu sein. Korrigieren Sie diese zunächst in der Formel
Betreff: Delta-BerechnungenAh, ich sehe den Rechtschreibfehler.
Betreff: Delta-BerechnungenEine eingebaute Funktion, die Delta innerhalb von Gruppen berechnet, wäre gut.
Ich habe es zum Laufen gebracht, aber ich habe Schwierigkeiten, die Skriptsprache zu verstehen, und ich habe versucht, die Formel per Drag-and-Drop von Grund auf zu erstellen, aber ich schaffe es einfach nicht, alle Teile richtig zu platzieren, so wie sie in dem Skript sind, das Sie mir hier gegeben haben
Betreff: Delta-BerechnungenGibt es eine Beschreibung der Funktion „col gleitender Durchschnitt“?
Wenn ich auf der Support-Seite nachschaue, sagt die Beschreibung nichts darüber aus, wie viele Werte es benötigt.
Col Moving Average
Gibt den gleitenden Durchschnitt über ein bestimmtes Intervall basierend auf der aktuellen Zeile zurück. Fehlende Werte werden ignoriert
Betreff: Delta-BerechnungenEs gibt eine Möglichkeit, dies interaktiv zu tun. Klicken Sie mit der rechten Maustaste auf Ihre Gruppierungsspalte und machen Sie sie zur Spalte „Gruppieren nach“ für neue Formeln (Daten müssen nach Gruppen und höchstwahrscheinlich nach Zeit oder ähnlichem sortiert werden).

Klicken Sie anschließend mit der rechten Maustaste auf Ihre Berechnungs-/Wertspalte und gehen Sie zu Zeile->Differenz

Damit erhalten Sie eine Formel wie

Betreff: Delta-BerechnungenIch habe in einem meiner Beiträge einen Link zur Dokumentation bereitgestellt: JSL-Syntaxreferenz > JSL-Funktionen, -Operatoren und -Nachrichten > Statistische Funktionen – Spaltengleitender Durchschnitt . Meiner Meinung nach ist die Dokumentation für Col Moving Average nicht sehr klar und normalerweise muss ich einige kleine Tests durchführen, damit es richtig funktioniert (und mich daran erinnern, wie es funktioniert).

Ein weiterer Ort, an dem Sie Dokumentation finden (manchmal anders ...), ist der Scripting Index im Hilfemenü von JMP

Betreff: Delta-BerechnungenIch werde versuchen, eine neue Version davon hochzuladen Normalisierungs-GUI .
Die neue Version verfügt über die Möglichkeit, die Differenz zur vorherigen Zeile zu berechnen – basierend auf dem Trick, dass @jthi hier zur Verfügung gestellt.
Jarmos Code (über Col Moving Average) ist viel besser als das, was Sie über das Rechtsklick-Menü „Neue Formelspalte“ erhalten 
Nach dem Update wird es so aussehen.
Neu: „N-1“
