Mercurial > gemma
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"`