Calcul de la différence en pourcentage pour une grande quantité de données
Salut tout le monde!
J'ai joint un exemple de fichier sous ce post.
J'essaie actuellement de calculer le pourcentage de différence,
qui est donnée par (Nouvelle valeur - Valeur d'origine)/Valeur d'origine
Dans ce cas, le temps 0 est pris comme référence (valeur d'origine).
Par exemple:
Temps : 0, Partie : 1 Valeur 1 : 690,2
Temps : 50, partie : 1, valeur 1 : 690,52
(690.52-690.2)/(690.2) = 0.046%
Temps : 100, partie : 1, valeur 1 : 689,25
(689.25-690.2)/(690.2)= -0.13%
Le résultat que je suis supposé obtenir est d'avoir une nouvelle table avec le Time, id, Part inchangé,
tout en ayant les nouvelles valeurs de Valeur 1 et Valeur 2 au format pourcentage.
J'ai pensé à déplacer les valeurs de temps différent dans différentes tables,
puis calculez-le par rapport au temps 0 et ajoutez-le à une nouvelle table, mais je n'ai aucune idée de
comment l'écrire sur le script.
J'ai écrit un script dans le fichier "Percentage Different Progress", mais je suis bloqué.
J'apprécie vraiment si quelqu'un pouvait m'aider dans ce domaine.
Merci beaucoup d'avance.

Re : Calcul de la différence de pourcentage pour une grande quantité de donnéesMerci beaucoup Jim !Re : Calcul de la différence de pourcentage pour une grande quantité de donnéesLes résultats Valeur 2 peuvent facilement remplacer les résultats Valeur 1.
Non, vous n'avez pas besoin de coder en dur le JSL pour toutes les colonnes.J'ai développé mon code précédent pour illustrer comment l'exécuter sur autant de colonnes qu'il y en a dans la table de données.J'ai également supposé que vous ne voudriez pas que les données Value1 d'origine soient modifiées pour les lignes Time = 0, mais si ce n'est pas le cas, supprimez simplement l'instruction If () qui prend cette décision.
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 : Calcul de la différence de pourcentage pour une grande quantité de donnéesSalut Jim!
Merci beaucoup pour l'aide.
Je me demande s'il y a un moyen
1) pour remplacer la valeur2 (résultats) dans les cellules initiales de la colonne valeur 1.
2) s'il y a en fait plus de colonnes (comme 30) dont j'aurais besoin pour faire cette opération (différence en pourcentage),
dois-je coder en dur chaque nouvelle colonne, ou existe-t-il un moyen de multiplier ou de boucler la création de colonnes.
Re : Calcul de la différence de pourcentage pour une grande quantité de donnéesSi je comprends ce que vous voulez, je pense que c'est la façon la plus simple de faire ce que vous voulez.
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" );