【问题标题】:summary statistics in scalascala中的汇总统计信息
【发布时间】:2017-01-11 12:34:28
【问题描述】:

在此示例中,如何根据每个不同的指标(名称)在每个组的 scala 中优雅地计算汇总统计数据(例如平均方差)?

case class MeasureUnit(name: String, value: Double)

Seq(MeasureUnit("metric1", 0.04), MeasureUnit("metric1", 0.09),
  MeasureUnit("metric2", 0.64), MeasureUnit("metric2", 0.34), MeasureUnit("metric2", 0.84))

如何计算每个属性的均值/方差的一个很好的例子是https://chrisbissell.wordpress.com/2011/05/23/a-simple-but-very-flexible-statistics-library-in-scala/ 但这不包括分组。

【问题讨论】:

    标签: scala statistics summary


    【解决方案1】:

    您可以使用Seq#groupBy

    val measureSeq : Seq[MeasureUnit] = ???
    
    type Name = String
    
    // "metric1" -> Seq(0.04, 0.09), "metric2" -> Seq(0.64, 0.34, 0.84)
    val groupedMeasures : Map[Name, Seq[Double]] = 
      measureSeq
        .groupBy(_.name)
        .mapValues(_ map (_.value))
    

    然后可以使用分组来计算您的汇总统计数据:

    type Mean = Double
    
    val meanMapping : Map[Name, Mean] = 
      groupedMeasures mapValues { v => mean(v) }
    
    type Variance = Double
    
    val varianceMapping : Map[Name, Variance] = 
      groupedMeasures mapValues { v => variance(v) }
    

    或者您可以将每个名称映射到一个统计元组:

    type Summary = Tuple2[Mean, Variance]
    
    val summaryMapping : Map[Name, Summary] = 
      groupedMeasures mapValues {s => (mean(s), variance(s)) }
    

    【讨论】:

    • 这看起来很棒。但是,对我来说,我得到not found value mean 的均值和各自的方差。我需要根据链接定义这些吗?还是需要从某个地方导入/自己实现它们?如果它们应该来自链接,请查看哪个失败,因为没有可用的隐式映射:gist.github.com/geoHeil/bf944a9ac04d20973c479057128c7fd2
    • 是的,我指的是链接中定义的函数。根据链接中的文档,他们正在使用许多隐式转换器来使功能正常工作。您需要编译范围内的所有转换器才能完成,例如您需要导入 Numeric[T] 类型类。
    • 抱歉再次询问。如果val meanMapping: Map[Name, Mean] = groupedMeasures mapValues mean 因上述问题而失败但mean(groupedMeasures.get("metric1").get) 工作正常,我错过了什么?
    • 无需道歉。也许隐式不起作用。我用稍微不同的语法更新了我的答案。看看这是否有效......
    • 谢谢,效果很好。我是否需要导入中缀运算符才能使其他解决方案工作?
    猜你喜欢
    • 2015-09-22
    • 2012-01-07
    • 2016-01-28
    • 2019-03-19
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多