/
data.go
86 lines (70 loc) · 1.71 KB
/
data.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package main
import (
"encoding/csv"
"fmt"
"io"
"strconv"
"github.com/gonum/matrix/mat64"
)
// Cols are features
// Rows are examples
type Data struct {
Cols, Rows int /* Number of features and examples*/
Labels []string /* Names of features */
Data *mat64.Dense /* Actual Data */
}
func (d *Data) setFeatures(record []string) {
d.Cols = len(record)
d.Labels = record
d.initializeMatrix()
}
func (d *Data) initializeMatrix() {
d.Data = mat64.NewDense(d.Rows, d.Cols, nil)
}
func (d *Data) readHeader(r csv.Reader) {
record, err := r.Read()
if err != nil {
fmt.Println("ERROR: ", err)
}
d.setFeatures(record)
}
func (d *Data) readFeatures(in csv.Reader) {
for {
record, err := in.Read()
if err == io.EOF {
break
}
if err != nil {
fmt.Println("ERROR: ", err)
}
x := len(record)
conv := make([]float64, x, x)
correctData := true
for i := 0; i < x; i++ {
conv[i], err = strconv.ParseFloat(record[i], 64)
if err != nil {
fmt.Println("ERROR: ", err)
correctData = false
}
}
if correctData {
d.AppendRow(conv)
}
}
}
func (d *Data) AppendRow(newRow []float64) {
d.Data = mat64.DenseCopyOf(d.Data.Grow(1, 0))
d.Rows, d.Cols = d.Data.Dims()
d.Data.SetRow(d.Rows-1, newRow)
return
}
func (d *Data) readCSV(in io.Reader) {
r := csv.NewReader(in)
d.readHeader(*r)
d.readFeatures(*r)
}
func NewData(in io.Reader, target string) *Data {
data := Data{Data: &mat64.Dense{}}
data.readCSV(in)
return &data
}