Cálculo de la diferencia porcentual para una gran cantidad de datos
¡Hola a todos!
He adjuntado un archivo de ejemplo debajo de esta publicación.
Actualmente estoy tratando de calcular el porcentaje de diferencia,
que viene dado por (Valor nuevo - Valor original)/Valor original
En este caso se toma como referencia el Tiempo 0 (Valor Original).
Por ejemplo:
Tiempo: 0, Parte: 1 Valor 1: 690,2
Tiempo: 50, Parte: 1, Valor 1: 690,52
(690,52-690,2)/(690,2) = 0,046 %
Tiempo: 100, Parte: 1, Valor 1: 689,25
(689,25-690,2)/(690,2)= -0,13%
El resultado que se supone que debo obtener es tener una nueva tabla con el tiempo, la identificación, la parte sin cambios,
teniendo los nuevos valores de Valor 1 y Valor 2 en formato porcentual.
He pensado en mover los valores de Tiempo diferente a diferentes tablas,
luego calcúlelo contra el Tiempo 0 y agréguelo a una nueva tabla, pero no tengo idea de
cómo escribirlo en el guión.
He escrito una secuencia de comandos en el archivo "Porcentaje de progreso diferente", pero estoy atascado.
Realmente aprecio si alguien me puede ayudar en esto.
Muchas gracias de antemano.

Re: Calcular la diferencia porcentual para una gran cantidad de datos¡Muchas gracias Jim!Re: Calcular la diferencia porcentual para una gran cantidad de datosLos resultados del Valor 2 pueden reemplazar fácilmente los resultados del Valor 1.
No, no necesita codificar el JSL para todas las columnas.He ampliado mi código anterior para ilustrar cómo ejecutar esto en tantas columnas como hay en la tabla de datos.También supuse que no querría que se cambiaran los datos originales de Value1 para las filas Time=0, pero si ese no es el caso, simplemente elimine la declaración If() que está tomando esa decisión.
Names Default To Here( 1 );
dt = Current Data Table();
// Create a subset with only the data where Time = 0
dt2 = dt << subset( Rows( dt << get rows where( :Time == 0 ) ), selected columns( 0 ) );
// Delete the Time column. In the join step below, it
// will write on top of the original Time column if
// it remains in the subsetted data table
dt2 << delete columns( "Time" );
// Create a list of the column names so all of them can be
// changed to a new name for the Join below. Eliminate
// the columns "id" and "Part" from the name change since
// they will be used in the column matching in the Join.
divisorColNames = dt2 << get column names( string );
For( i = N Items( divisorColNames ), i >= 1, i--,
If( divisorColNames[i] == "id" | divisorColNames[i] == "Part",
divisorColNames = Remove( divisorColNames, i, 1 )
)
);
// Rename all of the divisor columns by "adding divisor_"
// in front of each name
For( i = 1, i <= N Items( divisorColNames ), i++,
Column( dt2, divisorColNames[i] ) << set name(
"divisor_" || Char( Column( dt2, divisorColNames[i] ) << get name )
)
);
// Join the data tables. All of the matching id and part
// values will be joined to all rows with the same values
dtJoin = dt << Join(
With( dt2 ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( :id = :id, :Part = :Part ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 )
);
// The dt2 data table is no longer needed so close it
Close( dt2, nosave );
// Loop through all of the columns and create the new values
// unless the Time value is 0
For( theCol = 1, theCol <= N Items( divisorColNames ), theCol++,
For( theRow = 1, theRow <= N Rows( dtJoin ), theRow++,
If( dtJoin:Time[theRow] != 0,
Column( dtJoin, divisorColNames[theCol] )[theRow] = (
Column( dtJoin, divisorColNames[theCol] )[theRow]
-Column( dtJoin, "divisor_" || divisorColNames[theCol] )[theRow]) /
Column( dtJoin, "divisor_" || divisorColNames[theCol] )[theRow]
)
)
);
// Delete all of the no longer needed divisor columns
For( i = 1, i <= N Items( divisorColNames ), i++,
dtJoin << delete columns( "divisor_" || divisorColNames[i] )
);
Re: Calcular la diferencia porcentual para una gran cantidad de datos¡Hola Jim!
Muchas gracias por la ayuda.
Me pregunto si hay una manera
1) para reemplazar el Valor 2 (resultados) en las celdas iniciales de la Columna Valor 1.
2) si en realidad hay más columnas (como 30) que necesitaría para hacer esta operación (diferencia porcentual),
¿Necesito codificar cada nueva columna, o hay alguna manera de multiplicar o hacer un bucle en la creación de columnas?
Re: Calcular la diferencia porcentual para una gran cantidad de datosSi entiendo lo que quieres, creo que esta es la forma más sencilla de hacer lo que quieres.
dt = Current Data Table();
dt2 = dt << subset(
Rows( dt << get rows where( Time == 0 ) ),
columns( {"id", "Part", "Value1"} )
);
dt2:Value1 << set name( "divisor" );
dtJoin = dt << Join(
With( dt2 ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( :id = :id, :Part = :Part ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 )
);
Close( dt2, nosave );
dtJoin << New Column( "Value2",
Numeric,
"Continuous",
Format( "Percent", 10, 4 ),
Formula( (:Value1 - :divisor) / :divisor )
);
dtJoin:Value2 << delete property( "formula" );
dtJoin << delete columns( "divisor" );