Tengo un archivo csv que almacena valores temporales. Tengo que encontrar el promedio del grupo para cierto conjunto de muestras de acuerdo con los pasos a continuación:
1.Haga que todos los valores temporales menores de 25 sean iguales a cero, es decir, columna post_proceso
2. La columna group_avg se obtiene ignorando las filas con 4 ceros consecutivos mayores o iguales. Seguido de calcular el promedio del grupo de muestras como se muestra a continuación
3. La columna final_average son los resultados generados a partir de la columna group_avg
¿Cómo podemos escribir este proceso usando jsl?
Adjuntando el archivo csv
El resultado final es definitivo _promedio como en la siguiente tabla:

Aquí hay un script que crea su tabla de datos con solo la columna TEMP, y luego se crean las columnas restantes y se usa la fórmula para completarlas.
Names Default To Here( 1 );
dt = New Table( "temp_temp",
Add Rows( 54 ),
New Column( "TEMP",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[23.23019577, 23.44946668, 23.56111955, 23.47601143, 23.36428639,
23.24016499, 32.42091411, 23, 32.26821731, 32.14990084, 32.42091411,
32.26821731, 32.14990084, 23.23019577, 23.44946668, 23.56111955,
23.47601143, 23.36428639, 23.24016499, 32.15353181, 32.16785998, 21,
32.502366, 32.16261133, 32.15757688, 32.16790474, 23.23019577,
23.44946668, 23.56111955, 23.47601143, 23.36428639, 23.24016499,
32.42091411, 10, 32.26821731, 32.14990084, 32.41334166, 32.17456755,
32.52383338, 32.17310331, 19.28571429, 19.28571429, 19.28571429,
19.28571429, 34.62948075, 34.28766971, 34.29470736, 34.61532486,
34.386807, 34.36554216, 34.58410721, 34.28726312, 23.57142857,
23.57142857]
)
)
);
dt << New Column( "post process", formula( If( :TEMP <= 25, 0, :TEMP ) ) );
dt:post process << delete formula;
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
Show( "start", Row(), flag );
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
Show( "cap", Row(), captureMatrix );
If( zeroCounter == 4 | Row() == N Rows( dt ),
For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);
value = Mean( captureMatrix );
Show( value );
Show( Row(), captureMatrix, zeroCounter, Index( 1, N Cols( captureMatrix ) - (zeroCounter - 1) ) );
flag = 0;
zeroCounter = 0;
Show( flag );
captureMatrix = [];
);
);
value;
)
);
dt << new column("final Avg",
formula(
if(row()==1,
theRows = current data table() << get rows where(isMissing(:group_avg)==0);
);
If(row()<= nrows(theRows),
value=:group_avg[theRows[Row()]],
value=.
)
)
);
Estos scripts funcionan bien para archivos pequeños. Pero en el caso de archivos grandes donde tenemos 16000 ceros en lugar de 4, JMP deja de responder. ¿Hay alguna forma de evitar esto y ejecutar el script sin bloquearse?
Sospecho que el problema es que, por error, dejé varias declaraciones "Show ()" en el código, lo que obligó a escribir mucho en el registro JMP.
A continuación se muestra la especificación de la columna "post proceso", que es la parte que supongo que tiene el problema que hace que JMP se cuelgue.Intente ejecutarlo y vea si funciona sin colgarse
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
If( zeroCounter == 4 | Row() == N Rows( dt ),
/*For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);*/
if( Row() == N Rows( dt ), zerocounter++ );
value = Mean( captureMatrix[ 1:: ncols(captureMatrix) - (zeroCounter - 1)] );
flag = 0;
zeroCounter = 0;
captureMatrix = [];
);
);
value;
)
);El primer script da la respuesta correcta pero la salida de ambos scripts no es la misma, ¿por qué ha comentado alguna parte del código?
La segunda versión del código es más eficiente. Dada la cantidad de datos que está ejecutando, pensé que ayudaría.Debería proporcionar los mismos resultados.Si no es así, puede intentar eliminar todas las declaraciones Show () de la primera versión del código, y si eso funciona.