Ich bin neu in Scala und möchte eine bewegliche Summe mit einem festen Fenster für eine Liste berechnen.
Beispiel: Angesichts der Listenwerte (1.0, 2.0, 3.0, 6.0, 7.0, 8.0, 12.0, 9.0, 4.0, 1.0) und der Periode 4 sollte die Funktion Folgendes zurückgeben: (1.0, 3.0, 6.0, 12.0, 18.0, 24,0, 33,0, 36,0, 33,0, 26,0)
Wenn list.size <period ist, geben Sie einfach die kumulative Summe zurück.
Ich habe einige Versuche gemacht
def mavg(values: List[Double], period: Int): List[Double] = {
if (values.size <= period) (values.sum ) :: List.fill(period -1)(values.sum ) else {
val rest: List[Double] = mavg(values.tail, period)
(rest.head + ((values.head - values(period)))):: rest
}
}
Ich habe jedoch
List(12.0, 18.0, 24.0, 33.0, 36.0, 33.0, 26.0, 26.0, 26.0, 26.0
das ist nicht richtig. Ich möchte Pyspark nicht verwenden, um die Ergebnisse zu erhalten. Kann jemand helfen?
Danke vielmals.
list
scala
sum
rolling-sum
FlyUFalcon
quelle
quelle
sliding
Antworten:
quelle
List(0.0)
values = Seq()
period > 1
Hier ist eine Möglichkeit, dies zu beheben.
testen:
quelle
Dies ist eine andere Möglichkeit, wie Sie dies tun können:
quelle
Ein anderer Ansatz, ähnlich der Antwort von @ User9123
Der Unterschied besteht darin, dass nicht die Summe aller Elemente im Schiebefenster berechnet wird, sondern der Wert des letzten Fensterkopfs von seiner Summe subtrahiert und der Wert des nächsten Fensterkopfs addiert wird, um die nächste rollierende Summe zu erhalten. Dies sollte bei großen Fenstern effizienter sein.
Ich habe auch einige Schutzvorrichtungen für Sonderfälle hinzugefügt, die behandelt werden müssen, und es zu einer generischen Funktion für alle
Numeric
Typen gemacht.Hier ist ein laufendes Beispiel mit einigen Testfällen.
quelle