2017-01-11 1 views
0

이 예에서는 각 메트릭 (이름)마다 그룹 당 스칼라로 요약 통계 (예 : 평균 편차)를 우아하게 계산하려면 어떻게해야합니까?스칼라 요약 통계

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/ 입니다하지만 그룹화를 포함하지 않습니다.

답변

2

당신은 그룹이 다음 요약 통계를 계산하는 데 사용할 수 있습니다 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)) } 
+0

대단한 것 같습니다. 그러나, 나를 위해, 나는 평균과 각각의 분산에 대해 '가치 발견되지 않음'을 얻는다. 링크에 따라 정의해야합니까? 아니면 어딘가에서 가져와야하거나 직접 구현해야합니까? 링크에서 가져와야 할 경우 암시 적 매핑을 사용할 수 없기 때문에 실패한 부분을 확인해야합니다. https://gist.github.com/geoHeil/bf944a9ac04d20973c479057128c7fd2 –

+0

예, 링크에 정의 된 기능을 언급했습니다. 링크에있는 문서를 기반으로 함수를 작동시키기 위해 많은 암시 적 변환기를 사용하고 있습니다. 편집을 완료하려면 모든 변환기가 필요합니다 (예 : 당신은'Numeric [T]'typeclass를 import 할 필요가있다. –

+0

모든 implicits 감사를 확인해야합니다. –