Berechnung der prozentualen Differenz für eine große Datenmenge
Hallo allerseits!
Eine Beispieldatei habe ich unter diesem Beitrag angehängt.
Ich versuche gerade, den prozentualen Unterschied zu berechnen,
was gegeben ist durch (Neuer Wert – Ursprünglicher Wert)/Ursprünglicher Wert
In diesem Fall wird die Zeit 0 als Referenz genommen (Ursprünglicher Wert).
Zum Beispiel:
Zeit: 0, Teil: 1 Wert 1: 690,2
Zeit: 50, Teil: 1, Wert 1: 690,52
(690,52-690,2)/(690,2) = 0,046 %
Zeit: 100, Teil: 1, Wert 1: 689,25
(689,25-690,2)/(690,2)= -0,13 %
Das Ergebnis, das ich erhalten soll, ist eine neue Tabelle mit unveränderter Zeit, ID, Teil,
während die neuen Werte von Wert 1 und Wert 2 im Prozentformat vorliegen.
Ich habe daran gedacht, die Different Time-Werte in verschiedene Tabellen zu verschieben,
Berechnen Sie es dann gegen die Zeit 0 und hängen Sie es an eine neue Tabelle an, aber ich habe keine Ahnung
wie man es auf Skript schreibt.
Ich habe ein Skript in die Datei "Percentage Different Progress" geschrieben, aber ich stecke fest.
Ich weiß es wirklich zu schätzen, wenn mir jemand dabei helfen könnte.
Vielen Dank im Voraus.

Betreff: Berechnung der prozentualen Differenz für eine große DatenmengeVielen Dank Jim!Betreff: Berechnung der prozentualen Differenz für eine große DatenmengeDie Ergebnisse von Wert 2 können die Ergebnisse von Wert 1 leicht ersetzen.
Nein, Sie müssen die JSL nicht für alle Spalten fest codieren.Ich habe meinen vorherigen Code erweitert, um zu veranschaulichen, wie dies für so viele Spalten ausgeführt werden kann, wie es in der Datentabelle gibt.Ich bin auch davon ausgegangen, dass Sie nicht möchten, dass die ursprünglichen Value1-Daten für die Time=0-Zeilen geändert werden, aber wenn dies nicht der Fall ist, entfernen Sie einfach die If()-Anweisung, die diese Entscheidung trifft
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] )
);
Betreff: Berechnung der prozentualen Differenz für eine große DatenmengeHallo Jim!
Vielen Dank für die Hilfe.
Ich frage mich, ob es einen Weg gibt
1) zum Ersetzen von Value2 (Ergebnisse) in den Anfangszellen von Column Value 1.
2) wenn es tatsächlich mehr Spalten (wie 30) gibt, die ich für diese Operation benötigen würde (prozentuale Differenz),
Muss ich jede neue Spalte fest codieren, oder gibt es eine Möglichkeit, die Spaltenerstellung zu multiplizieren oder für eine Schleife zu verwenden?
Betreff: Berechnung der prozentualen Differenz für eine große DatenmengeWenn ich verstehe, was Sie wollen, denke ich, dass dies der einfachste Weg ist, das zu tun, was Sie wollen.
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" );