Cómo definir una nueva columna basada en la condición de n filas consecutivasHola todos,
Estoy buscando una columna de fórmula donde sus elementos dependan de al menos 10 filas consecutivas de otra columna que llene un valor de umbral. Por favor, vea la imagen y los datos adjuntos. Esos también incluyen la columna requerida "Región fallida correcta".
Cualquier ayuda por favor.
Gracias, HSS

secuencias de comandosRe: Cómo definir una nueva columna basada en la condición de n filas consecutivasTal vez dividiría el algoritmo en tres partes:
- Aumente el contador cuando haya suficientes valores por encima de 750 (posiblemente configure algunas variables de soporte)
- Aumente el contador cuando haya incluso un valor por debajo de 750 DESPUÉS y haga esto solo UNA VEZ para cada paso 1. aumento (posiblemente establezca alguna(s) variable(s) de soporte)
- No aumente el contador (posiblemente establezca algunas variables de soporte)
esto podría ser más fácil (tal vez no más fácil, pero más claro) de hacer con algunas variables de soporte adicionales.
Tal vez algo como esto:
If(Row() == 1,
counter = 1;
allow_over_limit_change = 1;
allow_below_limit_change = 0;
);
current_vals_to_check = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit_count = Sum(current_vals_to_check >= 750);
If(allow_over_limit_change & over_limit_count >= 10,
counter++;
allow_below_limit_change = 1;
allow_over_limit_change = 0;
, allow_below_limit_change & :Current < 750,
counter++;
allow_below_limit_change = 0;
allow_over_limit_change = 1;
);
counter;
Row() == 1 si la declaración probablemente se puede reemplazar con esto (en mi opinión, no es tan claro como usar la declaración If)
As Constant(counter = 1);
As Constant(allow_over_limit_change = 1);
As Constant(allow_below_limit_change = 0);
Re: Cómo definir una nueva columna basada en la condición de n filas consecutivasHola @jthi ,
Intenté algo en mi nuevo requisito. Puede que no sea la mejor solución, pero es una solución. Y está muy cerca de la solución que sugirió para el problema original. Hasta ahora está funcionando bien.
If( Row() == 1, val = 1 );
Next_10_values = Sum( :Current[Index( Row(), Min( Dim()[1], Row() + 9 ) )] >= 750 );
Previous_10_values = Sum( :Current[Index( Row(), Min( Dim()[1], Row() - 9 ) )] >= 750 );
If(
Next_10_values == 10 & Lag( :Current ) < 750 | Previous_10_values == 9 & :Current < 750 &
Lag( :Current ) >= 750,
val = val + 1
);
val;
Muchas gracias por su apoyo.
Saludos, HSS
Re: Cómo definir una nueva columna basada en la condición de n filas consecutivasEl cambio se usa para aumentar el valor si es necesario. Para el problema tres, sería necesario volver a escribir el algoritmo ya que las condiciones han cambiado
Re: Cómo definir una nueva columna basada en la condición de n filas consecutivas@jthi Gracias por la explicación.
Lo ejecuté fila por fila y obtuve bastante.
Todavía no tengo idea de por qué tenemos un 'cambio' variable en el script y cuál es su propósito. Solo está tomando dos valores, ya sea 1 (como el valor establecido) y 0 siempre que obtengamos más de 10 entradas seguidas con un valor actual satisfactorio. Pero no aparece en ninguna parte en la nueva indexación de columnas. Pero si lo ejecuto sin la variable 'Cambiar', no obtengo las entradas correctas. Pero no puedo averiguar cómo y dónde afecta nuestro cálculo/indexación.
y la tercera parte del problema: ¿cómo puedo aumentar el índice de ejecución cuando finaliza la región deseada de: actual> = 750?
gracias, hss
Re: Cómo definir una nueva columna basada en la condición de n filas consecutivasLo que sugeriría hacer es modificar el script a algo como esto que le permitirá ejecutarlo "fila por fila":
// Names Default To Here(1);
// Clear Log();
dt = Current Data Table();
run_script = Expr(
If(Row() == 1,
val = 1; // this is breaking rule of > 750, so we define it separately
change = 1;
);
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit = Sum(next_vals >= 750);
If(change & over_limit >= 10,
val++;
change = 0;
, over_limit < 10,
change = 1;
);
val;
show(row(), val, change, next_vals, over_limit);
Write("\!N");
);
Row() = 1;
run_script;
Row() = 2;
run_script;
Row() = 5;
run_script;
Luego, puede ejecutar el script por partes con bastante facilidad y mirar el registro para ver qué sucede (también puede ejecutar una fila a la vez si lo desea).
Ventana de script y registro integrado:

Scripting Index también es útil para explicar las funciones, como Dim().
Si esto no es suficiente ayuda, por favor comenta en esta publicación y etiquétame, puedo tratar de explicarlo con más detalle.
Re: Cómo definir una nueva columna basada en la condición de n filas consecutivasHay un error en la imagen adjunta en el mensaje anterior. Ignore el último rectángulo rojo, ya que por error, también he cambiado el contador para el requisito anterior. Eso no debería ser el caso.
gracias, hss
Re: Cómo definir una nueva columna basada en la condición de n filas consecutivasHola Jarmo y todos,
Este código funciona bien y puedo implementarlo perfectamente en el script.
Pero por otro lado, no soy capaz de entenderlo. Quiero modificarlo un poco pero no puedo hacerlo. ¿Me ayudarías en eso por favor?
1. ¿Qué está haciendo esta declaración?
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
2. No puedo entender dónde se está produciendo el incremento en el 'cambio' y cómo se puede satisfacer este condicional.
If(change & over_limit >= 10,
Creo que es lo mismo que - "If( change >=10 & over_limit >=10
3. En mi problema actual, me gustaría aumentar el contador en uno una vez que finalice la región deseada (con un mínimo de 10 entradas), algo como esto:

Alguna ayuda ?
gracias, hss
Re: Cómo definir una nueva columna basada en la condición de n filas consecutivasGracias Jarmo,
Está funcionando perfectamente. Ahora tengo que integrar esto en mi script. Espero poder hacer eso.
gracias, hss
Re: Cómo definir una nueva columna basada en la condición de n filas consecutivasSubíndice de tabla de datos es una opción
Cambié el nombre de la columna actual:
Names Default To Here(1);
dt = Current Data Table();
dt << New Column("a", Numeric, Ordinal,
<< Set Each Value(
If(Row() == 1,
val = 1; // this is breaking rule of > 750, so we define it separately
change = 1;
);
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit = Sum(next_vals >= 750);
If(change & over_limit >= 10,
val++;
change = 0;
, over_limit < 10,
change = 1;
);
val;
)
);