Créer un sous-ensemble d'une table de données avec une boucle For et effectuer des opérations de colonne dans chaque sous-ensembleChère communauté, j'ai du mal sur ce sujet, peut-être que quelqu'un peut m'aider. Mon Datatable comprend de nombreuses parties sous "Serialnumber" qui sont mesurées à différents moments "Timestamp". Les résultats de la mesure (comme Isc, Pmpp, ...)
sont stockés en lignes avec un temps de mesure croissant. Ce que je dois faire, c'est normaliser la valeur de mesure avec la toute première mesure (la plus ancienne) pour chaque pièce individuellement. Comme partie XY -> (Pmpp/Pmpp0; t=0)
J'ai écrit un script subdivisant ma grande table de données en plusieurs sous-tables contenant une seule partie et ses mesures consécutives dans le temps. Comme code ci-dessous:
dt_LT = Open(big_datatable.jump);
Mod_Tab = dt_LT << Tabulate( Add Table( Row Table( Grouping Columns( :SerialNumber ) ) ) );
Mod_dt = Mod_Tab << Make Into Data Table;
Mod_dt << Set Name( "Modul-Datatable" );
Zahl_Mod = NRow (Mod_dt);
Current Data Table (Mod_dt);
Mod_List = :Name( "SerialNumber") << Get Values;
content= Text Box(Mod_List);
New Window ("Modul gefunden", content);
Current Data Table (dt_LT);
For (i = 1, i <= Zahl_Mod, i++,
dt_LT << clear row states;
dt_LT << select Where (:Name ("SerialNumber") == Mod_List[i]);
If( N Row( dt_LT << get selected rows ) < 3, Continue() );
Mod = dt_LT << Subset ((selected Rows), Output Table Name("Module_"||Mod_List[i]));
Cela fonctionne très bien. J'obtiens autant de sous-tableaux que nécessaire. Trouvez également que la première mesure dans chaque sous-ensemble fonctionne bien. Voir le code ci-dessous :
Current data table(Mod);
Eval (init_Zeit = col minimum(:Timestamp);
init_flash = Mod << get rows where ((:Timestamp) == init_Zeit);
row = init_flash[1];
Ce qui échoue, c'est la normalisation. Le script reste bloqué sur le dernier sous-ensemble et normalise toutes les autres données avec la première mesure de la dernière table de sous-ensemble.Voir le script ci-dessous
Em0 = :Eff_Modul[row];
Ez0 = :Eff_Zelle[row];
FF0 = :FF[row];
Impp0 = :Impp[row];
Isc0 = :Isc[row];
Pmpp0 = :Pmpp[row];
Rs_Serial0 = :Rs_Serial[row];
Rsh_Shunt0 = :Rsh_Shunt[row];
Vmpp0 = :Vmpp[row];
Impp0 = :Impp[row];
Voc0 = :Voc[row];
New Column ("Pmpp_Norm", Numeric, continuous,
Formula ( :Pmpp / Pmpp0));
Dans le dernier tableau de sous-ensembles, j'obtiens un 1 après normalisation dans les colonnes de mesure. Dans tous les autres sous-tableaux, j'obtiens une valeur inférieure à 1 pour la valeur normalisée. Comment puis-je basculer entre les tables de sous-ensembles dans la boucle for ? Quelqu'un peut-il aider? Merci d'avance
Mickael
Re : Sous-définir une table de données avec une boucle For et effectuer des opérations de colonne dans chaque sous-ensembleça marche bien. Merci pour votre aide !
Rgds, Mickael
Re : Sous-définir une table de données avec une boucle For et effectuer des opérations de colonne dans chaque sous-ensembleMerci pour votre réponse. En fait, j'avais dans ma boucle for une expression que j'appelais "I", cela créait une confusion avec l'index d'incrémentation "i". J'ai renommé mon expression "I1" et ça a marché !
Merci, Mickael
Re : Sous-définir une table de données avec une boucle For et effectuer des opérations de colonne dans chaque sous-ensembleLa valeur L est le côté gauche d'une affectation. Vous essayez d'affecter quelque chose à une non-variable. Par exemple:
Insert Into( { 5, 6, 7 }, 8 );
Cette alternative fonctionnerait :
my list = { 5, 6, 7 };
Insert Into( my list, 8 );
Re : Sous-définir une table de données avec une boucle For et effectuer des opérations de colonne dans chaque sous-ensembleBonjour, merci pour votre réponse ultra rapide !
J'ai réécrit le script tel que proposé. Le calcul fonctionne bien pour le premier élément de la liste que les sauts de boucle for et ne passe jamais à l'élément suivant. Le débogueur mentionne quelque chose en référence à un objet qui n'a pas de L-value...
Je ne sais pas vraiment ce que cela signifie. Dois-je réinitialiser une variable ? ou supprimer la sélection sur une table active ?
Merci beaucoup encore !
VG, Mickael
Re : Sous-définir une table de données avec une boucle For et effectuer des opérations de colonne dans chaque sous-ensembleVous utilisez une variable globale Pmpp0 dans une formule de colonne et lorsque la valeur de Pmpp0 continue de changer à chaque itération, les calculs de formule changent en conséquence. Si vous utilisez cette approche, vous devez utiliser explicitement la valeur actuelle évaluée de la variable dans la formule.
Par exemple:
Pmpp0 = :Pmpp[row];
F = Eval Expr(:Pmpp / Expr(Pmpp0));// Formula expression with evaluated Pmpp0
Mod << New Column("Pmpp_Norm", Numeric, continuous, Formula(Name Expr(F)));