Я новичок в scala, поэтому не уверен, как подойти к этой проблеме? В основном я пытаюсь найти скользящие средние кроссоверы для потока котировок. Я не уверен, как добраться до предыдущих значений, чтобы сравнить их с текущими значениями?В Scala как сравнивать текущие значения с предыдущими значениями при обработке потока?
if (fastMovingAverage(n-1) > slowMovingAverage(n-1) && fastMovingAverage(n) < slowMovingAverage(n))
then do some action
package com.example.csv
import scala.io.Source
object FileParser {
val TIMESTAMP_LOCATION = 3
val BID_LOCATION = 4
val OFFER_LOCATION = 5
val FAST_WINDOW_SIZE = 5
val SLOW_WINDOW_SIZE = 10
def main(args: Array[String]) = {
val records = Source.fromFile("Sample.csv")
.getLines()
.drop(1)
.map(_.split(","))
.takeWhile(_ != null)
.sliding(SLOW_WINDOW_SIZE , 1)
.foreach(x => movingAverage(x))
}
def movingAverage(numbers: Seq[Array[String]]) = {
val listOfBids = numbers.map(x => x(BID_LOCATION).toDouble)
val slowAverage = listOfBids.reduceLeft(_ + _)/numbers.length
val fastListOfBids = listOfBids.takeRight(FAST_WINDOW_SIZE)
val fastAverage = fastListOfBids.reduceLeft(_ + _)/fastListOfBids.length
println("Slow Average " + slowAverage + " Fast Average " + fastAverage)
}
}
Не используйте 'takeRight' для потоков, так как это может привести к бесконечной или очень длительной оценке. 'drop' скользящего размера окна кажется более подходящим. Возможно, вместо ответа 'List' на' Stream' в этом примере лучше ответить на вопрос. – Leo