【发布时间】:2017-09-21 02:18:21
【问题描述】:
我刚开始学习 Scala 并探索它可以做事的方式,现在我正在尝试学习实现一些更复杂的数据分析。
我有一个加载到程序中的文本文件中不同国家不同城市的天气数据。到目前为止,我已经弄清楚了如何计算简单的事情,例如一个国家/地区每天的平均温度,或者整个文件中按国家/地区分组的每个城市的平均温度,使用 Maps/Mapvalues 将键绑定到我正在寻找的值为。
现在希望能够指定一个时间窗口(例如一周),然后从那里按国家/地区分组,计算出该时间窗口内每个城市的平均温度等信息。为简单起见,我将日期设为简单的 INT,而不是使用 MM/DD/YY 格式。
在另一种语言中,我可能会使用循环来执行此操作,但我不太确定执行此操作的最佳“Scala”方式。起初我以为可能是“滑动”或“分组”,但发现这会完全拆分列表,因此我无法指定任意日期来计算一周。我已经为我的方法提供了示例代码,该方法计算了整个时间段内每个城市的平均温度
def citytempaverages(): Map[String, Map[String, Double]] = {
weatherpatterns.groupBy(_.country)
.mapValues(_.groupBy(_.city)
.mapValues(cityavg => cityavg.map(_.temperature).sum /cityavg.length))
使用地图来解决这个新问题是否仍然有意义,或者集合 API 中的另一种方法更适合?
更新 #1:所以我建立了一个这样的集合:
def dailycities(): Map[Int, Map[String,Map[String, List[Double]]]] = {
weatherpatterns.groupBy(_.day)
.mapValues(_.groupBy(_.country).mapValues(_.groupBy(_.city)
.mapValues(_.map(_.temperature))))
}
然后使用 filterKeys 和 Set 函数创建了一个新地图,以返回我正在寻找的日期的列表。所以我想现在只需格式化即可正确得出平均值。
【问题讨论】:
-
能否请您附上您的
WeatherPattern数据类型的示例记录? -
在文本文件的 sn-p 中?坚持下去,如果是这样,我可以做到。
-
我看到你在
weatherpatterns的元素上调用了像.day和.country和 ... 这样的属性,所以我认为WeatherPattern应该是一个代表一行的案例类文件内容。 -
哦对了,是这样的:case class WeatherPattern(day: Int, country: String, city: String, temperature: Double)
标签: scala