Moyenne mobile avec données manquantesJ'essaie de calculer une moyenne mobile de certaines données comportant des trous. Je n'arrive pas à comprendre comment calculer une moyenne mobile qui inclut uniquement les données non manquantes et qui calcule uniquement le résultat pour les lignes contenant des données non manquantes. Toute suggestion serait appréciée.
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 : Moyenne mobile avec données manquantesJe n'ai pas examiné ce cas en détail. Mais je voulais juste mentionner aussi :
Moyenne mobile du col (nom, options, )
qui semble avoir beaucoup de flexibilité.
Re : Moyenne mobile avec données manquantesMerci à tous d'avoir répondu à cette question. La suggestion de MS est certainement la plus propre et la plus simple à mettre en œuvre car elle me permet de définir et de spécifier la taille de la fenêtre de déplacement vers l'avant et l'arrière. J'ai certainement beaucoup appris de tous les exemples fournis. Merci!
Re : Moyenne mobile avec données manquantesDans le lien ci-dessous, nous en avons parlé et avons mis quelques algorithmes plus rapides pour cela.
https://community.jmp.com/t5/Discussions/Efficient-moving-average-algorithm/td-p/8553
Re : Moyenne mobile avec données manquantesLa fonction Mean() néglige toutes les valeurs manquantes. La formule ci-dessous s'en tient à la fenêtre temporelle mais n'inclut pas les valeurs manquantes lors du calcul de la moyenne.
If(Row() < :Moving Avg Window,
Mean(:data[Index(1, Row())]),
Mean(:data[Index(Row() - (:Moving Avg Window - 1), Row())])
);
Re : Moyenne mobile avec données manquantesSi vous ne pouvez pas créer un sous-ensemble excluant les valeurs nulles, je pense que la formule ci-dessous fonctionne, même si je suis sûr qu'il existe une meilleure solution. Cela donne une valeur nulle pour les lignes sans données, mais vous pouvez lui faire répéter la moyenne en supprimant l'instruction if.
Si (est manquant (: data), ., rsum = 0; rcount = 0; temprow = 0; (While (rcount < :Moving Avg Window, While (Is Missing (: data [Row() - temprow]) & Row () - temprow >= 1, temprow += 1); rsum += :data[Row() - temprow]; temprow += 1; rcount += 1); rsum / :Moving Avg Window))
Re : Moyenne mobile avec données manquantesVoici un script qui, je crois, vous donnera ce que vous voulez
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;
);
)
)
);