changeset 2878:4f66a3ba424b

Fixed selection for Nash-Sutcliffe coeff calculation.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 01 Apr 2019 15:57:36 +0200
parents 55a9c7965e25
children c71b0c93e1a6
files pkg/common/nashsutcliffe.go pkg/controllers/gauges.go
diffstat 2 files changed, 42 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/common/nashsutcliffe.go	Mon Apr 01 13:24:32 2019 +0200
+++ b/pkg/common/nashsutcliffe.go	Mon Apr 01 15:57:36 2019 +0200
@@ -14,6 +14,7 @@
 package common
 
 import (
+	"math"
 	"sort"
 	"time"
 )
@@ -24,6 +25,10 @@
 	Observed  float64
 }
 
+func (m NSMeasurement) Valid() bool {
+	return !m.When.IsZero() && !math.IsNaN(m.Predicted) && !math.IsNaN(m.Observed)
+}
+
 func NashSutcliffeSort(measurements []NSMeasurement) {
 	sort.Slice(measurements, func(i, j int) bool {
 		return measurements[i].When.Before(measurements[j].When)
--- a/pkg/controllers/gauges.go	Mon Apr 01 13:24:32 2019 +0200
+++ b/pkg/controllers/gauges.go	Mon Apr 01 15:57:36 2019 +0200
@@ -18,6 +18,7 @@
 	"encoding/csv"
 	"fmt"
 	"log"
+	"math"
 	"net/http"
 	"sort"
 	"strconv"
@@ -36,13 +37,10 @@
 const (
 	selectPredictedObserveredSQL = `
 SELECT
-  a.measure_date AS measure_date,
-  a.water_level  AS predicted,
-  b.water_level  AS observed
-FROM waterway.gauge_measurements a JOIN waterway.gauge_measurements b
-  ON a.fk_gauge_id  = b.fk_gauge_id AND
-     a.measure_date = b.measure_date AND
-     a.predicted AND NOT b.predicted
+  measure_date,
+  predicted,
+  water_level
+FROM waterway.gauge_measurements
 WHERE
   a.fk_gauge_id = (
     $1::char(2),
@@ -51,11 +49,10 @@
     $4::char(5),
     $5::int
   ) AND
-  a.measure_date BETWEEN
+  measure_date BETWEEN
     $6::timestamp AND $6::timestamp - '72hours'::interval
-ORDER BY a.measure_date
+ORDER BY measure_date, date_issue
 `
-
 	selectWaterlevelsSQL = `
 SELECT
   measure_date,
@@ -457,21 +454,46 @@
 
 	var measurements []common.NSMeasurement
 
+	invalid := common.NSMeasurement{
+		Predicted: math.NaN(),
+		Observed:  math.NaN(),
+	}
+	current := invalid
+
 	for rows.Next() {
-		var m common.NSMeasurement
+		var (
+			when      time.Time
+			predicted bool
+			value     float64
+		)
 		if err = rows.Scan(
-			&m.When,
-			&m.Predicted,
-			&m.Observed,
+			&when,
+			&predicted,
+			&value,
 		); err != nil {
 			return
 		}
-		measurements = append(measurements, m)
+		if !when.Equal(current.When) {
+			if current.Valid() {
+				measurements = append(measurements, current)
+			}
+			current = invalid
+		}
+		if predicted {
+			current.Predicted = value
+		} else {
+			current.Observed = value
+		}
 	}
+
 	if err = rows.Err(); err != nil {
 		return
 	}
 
+	if current.Valid() {
+		measurements = append(measurements, current)
+	}
+
 	type coeff struct {
 		Value   float64 `json:"value"`
 		Samples int     `json:"samples"`