Gleitender Durchschnitt mit fehlenden DatenIch versuche, einen gleitenden Durchschnitt einiger Daten zu berechnen, die einige Lücken aufweisen. Ich kann anscheinend nicht herausfinden, wie man einen gleitenden Durchschnitt berechnet, der nur nicht fehlende Daten enthält und das Ergebnis nur für Zeilen mit nicht fehlenden Daten berechnet. Für Vorschläge wäre ich dankbar.
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
)
)
)
);Betreff: Gleitender Durchschnitt mit fehlenden DatenIch habe mir diesen Fall nicht im Detail angesehen. Aber ich wollte nur noch erwähnen:
Col Moving Average(Name, Optionen, )
das scheint viel Flexibilität zu haben.
Betreff: Gleitender Durchschnitt mit fehlenden DatenVielen Dank an alle, die sich zu dieser Frage geäußert haben. Der Vorschlag von MS ist sicherlich der sauberste und für mich am einfachsten umzusetzende Vorschlag, da ich damit die Größe des Fensters für die Vorwärts- und Rückwärtsbewegung definieren und angeben kann. Ich habe aus all den Beispielen auf jeden Fall viel gelernt. Danke!
Betreff: Gleitender Durchschnitt mit fehlenden DatenIm folgenden Link haben wir darüber gesprochen und ein paar schnellere Algorithmen dafür bereitgestellt.
https://community.jmp.com/t5/Discussions/Efficient-moving-average-algorithm/td-p/8553
Betreff: Gleitender Durchschnitt mit fehlenden DatenDie Funktion Mean() vernachlässigt alle fehlenden Werte. Die folgende Formel bleibt beim Zeitfenster, berücksichtigt jedoch bei der Berechnung des Mittelwerts keine fehlenden Werte.
If(Row() < :Moving Avg Window,
Mean(:data[Index(1, Row())]),
Mean(:data[Index(Row() - (:Moving Avg Window - 1), Row())])
);
Betreff: Gleitender Durchschnitt mit fehlenden DatenWenn Sie keine Teilmenge erstellen können, die die Nullwerte ausschließt, denke ich, dass die folgende Formel funktioniert – obwohl ich mir sicher bin, dass es einen besseren Weg gibt. Dies ergibt einen Nullwert für Zeilen ohne Daten, aber Sie können den Durchschnitt wiederholen, indem Sie die if-Anweisung entfernen.
If(Is Missing(: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))
Betreff: Gleitender Durchschnitt mit fehlenden DatenHier ist ein Skript, von dem ich glaube, dass es Ihnen das gibt, was Sie wollen
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;
);
)
)
);