Crear subconjuntos de una tabla de datos con un bucle For y realizar operaciones de columna en cada subconjuntoEstimada comunidad, tengo dificultades con este tema, alguien puede ayudar. Mi tabla de datos comprende muchas partes bajo "Número de serie" que se miden en diferentes puntos de tiempo "Marca de tiempo". Los resultados de la Medición (como Isc, Pmpp, ...)
se almacena en filas con un tiempo de medición creciente. Lo que debo hacer es normalizar el valor de la medición con la primera medición (la más temprana en el tiempo) para cada parte individualmente. Como Parte XY -> (Pmpp/Pmpp0; t=0)
Escribí un script subdividiendo mi gran tabla de datos en muchas subtablas que contenían solo una parte y sus medidas consecutivas a lo largo del tiempo. Como el siguiente código:
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]));
Esto funciona bien. Obtengo tantas subtablas como sea necesario. También encuentre la primera medida en cada subconjunto que funcione bien. Vea el código a continuación:
Current data table(Mod);
Eval (init_Zeit = col minimum(:Timestamp);
init_flash = Mod << get rows where ((:Timestamp) == init_Zeit);
row = init_flash[1];
Lo que falla es la normalización. El script se atasca en el último subconjunto y normaliza todos los demás datos con la medición más antigua de la última tabla del subconjunto.Vea el guión a continuación
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));
En la última tabla de subconjuntos, obtengo un 1 después de la normalización en las columnas de medición. En todas las demás subtablas, obtengo un valor inferior a 1 para el valor normalizado. ¿Cómo puedo cambiar entre tablas de subconjuntos dentro del ciclo for? ¿Alguien puede ayudar? Gracias de antemano
Mickael
Re: Crear subconjuntos de una tabla de datos con un bucle For y realizar operaciones de columna en cada subconjuntofunciona muy bien ¡Gracias por tu ayuda!
Saludos, Mickael
Re: Crear subconjuntos de una tabla de datos con un bucle For y realizar operaciones de columna en cada subconjuntoGracias por su respuesta. En realidad, tenía en mi ciclo for una expresión que llamé "I". Esto creó confusión con el índice de incremento "i". ¡Cambié el nombre de mi expresión "I1" y funcionó!
Gracias, Mickael
Re: Crear subconjuntos de una tabla de datos con un bucle For y realizar operaciones de columna en cada subconjuntoEl valor L es el lado izquierdo de una asignación. Está tratando de asignar algo a una no variable. Por ejemplo:
Insert Into( { 5, 6, 7 }, 8 );
Esta alternativa funcionaría:
my list = { 5, 6, 7 };
Insert Into( my list, 8 );
Re: Crear subconjuntos de una tabla de datos con un bucle For y realizar operaciones de columna en cada subconjuntoHola, gracias por tu respuesta súper rápida!
Reescribí el guión como se propuso. El cálculo funciona bien para el primer elemento de la lista que el bucle for se rompe y nunca cambia al siguiente elemento. El depurador menciona algo con referencia a un objeto que no tiene valor L...
Realmente no sé lo que significa. ¿Necesito resetear alguna variable? o eliminar la selección en una tabla activa?
¡Muchas gracias de nuevo!
VG, Mickael
Re: Crear subconjuntos de una tabla de datos con un bucle For y realizar operaciones de columna en cada subconjuntoUsas una variable global pmpp0 en una fórmula de columna y cuando el valor de Pmpp0 sigue cambiando con cada iteración, los cálculos de la fórmula cambian en consecuencia. Si usa este enfoque, debe usar explícitamente el valor actual evaluado de la variable en la Fórmula.
Por ejemplo:
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)));