Umzugsschichten/ÄnderungenHallo ...
Zurück zu meinem Lieblingsthema in diesem Forum.
Ich brauche Hilfe beim Aufbau der folgenden Logik.
Innerhalb eines sich bewegenden Fensters konstanter Größe durch Daten (Y), die chronologisch nach einem Datum/Uhrzeit-Parameter geordnet sind
1-Sie müssen Y-Minimum =min finden
2-Muss Y-Maximum = max finden
3-Berechnen Sie die Verschiebung = max - min (wenn max chronologisch nach der Aufzeichnung von min identifiziert wurde)
oder aber
Verschiebung = Min-Max (wenn Max chronologisch vor der Min-Aufzeichnung identifiziert wurde)
Ich kann 1 und 2 innerhalb einer Formel machen, konnte aber keinen Trick finden, um die Verschiebung zu berechnen
Eine Formellösung wird bevorzugt, aber wenn nicht, würde auch ein Skript funktionieren. (insbesondere, wenn das Skript innerhalb des Formelfensters funktionieren kann)
Hinweis: Ich muss diese morgen (02.09.2020) dringend berechnen, ich wäre für jede Hilfe dankbar.
Danke ...
Verbraucher- und MarktforschungBetreff: Verschiebungen / ÄnderungenIch habe immer festgestellt, dass funktionierender Code gelobt und nicht kritisiert werden sollte. Wenn er also funktioniert, verwenden Sie ihn.
Betreff: Verschiebungen / ÄnderungenJim
Ich glaube, ich bin mit meiner Logik und der folgenden Form fertig (die nicht so kompakt ist wie Ihre).
Mein Y ist eine exponentiell gewichtete Funktion, daher ist der erste Term leer, also mein Wert. Ich brauche „+1“.
AssetRecordNumber == Spaltennummer( :Name( "Y" ), :ASSET ) + 1
Vielen Dank für Ihre großartige Unterstützung dabei. Lassen Sie es mich wissen, wenn Sie einen Fehler feststellen, aber ich habe es getestet und es scheint in allen drei Szenarien zu funktionieren.
-------------------------------------------------- ------------------------
If( Col Number( :Name( "Y" ), :ASSET ) >= :detection_window & :AssetRecordNumber >= :detection_window,
If( :AssetRecordNumber == :detection_window,
conSize = :detection_window;
allVals = :Name( "Y" ) << Werte abrufen;
);
start = Row() - (:detection_window - 1);
subMat = allVals[Index( start, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
If( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
die Verschiebung;
,
If( Col Number( :Name( "Y" ), :ASSET ) >= :window_min & :AssetRecordNumber == Col Number( :Name( "Y" ), :ASSET ) + 1,
(conSize = Col Number( :Name( "Y" ), :ASSET ); allVals = :Name( "Y" ) << Werte abrufen);
start = Row() - (Col Number( :Name( "Y" ), :ASSET ) - 1);
subMat = allVals[Index( start, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
If( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
die Verschiebung;
,
.
)
)
Betreff: Verschiebungen / ÄnderungenJim, noch eine Bitte dazu.
Meine Analyse begann zunächst als konstantes Rollfenster, aber dann muss ich einige Assets berücksichtigen, die nicht über die angestrebte Anzahl an Datensätzen verfügen (wie in detector_window), also muss ich meine Einschränkung für sie lockern, indem ich eine zweite Tabellenvariable window_min einfüge (Mindestgröße des Rollfensters).
Wenn also beispielsweise mein Erkennungsfenster = 30 und Fenster_min = 15, bedeutet das
1) Alle Assets mit mehr als 30 Datensätzen haben ein rollierendes Fenster der Größe 30
2) Alle Assets mit Datensätzen zwischen 30 und 15 haben ein einziges Fenster mit ihrer maximalen Länge
3) Alle anderen Vermögenswerte, die kleiner als 15 sind, haben nichts
Könnten Sie bitte eine Änderungsempfehlung für Ihre ursprüngliche Lösung abgeben?
Danke ...
Betreff: Verschiebungen / ÄnderungenJim,
Nochmals vielen Dank für die prompte, großartige Unterstützung (wie immer in der Vergangenheit)
Ich habe 2 Änderungen vorgenommen ...
1) Erkennungsfenster ist meine Tabellenvariable, die die Länge des Rollfensters definiert
2) Ich denke, der Start sollte detector_window -1 sein (in der zweiten Zeile)
Noch wichtiger ist, dass meine Y-Spalte auch pro Sekunde der Asset-Variable Z eingezogen werden muss (um die Phase „Werte abrufen“)
(d. h. Y und Z sind zwei Spalten, daher ist die Berechnung der minimalen und maximalen Verschiebung als Funktion des Vermögenswerts Z erforderlich. )
Jetzt habe ich dies gegen ein bestimmtes Z-Asset aufgetragen und die Ergebnisse sind korrekt.
Ich habe am Anfang eine IF-Anweisung, die die Berechnung startet, wenn wir die Anzahl der Zeilen = Erkennungsfenster unabhängig für jedes Asset Z haben ... Ich denke, das ist der Grund, warum es funktioniert.
[row()- (detection_window -1) ] beginnt für jedes Asset am richtigen Anfang.
start =1 hat mich etwas verwirrt. Ich hoffe, das Fenster startet dadurch nicht ab Zeile 1.
Schätze deine Hilfe.
If( Row() == 1,
conSize = :detection_window;
allVals = Y << Werte abrufen;
);
If( Row() <= conSize,
Start = 1,
start = Row() - (:detection_window - 1)
);
subMat = allVals[Index( start, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
If( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
die Verschiebung;
Betreff: Verschiebungen / ÄnderungenIch denke, dadurch erhalten Sie den Verschiebungswert.Ändern Sie einfach den Wert der konstanten Größe (conSize) und den Namen der Y-Spalte (Y) in der Formel, und ich glaube, sie wird das berechnen, was Sie wollen
If( Row() == 1,
conSize = 5;
allVals = :Y << get values;
);
If( Row() <= conSize,
start = 1,
start = Row() - conSize
);
subMat = allVals[Index( start, Row() )];
minVal = Min( subMat );
maxVal = Max( subMat );
minLoc = Loc( subMat, minVal )[1];
maxLoc = Loc( subMat, maxVal )[1];
If( maxLoc >= minLoc,
theShift = maxVal - minVal,
theShift = minVal - maxVal
);
theShift;