floats: add ParseWithNA

This commit is contained in:
kortschak
2017-06-05 13:58:36 +09:30
committed by Dan Kortschak
parent e58bfb23e8
commit 94ece3546e
2 changed files with 57 additions and 0 deletions

View File

@@ -14,6 +14,7 @@ import (
"errors" "errors"
"math" "math"
"sort" "sort"
"strconv"
"gonum.org/v1/gonum/internal/asm/f64" "gonum.org/v1/gonum/internal/asm/f64"
) )
@@ -567,6 +568,19 @@ func Norm(s []float64, L float64) float64 {
return math.Pow(norm, 1/L) return math.Pow(norm, 1/L)
} }
// ParseWithNA converts the string s to a float64 in v.
// If s equals missing, w is returned as 0, otherwise 1.
func ParseWithNA(s, missing string) (v, w float64, err error) {
if s == missing {
return 0, 0, nil
}
v, err = strconv.ParseFloat(s, 64)
if err == nil {
w = 1
}
return v, w, err
}
// Prod returns the product of the elements of the slice. // Prod returns the product of the elements of the slice.
// Returns 1 if len(s) = 0. // Returns 1 if len(s) = 0.
func Prod(s []float64) float64 { func Prod(s []float64) float64 {

View File

@@ -0,0 +1,43 @@
// Copyright ©2017 The gonum Authors. All rights reserved.
// Use of this code is governed by a BSD-style
// license that can be found in the LICENSE file
package floats_test
import (
"bufio"
"fmt"
"log"
"strings"
"gonum.org/v1/gonum/floats"
"gonum.org/v1/gonum/stat"
)
func ExampleParseWithNA() {
// Calculate the mean of a list of numbers
// ignoring missing values.
const data = `6
missing
4
`
var vals, weights []float64
sc := bufio.NewScanner(strings.NewReader(data))
for sc.Scan() {
v, w, err := floats.ParseWithNA(sc.Text(), "missing")
if err != nil {
log.Fatal(err)
}
vals = append(vals, v)
weights = append(weights, w)
}
err := sc.Err()
if err != nil {
log.Fatal(err)
}
fmt.Println(stat.Mean(vals, weights))
// Output:
// 5
}