Soy nuevo en Scala y quiero calcular una suma móvil con una ventana fija para una lista.
Por ejemplo: dados los valores de la lista (1.0, 2.0, 3.0, 6.0, 7.0, 8.0, 12.0, 9.0, 4.0, 1.0), y el período 4, la función debería devolver: (1.0, 3.0, 6.0, 12.0, 18.0, 24.0, 33.0, 36.0, 33.0, 26.0)
Si list.size <punto, simplemente devuelve la suma acumulativa.
He hecho algunos intentos
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
}
}
Sin embargo, tengo
List(12.0, 18.0, 24.0, 33.0, 36.0, 33.0, 26.0, 26.0, 26.0, 26.0
lo cual no es correcto No quiero usar Pyspark para obtener los resultados. Alguien puede ayudar?
Muchas gracias.
list
scala
sum
rolling-sum
FlyUFalcon
fuente
fuente
sliding
métodoRespuestas:
fuente
List(0.0)
cuandovalues = Seq()
yperiod > 1
Aquí hay una forma de abordarlo.
pruebas:
fuente
Esta es otra forma de hacer esto:
fuente
Otro enfoque, similar a la respuesta de @ User9123
La diferencia es que no calcula la suma de todos los elementos en la ventana deslizante, sino que resta el valor de la última cabeza de la ventana de su suma y agrega el valor de la siguiente cabeza de la ventana para obtener la siguiente suma. Esto debería ser más eficiente para ventanas grandes.
También agregué algunos protectores para casos especiales que deben manejarse y lo convertí en una función genérica para todos los
Numeric
tipos.Aquí hay un ejemplo en ejecución con algunos casos de prueba.
fuente