Machen Sie das JSL-Skript für die Stichprobennahme eines „gleitenden Fensters“ effizienterHallo,
Ich versuche, ein Skript zu erstellen, das eine Datentabelle mit einem „gleitenden Fenster“ abtastet (Abtastung einer festgelegten Anzahl von Zeilen mit einer festgelegten „Breite“, dann Bewegung eine Zeile nach oben, um die nächste Gruppe abzutasten, was zu einem Datensatz mit den Zeilen 1–10, 2–11, 3–12 usw. führt), wodurch ein neuer Datensatz erstellt wird, den ich zur Musteranalyse verwenden kann.
Mein Skript ist betriebsbereit, funktioniert aber bei größeren Datenbanken nicht gut, da die Analyse langsam ist (> 1 Stunde) oder sogar JMP abstürzt. Gibt es Vorschläge zur Verbesserung?
Danke!
// Define the window size (number of rows) and the increment (how much the standardised time should increase by)
windowSize = 9;
increment = 91;
// Get the number of rows in the data table
dt = Open("$SAMPLE_DATA/Time Series/GNP.jmp");
dt << Add Rows(windowSize);
numRows = N Rows(dt);
// Create a list to store the subsets
subsets = {};
standTimeMatrix = J(windowSize, 1, 0); // Pre-allocate matrix for Stand Time
// Fill the Stand Time matrix
dt << begin data update;
For(j = 1, j <= windowSize, j++,
standTimeMatrix[j, 1] = 1 + (j - 1) * increment;
);
// Loop through the data table to create the sliding windows
For(i = 1, i <= numRows - windowSize + 1, i++,
// Get the subset of data for the current window
subset = dt << Subset(Rows(i::i + windowSize - 1));
// Add the window number to the subset
windowNumberColumn = Repeat(i, windowSize);
subset << New Column("Window Number", Numeric, Continuous, Set Values(windowNumberColumn));
// Add the "Standardised Time" column to the subset
subset << New Column("Standardised Time", Numeric, Continuous, Set Values(standTimeMatrix));
// Add the subset to the list
Insert Into(subsets, subset);
);
// Create a new table for concatenation
newTable = New Table("All Data");
// Run the concatenations using the subsets list
For(i = 1, i <= N Items(subsets), i++,
newTable << Concatenate(
subsets[i],
append to first table(1)
);
// Close the subset table after concatenation to free up memory
Close(subsets[i], No Save);
);
Automatisierung und SkriptingBetreff: JSL-Skript für die Stichprobennahme eines „gleitenden Fensters“ effizienter gestaltenIch bin nicht sicher, ob das das bewirkt, was Sie möchten (es hat ein anderes Ergebnis als Ihr Skript) oder was eine „große Datenbank“ ist, aber vielleicht würde so etwas funktionieren
Names Default To Here(1);
size = 10;
dt = Open("$SAMPLE_DATA/Time Series/GNP.jmp", Invisible);
dt_results = dt << Clone;
dt_results << Show Window(0);
dt_results << Delete Rows(1::N Rows(dt_results));
dt_results << New Column("Idx", Numeric, Ordinal);
dt_results << New Column("Rows", Numeric, Ordinal);
cols = dt << Get Column Names("String");
i = 0;
While(i + size <= N Rows(dt),
old_rows = (1+i)::(i+size);
dt_temp = dt << Subset(Rows(old_rows), Selected Columns(0), Invisible);
dt_temp << New Column("Idx", Numeric, Ordinal, Set Each Value(i + 1));
dt_temp << New Column("Rows", Numeric, Ordinal, Values(old_rows));
dt_results << Concatenate(dt_temp,
"Append to first table"
);
Close(dt_temp, no save);
i++;
);
dt_results << Show Window(1);Betreff: JSL-Skript zum Sampling eines „gleitenden Fensters“ effizienter gestaltenVielleicht ist es nicht notwendig, die Hilfstabelle zu erstellen?
Col Moving Average bietet einige Einstellungen zum Vergleichen von Werten innerhalb eines gleitenden Fensters:

Was sind Ihre nächsten Schritte?