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