Comment calculer la moyenne mobile d'une colonne avec plus de 10000 millions d'entrées dans JMP 11 ?J'essaie d'exécuter la formule ci-dessous sur une colonne de 100 millions de lignes pour calculer la moyenne mobile. Pourriez-vous s'il vous plaît suggérer une alternative JMP11 pour Col moyenne mobile
Col Moving Average ( :x, 1, 9999999, 0 ) n'est pas pris en charge par JMP11.</CODE></P><P><CODE class=" language-jsl">Veuillez trouver ci-dessous le code que j'ai essayé:
NamesDefaultToHere(1);
// Use a function to open a .CSV file: Given the path to such a file, returns a reference to the resulting table
openMyCSV =
function({path2File}, {Default Local},
dt = Open(
path2File,
columns(
New Column( "column 1", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "items", Numeric, "Continuous", Format( "Best", 12 ) )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
)
);
dt = New Table( "My data file");
dt << New Column( "cc", Character, width( 40 ) );
dt << New Column( "MovAvgMean", Numeric );
dt << New Column( "MovAvgMax", Numeric );
// Put all the .csv files to process into a list
dir = Pick Directory(
"Directory containing your csv files",
"C:\Users\xxx\Documents\test\"
);
files = Files In Directory( dir );
For( f = N Items( files ), f >= 1, f--,
If( !Ends With( Uppercase( files[f] ), ".CSV" ),
Remove From( files, f )
)
);
// Process each file - Incomplete!
For( f = 1, f <= N Items( files ), f++,
thisTable = openMyCSV( dir || files[f] );
thisTable << New Column( "x",
Numeric,
Continuous,
Formula( (87 *:items)-(0.03998113) ));
thisTable << New Column( "av", Numeric, Continuous, Formula( Col Moving Average( :x, 1, 9999999, 0 ) ) );
// This will insure that all formula processing is complet before the next statement is run
thisTable << run formulas;
FileName = files[f];
// Add the summary statistics to the summary table
dt << Add Rows( 1 );
dt:cc[N Rows( dt )] = FileName;
dt:MovAvgMean[N Rows( dt )] = Col Mean( thisTable:x );
dt:MovAvgMax[N Rows( dt )] = Col Max( thisTable:x );
Close( thisTable, nosave );
);
9
Re : Comment calculer la moyenne mobile d'une colonne avec 100 millions d'entrées dans JMP 11 ?@jojmp ,
Étant donné votre script d'origine où vous n'avez même pas enregistré votre table et vous faites référence à une colonne qui n'a jamais été créée, et étant donné que la moyenne d'un grand nombre de valeurs a un très petit changement en supprimant une ligne et en en ajoutant une autre, votre question est très étrange.
Vous trouverez ci-dessous un script qui crée une table avec nr lignes par rapport à la lecture dans un fichier où nr = nrow(dt). Si vous aviez 100 millions de lignes, la gestion de la mémoire est très importante et les calculs doivent être d'ordre n, O(n) et non O(n*rng)
Si vous affichez le journal intégré, le temps nécessaire pour effectuer les calculs sera imprimé.Aussi Commencer la mise à jour des données() et Mettre fin à la mise à jour des données() sont utilisés pour économiser sur le temps IO (rendu).Sur mon PC voici quelques-uns de mes résultats :
| nr |
nrg |
secondes |
| 100 000 |
100 |
0,34 |
| 10 000 000 |
1 000 000 |
10.66 |
| 100 000 000 |
100 000 000 |
85,74 |
| 100 000 000 |
10 000 000 |
104,50 |
Remarque, ce script suppose aucune valeur manquante .Le script devra être modifié et les performances se dégraderont énormément pour s'adapter aux valeurs manquantes. Modifiez les valeurs de nr et nrg pour tester les performances de votre PC.
Names Default to Here(1);
nr = 100000;
dt = new table("test", new column("x"), Add rows(nr));
dt:x << set each value(Random Integer(100,200));
nrg = 100;
dt << begin data update();
t0 = hp time();
mvcol = dt << new column("MV");
mvcol[1] = :x[1];
for(j=2, j<=nrg, j++,
mvcol[j] = (:x[j] + (j-1)*mvcol[j-1])/j; //assumes no missing values
);
if(nrg < nr,
for(j=nrg+1, j<=nr, j++,
mvcol[j] = (:x[j] + (nrg)*mvcol[j-1] - :x[j - nrg])/ (nrg)
);
); //end if,
wait(0);
dt << end data update();
t1= hp time();
show((t1-t0)*1e-6);
Compte tenu de tout cela, j'ai toujours le sentiment que ce que vous avez décrit n'est peut-être pas ce dont vous avez besoin.
Re : Comment calculer la moyenne mobile d'une colonne avec 100 millions d'entrées dans JMP 11 ?désolé de ne pas être clair, j'ai changé la question en plus de 10000 millions d'entrées et le nombre d'entrées n'est pas fixe, il peut augmenter jusqu'à n'importe quel nombre. Vous recherchez une formule générique pour calculer la moyenne mobile sur un nombre quelconque d'éléments.Re : Comment calculer la moyenne mobile d'une colonne avec 100 millions d'entrées dans JMP 11 ?@jojmp ,
Soit je ne comprends pas votre demande, soit vous ne comprenez pas Col Moving Avg().Vous avez déclaré que vous avez 100 millions de lignes et que la durée que vous avez spécifiée dans votre script était de 99 999 999. Ainsi, la dernière dernière ligne serait la moyenne de la colonne entière, et les lignes précédentes seraient toutes les valeurs jusqu'à et y compris la ligne actuelle. Vous trouverez ci-dessous une image de Big Class et une moyenne mobile de colonne avec une plage de 5 (n avant).Notez que les lignes inférieures à 6 utilisent simplement toutes les lignes et donneront une moyenne basée sur moins de 6 valeurs.À partir de la ligne 6 et des suivantes, la moyenne est calculée à l'aide de la ligne actuelle et des 5 lignes précédentes.
Veuillez donc fournir plus de détails. Maintenant, si vos fichiers ont plus de 100 millions de lignes, la formule personnalisée devra être modifiée.

Re : Comment calculer la moyenne mobile d'une colonne avec 100 millions d'entrées dans JMP 11 ?Dans cette formule personnalisée, comment savons-nous qu'il s'agit de la moyenne mobile de 9999 éléments ?
Re : Comment calculer la moyenne mobile d'une colonne avec 100 millions d'entrées dans JMP 11 ?@jojmp , votre formule pour la moyenne mobile est un peu étrangère
thisTable << New Column( "av", Numeric, Continuous, Formula( Col Moving Average( :x, 1, 9999999, 0 ) ) );
Le troisième argument, 99999999, crée un certain type de moyenne (historique) par séquence (ligne).Le troisième argument est l'étendue de la moyenne. Plus commun est un intervalle de 5 ou 10 ou ?? pour fournir une moyenne pour les valeurs proches dans le temps, qui n'inclut pas l'historique complet.
En supposant que c'est ce que vous voulez, une formule alternative peut faire la même chose
If( Row() == 1,
:x,
(:x + (Row() - 1) * Lag( :av, 1 )) / Row()
)
Vous trouverez ci-joint une version des exemples de données Big Class.jmp avec deux colonnes avec des formules
Col Moving Average( :weight, 1, 9999, 0 )
et la formule personnalisée comparable
If( Row() == 1,
:weight,
(:weight + (Row() - 1) * Lag( :Custom Formula, 1 )) / Row()
)