我是scala的新手。我有一个要求在scala中添加滚动窗口功能。我取得了部分成功。
category=="BB" || "CC"
下面是我的摘录。
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))
}
}
所需的输出
输入
我不确定您要问的是什么,但是看来您的主要问题是您需要按天和帐户进行分组,并且需要一个类别的内部映射才能对该类别进行汇总。我不知道您如何将输出处理到电子表格中,但是如果您想很好地格式化它,则需要某种方式来获取类别的完整列表(而且我想可能不会显示类别的完整列表)输入数据中,因此您也需要注意)。
如果您对函数使用返回类型Map[(Int, String), (Double, Double, Map[String, Double])]
,其中Int
是日期,而内部Map
是从类别到总和的,那么您将获得正确形状的数据。为了使该方法适合该签名,您需要进行一些更改:
groupBy(t => (t.transactionDay, t.accountId))
,这样您就可以打开日间窗口。这不是滚动窗口,但是我不确定您是否确实想要rolling window-如果我输入错了,请告诉我。
将其余代码移至单个mapValues
函数的内部。 (并非绝对必要,但比您当前的方法更整洁。)
添加一个字段(在mapValues
内部,具有最大值和平均值),该字段是通过执行另一个groupBy
创建的,但是这次是在类别上。