Eu sou novo no Scala e quero calcular uma soma móvel com uma janela fixa para uma lista.
Por exemplo: Dados os valores da lista (1.0, 2.0, 3.0, 6.0, 7.0, 8.0, 12.0, 9.0, 4.0, 1.0) e o período 4, a função deve retornar: (1.0, 3.0, 6.0, 12.0, 18.0, 24,0, 33,0, 36,0, 33,0, 26,0)
Se list.size <period, basta retornar a soma acumulada.
Eu fiz algumas tentativas
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
}
}
No entanto, eu tenho
List(12.0, 18.0, 24.0, 33.0, 36.0, 33.0, 26.0, 26.0, 26.0, 26.0
o que não está correto. Não quero usar o Pyspark para obter os resultados. Alguém pode ajudar?
Muito Obrigado.
list
scala
sum
rolling-sum
FlyUFalcon
fonte
fonte
sliding
métodoRespostas:
fonte
List(0.0)
quandovalues = Seq()
eperiod > 1
Aqui está uma maneira de lidar com isso.
teste:
fonte
Esta é outra maneira de fazer isso:
fonte
Outra abordagem, semelhante à resposta de @ User9123
A diferença é que ele não calcula a soma de todos os elementos na janela deslizante, mas subtrai o valor do cabeçalho da última janela da sua soma e adiciona o valor do cabeçalho da próxima janela para gerar a próxima soma rolante. Isso deve ser mais eficiente para janelas grandes.
Também adicionei alguns protetores para casos especiais que precisam ser manipulados e a tornei uma função genérica para todos os
Numeric
tipos.Aqui está um exemplo em execução com alguns casos de teste.
fonte