Добавить функцию скользящего окна в scala с несколькими фильтрами - PullRequest
2 голосов
/ 19 января 2020

Я новичок в scala. У меня есть одно требование добавить функцию скользящего окна в scala. Я был частично успешным.

  1. В настоящее время я пытаюсь добавить больше критериев фильтра с условиями или , которые будут включены в категорию, например, category=="BB" || "CC"
  2. А также к включите максимальное количество транзакций для каждой категории для каждой учетной записи.

Ниже приведен мой фрагмент.

def analytics(ts: List[Transaction], day: Int): Map[String, (Double, Double)] = {

  val roll = ts
   .filter(trans => trans.transactionDay >= day - 30 && trans.transactionDay < day)
   .groupBy(_.accountId)
  val sum1 = roll.mapValues(_.filter(_.category == "BB"))
                      .mapValues(_.map(_.transactionAmount).sum)
  val sum2 = roll.mapValues(_.map(_.transactionAmount).sum)
  val allCounts = roll.mapValues(_.length)
 sum2.map { case (id, sum) => 
    id -> (sum1.getOrElse(id, 0.0), sum / allCounts(id)) 
}
}

Желаемый результат

enter image description here

вход

enter image description here

1 Ответ

1 голос
/ 20 января 2020

Я не совсем уверен, что вы спрашиваете, но, похоже, ваши основные проблемы в том, что вам нужно группировать по дням, а также по счету, и вам нужна внутренняя карта из категории для суммирования по этой категории. Я не знаю, как вы обрабатываете вывод в электронную таблицу, но вам понадобится какой-то способ получить полный список категорий, если вы хотите правильно отформатировать его (и я полагаю, что полный список категорий может быть не представлен во входных данных, так что вам тоже нужно быть осторожным).

Если вы используете тип возврата Map[(Int, String), (Double, Double, Map[String, Double])] для своей функции, где Int - день, а внутренний Map это от категории к сумме, тогда вы будете иметь данные в правильной форме. Чтобы метод соответствовал этой сигнатуре, вам нужно внести несколько изменений:

  1. groupBy(t => (t.transactionDay, t.accountId)), чтобы вы получили окно дня. Это не скользящее окно, но я не уверен, что вы на самом деле хотите скользящее окно в любом случае - дайте мне знать, если я ошибаюсь.

  2. Переместите остальную часть кода внутрь одной функции mapValues. (Не обязательно, но точнее, чем ваш текущий подход.)

  3. Добавьте поле (внутри mapValues, с максимальным и средним значениями), созданное с помощью другого groupBy, но это время по категориям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...