Versuch, ein Skript zum Vergleichen zukünftiger vorhergesagter Werte zu schreibenHallo zusammen! Ich lerne gerade die Grundlagen von JSL und versuche, ein Skript zu schreiben, das vergleicht, wie gut der zum jeweiligen Zeitpunkt vorhergesagte Wert mit den nachfolgenden Vorhersagewerten der nächsten sieben Tage abschneidet. Ich versuche, das Skript dazu zu bringen, Folgendes zu tun:
1 – Führen Sie eine Regression für alle Zeilen in der Datentabelle durch (jede Zeile entspricht einem 15-Minuten-Inkrement, sodass mein vorhergesagter Wert alle 15 Minuten berechnet wird).
Ex:
obj = Fit Model(
Y( :LOG_ECOLI_Pear ),
Effects( :LOG_TURB_Pear, :millsR_Q_lag6hr ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run( :LOG_ECOLI_Pear )
);
obj << Prediction Formula;
2 – Wählen Sie den vorhergesagten Wert aus, der im gesamten Datensatz über 3 Jahre hinweg jeden Montagmorgen um 8 Uhr auftritt.
3 – Vergleichen Sie diesen Wert mit allen anderen vorhergesagten Werten, die in der Woche nach diesem 8-Uhr-Wert auftreten (z. B. Montag 8:15 Uhr bis Montag 7:45 Uhr). (Das heißt, alle während der Woche berechneten Werte werden mit dem Montag-8-Uhr-Wert verglichen.) Zählen Sie anschließend die Anzahl der Zeilen, in denen alle diese vorhergesagten Werte mehr als +/- 25 % des 8-Uhr-Werts für diese Woche betragen. Fahren Sie fort (wiederholen Sie diesen Vorgang), bis alle Wochen berücksichtigt sind.
ex:
New Column( "count num above or below 25pct of mon 8am",
numeric,
continuous,
formula(
If( Row() == 1, x = 0 );
((If( :above or below 25pct of mon 8am == 1,
x = x + :above or below 25pct of mon 8am,
X = X + :above or below 25pct of mon 8am
)));
x;
)
);
Ich bin mir nicht sicher, wie ich die Wochenwerte für den Vergleich mit dem Wert von Montag, 8 Uhr, auswählen soll. Und ich bin mir nicht sicher, ob ich damit überhaupt auf dem richtigen Weg bin. Ich wäre für jede Hilfe sehr dankbar!
Automatisierung und SkriptingDatenexploration und -visualisierungBetreff: Versuch, ein Skript zu schreiben, um zukünftige vorhergesagte Werte zu vergleichenWow.Danke Stan!
Ich habe eine Stunde lang darüber nachgedacht und muss zugeben, dass es leider über meinem derzeitigen Verständnis von JSL liegt.Wenn ich es ausführe, wird eine Tabelle mit den Spalten datetime, log_turb_pear, millsR_Q_lag_6hrs und pred formula log_ecoli_pear erstellt, aber sonst wird nichts angezeigt.Ich bin mir sicher, dass es sich um einen Benutzerfehler handelt (bei mir!), Aber ich bin mir nicht sicher, wie ich ihn debuggen soll, da ich zu neu im Skripting bin.Ich weiß, dass Sie sich viel Mühe gegeben haben und ich weiß das sehr zu schätzen.Ich bleibe dran - danke.
Betreff: Versuch, ein Skript zu schreiben, um zukünftige vorhergesagte Werte zu vergleichenDanke Stan.Ich werde es versuchen.
Betreff: Versuch, ein Skript zu schreiben, um zukünftige vorhergesagte Werte zu vergleichenHi @learning_JSL ,
Hier sind einige Ideen, um Ihnen den Einstieg zu erleichtern; Code nicht getestet.
//Set Initial Constraints
strt_row = 1;
end_row = 672;
ref_col_name = "pred formula log_ecoli_pear";
dt = Data Table( "community_post.jmp" );
cnt_ref = 0;
cnt_ref_2 = 0;
//Create Loop
for(r = 1, r <= NRows(dt), r++,
//find begin date
mod_strt_row = Modulo( dt:datetime[r], dt:datetime[1] );
If(mod_strt_row == 0, strt_row = row() );
//find end date
mod_end_row = Modulo( row(), end_row );
If(mod_end_row == 0, end_row = row() );
If(r == strt_row,
//get reference times and value for start row and column
ref_strt_time_value = dt:datetime[strt_row];
ref_col_name_value = Column(dt, ref_col_name)[strt_row];
show( format(ref_strt_time_value, "m/d/y h:m", 19), ref_col_name_value )
,
r!=end_row & r > 1,
row() = r;
compare_value = Lag( Column(dt,ref_col_name)[], 1);
low_limit_ref_value = 0.75*ref_col_name_value;
upper_limit_ref_value = 1.25*ref_col_name_value;
calc_val = Abs( ( ( ref_col_name_value - compare_value ) / ref_col_name_value ) * 100);
If(ref_col_name_value >= low_limit_ref_value | ref_col_name_value <= upper_limit_ref_value,
cnt_ref_2 = cnt_ref_2 + 1;
show( calc_val, cnt_ref_2);
);
If( calc_val <= 25,
cnt_ref = cnt_ref+1;
show(calc_val, cnt_ref);
);
,
r == end_row,
ref_end_time_value = dt:datetime[end_row];
show(format(ref_end_time_value, "m/d/y h:m", 19) );
);
);
cnt_ref_2;
cnt_ref;
Betreff: Versuch, ein Skript zu schreiben, um zukünftige vorhergesagte Werte zu vergleichenDer Einfachheit halber läuft meine Frage wirklich darauf hinaus: Wie würde ich einen Spaltenwert aus der nächsten Zeile (ich nenne ihn Zeile n + 1) abrufen/lesen, eine Berechnung damit durchführen und dann aus der Zeile danach abrufen (n+2) und führe die Berechnung durch, und so weiter, bis ich Zeile n=672 erreiche (das sind 7 Tage in 15-Minuten-Schritten). Dann beginne von vorne mit einer neuen Berechnung, beginnend bei Zeile n=672 und den gleichen Schleifen-Workflow für die nächsten 672 Zeilen fortsetzen ... und dann noch einmal bei n = 672 + 672 = 1344 ... beginnen ... und so weiter, bis mir die Zeilen in der Datentabelle ausgehen.Bei Bedarf kläre ich gerne ab.Schon ein Hinweis könnte mich auf den richtigen Weg bringen.Danke im Voraus!
Betreff: Versuch, ein Skript zu schreiben, um zukünftige vorhergesagte Werte zu vergleichenFalls es hilft......
Meine Datentabelle ist wie folgt aufgebaut:
datetime log_turb_pear millsR_Q_lag_6hrs pred formula log_ecoli_pear (berechnet)
01.04.2021 08:00 1,32 50 2,64
01.04.2021 08:15 1,46 45 2,72
01.04.2021 08:30 1,59 50 2,90
01.04.2021 08:45 2.20 50 3.7
01.04.2021 09:00 2.25 58 3.19
etc
Ich versuche, den Wert von :pred formula log_ecoli_pred am 4.1.2021, 8 Uhr (dh 2,64) mit dem Wert zu vergleichen, der zu allen anderen Zeiten bis zum 12.1.21 um 7:45 Uhr erhalten wurde. Und dann muss ich zählen, wie oft jeder dieser Werte + oder - 25 % von 2,64 beträgt. Dann für die nächste Woche wiederholen usw., bis die Zählung für alle Wochen in der Datentabelle durchgeführt wurde.(Beachten Sie, dass der erste Montag im Jahr 2019 bei Bedarf der 7. Januar, der erste Montag im Jahr 2020 der 6. Januar und der erste Montag im Jahr 2021 der 4. Januar ist ... meine Datentabelle enthält Datensätze von Anfang 2019 bis heute. ) Nur ein Wert (3,7) in der obigen Beispieltabelle ist mehr als + oder - 25 % von 2,64 (dh <(0,75 * 2,64) oder > (1,25 * 2,64)).