Bonjour,
J'essaie de créer un script qui échantillonnera une table de données avec une « fenêtre coulissante » (échantillonnant un nombre défini de lignes d'une « largeur » définie, puis remontant d'une ligne pour échantillonner l'ensemble suivant, ce qui donnera un ensemble de données. des lignes 1 à 10, 2 à 11, 3 à 12 et ainsi de suite) échantillonnage de ma table de données, créant un nouvel ensemble de données que je peux utiliser pour l'analyse de modèles.
Mon script est opérationnel, mais ne fonctionne pas bien pour les bases de données plus volumineuses, avec une analyse lente (> 1 h) ou même un plantage de JMP, y a-t-il des suggestions pour l'améliorer ?
Merci!
// 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);
);
Je ne sais pas si cela fait ce que vous voulez (le résultat est différent de celui de votre script) ou ce qu'est une "grande base de données", mais peut-être que quelque chose comme ça fonctionnerait
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);Peut-être qu'il n'est pas nécessaire de créer la table auxiliaire ?
Col Moving Average fournit certains paramètres pour comparer les valeurs dans une fenêtre glissante :

quelles sont vos prochaines étapes ?