Come calcolare la media mobile della colonna con oltre 10000 milioni di voci in JMP 11?Sto cercando di eseguire la formula seguente su una colonna con 100 milioni di righe per calcolare la media mobile. Potresti suggerire un'alternativa JMP11 per Media mobile Col
Col Moving Average( :x, 1, 9999999, 0 ) non è supportato da JMP11.</CODE></P><P><CODE class=" language-jsl">Si prega di trovare sotto il codice che ho provato:
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
Ri: Come calcolare la media mobile della colonna con 100 milioni di voci in JMP 11?@jojmp ,
Dato il tuo script originale in cui non hai nemmeno salvato la tua tabella e fai riferimento a una colonna che non è mai stata creata, e dato che la media di un gran numero di valori ha un cambiamento molto piccolo facendo cadere una riga e aggiungendone un'altra, la tua domanda è molto strano.
Di seguito è riportato uno script, che crea una tabella con nr righe rispetto alla lettura in un file dove nr = nrow(dt). Se avessi 100 milioni di righe, la gestione della memoria è molto importante e i calcoli dovrebbero cercare di essere nell'ordine n, O(n) e non O(n*rng)
Se mostri il registro incorporato, verrà stampato il tempo per eseguire i calcoli.Anche Inizia aggiornamento dati() E Fine aggiornamento dati() vengono utilizzati per risparmiare tempo di IO (rendering).Sul mio PC ecco alcuni dei miei risultati:
| nr |
nr |
secondi |
| 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 |
Nota, questo script presuppone nessun valore mancante .Lo script dovrà essere modificato e le prestazioni si ridurranno immensamente per accogliere i valori mancanti. Modifica i valori di nr e nrg per testare le prestazioni del tuo 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);
Considerato tutto ciò, ho ancora la sensazione che ciò che hai descritto potrebbe non essere ciò di cui hai bisogno.
Ri: Come calcolare la media mobile della colonna con 100 milioni di voci in JMP 11?scusa per non essere stato chiaro, ho cambiato la domanda a più di 10000 milioni di voci e il numero di voci non è fisso, può aumentare a qualsiasi numero. Alla ricerca di una formula generica per calcolare la media mobile su qualsiasi numero di elementi.Ri: Come calcolare la media mobile della colonna con 100 milioni di voci in JMP 11?@jojmp ,
O non capisco la tua richiesta o non capisci Col Moving Avg().Hai affermato di avere 100 milioni di righe e l'intervallo specificato nello script era 99.999.999. Quindi l'ultima ultima riga sarebbe la media dell'intera colonna e le righe precedenti sarebbero tutti i valori fino alla riga corrente inclusa. Di seguito è riportata un'immagine di Big Class e una media mobile di colonna con un intervallo di 5 (n prima).Nota che le righe inferiori a 6 usano solo tutte le righe e si tradurrà in una media basata su meno di 6 valori.Dalla riga 6 in poi, la media viene calcolata utilizzando la riga corrente e le 5 righe precedenti.
Quindi si prega di fornire maggiori dettagli. Ora, se i tuoi file hanno più di 100 milioni di righe, la formula personalizzata dovrebbe essere modificata.

Ri: Come calcolare la media mobile della colonna con 100 milioni di voci in JMP 11?In questa formula personalizzata come facciamo a sapere che è la media mobile di 9999 elementi?
Ri: Come calcolare la media mobile della colonna con 100 milioni di voci in JMP 11?@jojmp , la tua formula per la media mobile è un po' strana
thisTable << New Column( "av", Numeric, Continuous, Formula( Col Moving Average( :x, 1, 9999999, 0 ) ) );
Il terzo argomento, 99999999, sta creando un qualche tipo di media (storica) per Sequenza (riga).Il terzo argomento è l'intervallo della media. Più comune è un intervallo di 5 o 10 o ?? per fornire una media per valori vicini nel tempo, che non includa l'intera storia.
Supponendo che sia quello che vuoi, una formula alternativa può fare la stessa cosa
If( Row() == 1,
:x,
(:x + (Row() - 1) * Lag( :av, 1 )) / Row()
)
In allegato è presente una versione dei dati di esempio Big Class.jmp con due colonne con formule
Col Moving Average( :weight, 1, 9999, 0 )
e la formula personalizzata comparabile
If( Row() == 1,
:weight,
(:weight + (Row() - 1) * Lag( :Custom Formula, 1 )) / Row()
)