Calcolo della differenza percentuale per una grande quantità di dati
Ciao a tutti!
Ho allegato un file di esempio sotto questo post.
Attualmente sto cercando di calcolare la percentuale di differenza,
che è dato da (Nuovo Valore- Valore Originale)/Valore Originale
In questo caso viene preso come riferimento il Tempo 0 (Valore Originale).
Per esempio:
Tempo: 0, Parte: 1 Valore 1: 690.2
Tempo: 50, Parte:1, Valore1: 690,52
(690,52-690,2)/(690,2) = 0,046%
Tempo: 100, Parte:1, Valore1:689.25
(689,25-690,2)/(690,2)= -0,13%
Il risultato che suppongo di ottenere è avere una nuova tabella con Time, id, Part invariati,
pur avendo i nuovi valori di Valore 1 e Valore 2 in formato percentuale.
Ho pensato di spostare i valori Different Time in tabelle diverse,
quindi calcolalo rispetto al tempo 0 e aggiungilo a una nuova tabella, ma non ne ho idea
come scriverlo sulla sceneggiatura.
Ho scritto alcuni script nel file "Percentage Different Progress", ma sono bloccato.
Apprezzo molto se qualcuno potesse aiutarmi in questo.
Grazie mille in anticipo.

Ri: Calcolo della differenza percentuale per una grande quantità di datiGrazie mille Jim!Ri: Calcolo della differenza percentuale per una grande quantità di datiI risultati Valore 2 possono facilmente sostituire i risultati Valore 1.
No, non è necessario codificare il JSL per tutte le colonne.Ho ampliato il mio codice precedente per illustrare come eseguirlo su tutte le colonne presenti nella tabella dei dati.Ho anche ipotizzato che non vorresti che i dati Value1 originali venissero modificati per le righe Time=0, ma in caso contrario, rimuovi semplicemente l'istruzione If () che sta prendendo quella decisione
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] )
);
Ri: Calcolo della differenza percentuale per una grande quantità di datiCiao Jim!
Grazie mille per l'aiuto.
Mi chiedo se c'è un modo
1) per sostituire il valore2 (risultati) nelle celle iniziali del valore della colonna 1.
2) se ci sono effettivamente più colonne (come 30) di cui avrei bisogno per eseguire questa operazione (differenza percentuale),
devo codificare in modo hardcode ogni nuova colonna, o c'è un modo per moltiplicare o eseguire il ciclo della creazione delle colonne.
Ri: Calcolo della differenza percentuale per una grande quantità di datiSe capisco cosa vuoi, penso che questo sia il modo più semplice per fare quello che vuoi.
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" );