Rendi lo script JSL più efficiente per campionare una "finestra scorrevole"Ciao,
Sto cercando di creare uno script che campionerà una tabella di dati con una "finestra scorrevole" (campionando un determinato numero di righe di una "larghezza" di un insieme, quindi spostandosi verso l'alto di una riga per campionare il set successivo, risultando in un set di dati delle righe 1-10, 2-11, 3-12 e così via) campionamento della mia tabella dati, creando un nuovo set di dati che posso utilizzare per l'analisi dei pattern.
Il mio script è operativo, ma non funziona bene con database più grandi, con analisi lente (>1 ora) o addirittura arresto anomalo di JMP, ci sono suggerimenti su come migliorarlo?
Grazie!
// 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);
);
Automazione e scriptingRi: Rendere lo script JSL più efficiente per campionare una "finestra scorrevole"Non sono sicuro che stia facendo quello che vuoi (ha un risultato diverso rispetto al tuo script) o cos'è un "database di grandi dimensioni", ma forse qualcosa del genere funzionerebbe
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);Re: Rendere lo script JSL più efficiente per campionare una "finestra scorrevole"Forse non è necessario creare la tabella ausiliaria?
Col Moving Average fornisce alcune impostazioni per confrontare i valori all'interno di una finestra scorrevole:

Quali sono i tuoi prossimi passi?