要在具有多个过滤器的scala中添加滚动窗口功能

问题描述 投票:2回答:1

我是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

scala
1个回答
1
投票

我不确定您要问的是什么,但是看来您的主要问题是您需要按天和帐户进行分组,并且需要一个类别的内部映射才能对该类别进行汇总。我不知道您如何将输出处理到电子表格中,但是如果您想很好地格式化它,则需要某种方式来获取类别的完整列表(而且我想可能不会显示类别的完整列表)输入数据中,因此您也需要注意)。

如果您对函数使用返回类型Map[(Int, String), (Double, Double, Map[String, Double])],其中Int是日期,而内部Map是从类别到总和的,那么您将获得正确形状的数据。为了使该方法适合该签名,您需要进行一些更改:

  1. groupBy(t => (t.transactionDay, t.accountId)),这样您就可以打开日间窗口。这不是滚动窗口,但是我不确定您是否确实想要rolling window-如果我输入错了,请告诉我。

  2. 将其余代码移至单个mapValues函数的内部。 (并非绝对必要,但比您当前的方法更整洁。)

  3. 添加一个字段(在mapValues内部,具有最大值和平均值),该字段是通过执行另一个groupBy创建的,但是这次是在类别上。

© www.soinside.com 2019 - 2024. All rights reserved.