comparison pkg/controllers/gauges.go @ 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 e6dc09896a4d
children fe3d5e824ee9
comparison
equal deleted inserted replaced
2877:55a9c7965e25 2878:4f66a3ba424b
16 import ( 16 import (
17 "database/sql" 17 "database/sql"
18 "encoding/csv" 18 "encoding/csv"
19 "fmt" 19 "fmt"
20 "log" 20 "log"
21 "math"
21 "net/http" 22 "net/http"
22 "sort" 23 "sort"
23 "strconv" 24 "strconv"
24 "strings" 25 "strings"
25 "time" 26 "time"
34 ) 35 )
35 36
36 const ( 37 const (
37 selectPredictedObserveredSQL = ` 38 selectPredictedObserveredSQL = `
38 SELECT 39 SELECT
39 a.measure_date AS measure_date, 40 measure_date,
40 a.water_level AS predicted, 41 predicted,
41 b.water_level AS observed 42 water_level
42 FROM waterway.gauge_measurements a JOIN waterway.gauge_measurements b 43 FROM waterway.gauge_measurements
43 ON a.fk_gauge_id = b.fk_gauge_id AND
44 a.measure_date = b.measure_date AND
45 a.predicted AND NOT b.predicted
46 WHERE 44 WHERE
47 a.fk_gauge_id = ( 45 a.fk_gauge_id = (
48 $1::char(2), 46 $1::char(2),
49 $2::char(3), 47 $2::char(3),
50 $3::char(5), 48 $3::char(5),
51 $4::char(5), 49 $4::char(5),
52 $5::int 50 $5::int
53 ) AND 51 ) AND
54 a.measure_date BETWEEN 52 measure_date BETWEEN
55 $6::timestamp AND $6::timestamp - '72hours'::interval 53 $6::timestamp AND $6::timestamp - '72hours'::interval
56 ORDER BY a.measure_date 54 ORDER BY measure_date, date_issue
57 ` 55 `
58
59 selectWaterlevelsSQL = ` 56 selectWaterlevelsSQL = `
60 SELECT 57 SELECT
61 measure_date, 58 measure_date,
62 water_level, 59 water_level,
63 value_min, 60 value_min,
455 } 452 }
456 defer rows.Close() 453 defer rows.Close()
457 454
458 var measurements []common.NSMeasurement 455 var measurements []common.NSMeasurement
459 456
457 invalid := common.NSMeasurement{
458 Predicted: math.NaN(),
459 Observed: math.NaN(),
460 }
461 current := invalid
462
460 for rows.Next() { 463 for rows.Next() {
461 var m common.NSMeasurement 464 var (
465 when time.Time
466 predicted bool
467 value float64
468 )
462 if err = rows.Scan( 469 if err = rows.Scan(
463 &m.When, 470 &when,
464 &m.Predicted, 471 &predicted,
465 &m.Observed, 472 &value,
466 ); err != nil { 473 ); err != nil {
467 return 474 return
468 } 475 }
469 measurements = append(measurements, m) 476 if !when.Equal(current.When) {
470 } 477 if current.Valid() {
478 measurements = append(measurements, current)
479 }
480 current = invalid
481 }
482 if predicted {
483 current.Predicted = value
484 } else {
485 current.Observed = value
486 }
487 }
488
471 if err = rows.Err(); err != nil { 489 if err = rows.Err(); err != nil {
472 return 490 return
491 }
492
493 if current.Valid() {
494 measurements = append(measurements, current)
473 } 495 }
474 496
475 type coeff struct { 497 type coeff struct {
476 Value float64 `json:"value"` 498 Value float64 `json:"value"`
477 Samples int `json:"samples"` 499 Samples int `json:"samples"`