Promedio móvil con datos faltantesEstoy tratando de calcular un promedio móvil de algunos datos que tienen algunos agujeros. Parece que no puedo averiguar cómo calcular un promedio móvil que solo incluya datos no faltantes y que solo calcule el resultado para filas con datos no faltantes. Cualquier sugerencia sera apreciada.
New Table( "Untitled 5",
Add Rows( 30 ),
Compress File When Saved( 1 ),
New Table Variable( "Moving Avg Window", 5 ),
New Column( "DateTime",
Numeric,
"Continuous",
Format( "m/d/y h:m", 19 ),
Input Format( "m/d/y h:m" ),
Set Values(
[3225888000, 3225888900, 3225889800, 3225890700, 3225891600, 3225892500, 3225893400, 3225894300,
3225895200, 3225896100, 3225897000, 3225897900, 3225898800, 3225899700, 3225900600, 3225901500,
3225902400, 3225903300, 3225904200, 3225905100, 3225906000, 3225906900, 3225907800, 3225908700,
3225909600, 3225910500, 3225911400, 3225912300, 3225913200, 3225914100]
)
),
New Column( "data",
Numeric,
"Continuous",
Format( "Best", Use thousands separator( 0 ), 15 ),
Set Values( [5, 5, 5, 5, 5, ., 5, 5, 5, 5, 5, 5, 5, 5, ., 5, 5, 5, 5, 5, 5, 5, ., ., 5, 5, 5, 5, 5, 5] )
),
New Column( "expected run avg",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [., ., ., ., 5, ., 5, 5, 5, 5, 5, 5, 5, 5, ., 5, 5, 5, 5, 5, 5, 5, ., ., 5, 5, 5, 5, 5, 5] )
),
New Column( "run avg",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 1 ),
Formula(
If( Row() < :Moving Avg Window,
.,
Sum( :data[Index( Row() - (:Moving Avg Window - 1), Row() )] ) / :Moving Avg Window
)
)
)
);Re: media móvil con datos faltantesNo miré este caso en detalle. Pero solo quería mencionar también:
Promedio de movimiento de columna (nombre, opciones, )
Lo que parece tener mucha flexibilidad.
Re: media móvil con datos faltantesGracias a todos por opinar sobre esta pregunta. La sugerencia de MS es ciertamente la más limpia y más fácil de implementar, ya que me permite definir y especificar el tamaño de la ventana que se mueve hacia atrás y hacia adelante. Ciertamente aprendí mucho de todos los ejemplos proporcionados. ¡Gracias!
Re: media móvil con datos faltantesEn el enlace de abajo, hablamos de esto y le agregamos un par de algoritmos más rápidos.
https://community.jmp.com/t5/Discussions/Efficient-moving-average-algorithm/td-p/8553
Re: media móvil con datos faltantesLa función Mean () descuida cualquier valor faltante. La siguiente fórmula se adhiere a la ventana de tiempo pero no incluye los valores faltantes al calcular la media.
If(Row() < :Moving Avg Window,
Mean(:data[Index(1, Row())]),
Mean(:data[Index(Row() - (:Moving Avg Window - 1), Row())])
);
Re: media móvil con datos faltantesSi no puede crear un subconjunto que excluya los valores nulos, creo que la siguiente fórmula funciona, aunque estoy seguro de que hay una mejor manera. Esto da un valor nulo para las filas sin datos, pero puede hacer que repita el promedio eliminando la instrucción if.
If (Missing (: data),., Rsum = 0; rcount = 0; temprow = 0; (While (rcount <: Avg en movimiento de la ventana, While (Missing (: data [Row () - temprow]) & Row () - temprow> = 1, temprow + = 1); rsum + =: data [Row () - temprow]; temprow + = 1; rcount + = 1); rsum /: Moving Avg Window))
Re: media móvil con datos faltantesAquí hay un guión que creo que le dará lo que quiere
Names Default To Here( 1 );
dt = New Table( "Untitled 5",
Add Rows( 30 ),
Compress File When Saved( 1 ),
New Table Variable( "Moving Avg Window", 5 ),
New Column( "DateTime",
Numeric,
"Continuous",
Format( "m/d/y h:m", 19 ),
Input Format( "m/d/y h:m" ),
Set Values(
[3225888000, 3225888900, 3225889800, 3225890700, 3225891600, 3225892500, 3225893400,
3225894300, 3225895200, 3225896100, 3225897000, 3225897900, 3225898800, 3225899700,
3225900600, 3225901500, 3225902400, 3225903300, 3225904200, 3225905100, 3225906000,
3225906900, 3225907800, 3225908700, 3225909600, 3225910500, 3225911400, 3225912300,
3225913200, 3225914100]
)
),
New Column( "data",
Numeric,
"Continuous",
Format( "Best", Use thousands separator( 0 ), 15 ),
Set Values(
[5, 5, 5, 5, 5, ., 5, 5, 5, 5, 5, 5, 5, 5, ., 5, 5, 5, 5, 5, 5, 5, ., ., 5, 5, 5, 5,
5, 5]
)
),
New Column( "expected run avg",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[., ., ., ., 5, ., 5, 5, 5, 5, 5, 5, 5, 5, ., 5, 5, 5, 5, 5, 5, 5, ., ., 5, 5, 5, 5,
5, 5]
)
),
New Column( "run avg",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 1 ),
Formula(
If( Row() == 1,
NonMissingRows = dt << get rows where( Is Missing( :data ) == 0 )
);
If( Loc( As List( NonMissingRows ), Row() ) < :Moving Avg Window,
.,
TargetPosition = Loc( As List( NonMissingRows ), Row() );
MatrixofMAW = NonMissingRows[Index(
TargetPosition - (Moving Avg Window - 1),
TargetPosition
)];
Show( Row(), MatrixofMAW );
Sum( :data[MatrixofMAW] ) / :Moving Avg Window;
);
)
)
);