Media mobile con dati mancantiSto provando a calcolare una media mobile di alcuni dati che presenta dei buchi. Non riesco a capire come cacolare una media mobile che includa solo dati non mancanti e che calcoli solo il risultato per le righe con dati non mancanti. Tutti i suggerimenti sarebbero apprezzati.
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
)
)
)
);Ri: Media mobile con dati mancantiNon ho esaminato questo caso in dettaglio. Ma volevo solo menzionare:
Col Moving Average (nome, opzioni, )
che sembra avere molta flessibilità.
Ri: Media mobile con dati mancantiGrazie a tutti per aver riflettuto su questa domanda. Il suggerimento di MS è sicuramente il più pulito e facile da implementare poiché consente di definire e specificare le dimensioni della finestra di spostamento avanti e indietro. Ho sicuramente imparato molto da tutti gli esempi forniti. Grazie!
Ri: Media mobile con dati mancantiNel link seguente abbiamo parlato di questo e abbiamo messo un paio di algoritmi più veloci per questo.
https://community.jmp.com/t5/Discussions/Efficient-moving-average-algorithm/td-p/8553
Ri: Media mobile con dati mancantiLa funzione Mean () trascura qualsiasi valore mancante. La seguente formula si limita alla finestra temporale, ma non include i valori mancanti durante il calcolo della media.
If(Row() < :Moving Avg Window,
Mean(:data[Index(1, Row())]),
Mean(:data[Index(Row() - (:Moving Avg Window - 1), Row())])
);
Ri: Media mobile con dati mancantiSe non riesci a creare un sottoinsieme escludendo i valori nulli, penso che la formula sottostante funzioni, anche se sono sicuro che c'è un modo migliore. Questo dà un valore nullo per le righe senza dati ma puoi farlo ripetere la media eliminando l'istruzione if.
Se (Manca (: dati),., 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))
Ri: Media mobile con dati mancantiEcco una sceneggiatura che credo ti darà quello che vuoi
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;
);
)
)
);