Re: ¿Cómo calcular el promedio móvil de la columna con 100 millones de entradas en JMP 11? @jojmp , tu fórmula para la media móvil es un poco extraña.
thisTable << New Column( "av", Numeric, Continuous, Formula( Col Moving Average( :x, 1, 9999999, 0 ) ) );
El tercer argumento, 99999999, está creando algún tipo de media (histórica) por secuencia (fila). El tercer argumento es el lapso de la media. Más común es un lapso de 5 o 10 o ?? para proporcionar una media de valores cercanos en el tiempo, que no incluya toda la historia.
Suponiendo que eso es lo que quieres, una fórmula alternativa puede hacer lo mismo
If( Row() == 1,
:x,
(:x + (Row() - 1) * Lag( :av, 1 )) / Row()
)
Se adjunta una versión de datos de muestra Big Class.jmp con dos columnas con fórmulas
Col Moving Average( :weight, 1, 9999, 0 )
y la fórmula personalizada comparable
If( Row() == 1,
:weight,
(:weight + (Row() - 1) * Lag( :Custom Formula, 1 )) / Row()
)
Re: ¿Cómo calcular el promedio móvil de la columna con 100 millones de entradas en JMP 11?En esta fórmula personalizada, ¿cómo sabemos que es el promedio móvil de 9999 elementos?
Re: ¿Cómo calcular el promedio móvil de la columna con 100 millones de entradas en JMP 11? @jojmp ,
O no entiendo su solicitud o usted no entiende Col Moving Avg (). Declaró que tiene 100 millones de filas y que el intervalo que especificó en su script fue de 99,999,999. Entonces, la última última fila sería la media de toda la columna, y las filas anteriores serían todos los valores hasta e incluyendo la fila actual. A continuación se muestra una imagen de Big Class y un promedio móvil de columnas con un intervalo de 5 (n antes). Tenga en cuenta que las filas menores de 6 solo usan todas las filas, y resultarán en una media basada en menos de 6 valores. Desde la fila 6 y posteriores, la media se calcula utilizando la fila actual y las 5 filas anteriores.
Así que por favor proporcione más detalles. Ahora, si sus archivos tienen más de 100 millones de filas, entonces la fórmula personalizada deberá modificarse.

¿Cómo calcular el promedio móvil de la columna con más de 10000 millones de entradas en JMP 11?Estoy tratando de ejecutar la siguiente fórmula en una columna con 100 millones de filas para calcular el promedio móvil. ¿Podría sugerir una alternativa JMP11 para Media móvil de columna
JMP11 no admite la media móvil de columna (: x, 1, 9999999, 0). </CODE></P><P><CODE class=" language-jsl">Por favor encuentre abajo el código que he probado:
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: ¿Cómo calcular el promedio móvil de la columna con 100 millones de entradas en JMP 11?Lo siento por no estar claro. He cambiado la pregunta a más de 10000 millones de entradas y el número de entradas no se ha corregido, puede aumentar a cualquier número. En busca de una fórmula genérica para calcular el promedio móvil sobre cualquier número de elementos.Re: ¿Cómo calcular el promedio móvil de la columna con 100 millones de entradas en JMP 11? @jojmp ,
Dada su secuencia de comandos original donde ni siquiera guardó su tabla y hace referencia a una columna que nunca se creó, y dado que la media de un gran número de valores tiene un cambio muy pequeño al eliminar una fila y agregar otra, su pregunta es muy extraño.
A continuación se muestra un script que crea una tabla con nr filas en lugar de leer en un archivo donde nr = nrow (dt). Si tenía 100 millones de filas, la administración de la memoria es muy importante y los cálculos deben ser orden n, O (n) y no O (n * rng)
Si muestra el registro incorporado, se imprimirá el tiempo para realizar los cálculos. también Comenzar actualización de datos () y Actualización de datos finales () Se utilizan para ahorrar en tiempo IO (rendering). En mi PC aquí están algunos de mis resultados:
| nr |
nrg |
segundos |
| 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 |
Tenga en cuenta, este script asume sin valores perdidos . El script deberá modificarse y el rendimiento se degradará enormemente para acomodar los valores perdidos. Cambie los valores de nr y nrg para probar el rendimiento de su 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);
Dado todo esto, todavía tengo la sensación de que lo que describiste no puede ser lo que necesitas.