go语言机器学习第一章读书笔记

数据的收集与组织(例题中的代码链接)
1.使用go语言进行数据组织与处理的好处:
保证数据结果的完整性
利用共go语言的静态类型和明确的错误处理方式,确保数据的解析和期望的一致

1.2Go语言收集和组织数据的最佳实践
1.检查并强制指定期望类型
2.标准化和简化数据输入/输出
3.数据的版本控制
1.3读取CSV文件的方式
1.使用encoding包中的csv库函数来读取
2.使用第三方包 github.com/kniren/gota/dataframe 来读取
type CSVRecord struct {
SepalLength float64
SepalWidth float64
Petalength float64
PetalWidth float64
Speices string
ParseError error
}

func main() {
// 打开文件
f, err := os.Open(“D:/gocode/iris.csv”)
if err != nil {
log.Fatal(err)
}
defer f.Close()

// 读取文件
/*
	如果FieldsPerRecord大于0,Read方法要求每条记录都有给定数目的字段。
	如果FieldsPerRecord等于0,Read方法会将其设为第一条记录的字段数,因此其余的记录必须有同样数目的字段。
	如果FieldsPerRecord小于0,不会检查字段数,允许记录有不同数量的字段。
*/
reader := csv.NewReader(f)
reader.FieldsPerRecord = 5
// 读取所有的数据
// rawCsvData, err := reader.ReadAll()
// if err != nil {
// 	log.Fatal(err)
// }
// 保证正确性
// var rawCsvData [][]string
// 定义切片数组 用来存储对象
var csvData []CSVRecord
for {
	// 读取文件
	record, err := reader.Read()
	if err == io.EOF {
		break
	}
	// 定义接收数据的对象
	var csvrecord CSVRecord
	// 便利或缺每一行记录中的的各个域的值
	for idx, value := range record {

		if idx == 4 {
			// 缺失域的情况
			if value == "" {
				log.Printf("unexpected type in column %d\n ", idx)
				csvrecord.ParseError = fmt.Errorf("enpty string value ")
				break
			}
			csvrecord.Speices = value
			continue
		}
		var floatValue float64
		if floatValue, err = strconv.ParseFloat(value, 64); err != nil {
			log.Printf("unexpected tyoe in column %d \n  ", idx)
			csvrecord.ParseError = fmt.Errorf("Could not parse float")
			break
		}
		switch idx {
		case 0:
			csvrecord.SepalLength = floatValue
		case 1:
			csvrecord.SepalWidth = floatValue
		case 2:
			csvrecord.Petalength = floatValue
		case 3:
			csvrecord.PetalWidth = floatValue
		}
	}
	if csvrecord.ParseError == nil {
		csvData = append(csvData, csvrecord)
	}
}
for _, v := range csvData {
	fmt.Println(v)
}

}

注意:使用第三种方式需要将第三方包中的文件go get获取 或者手动获取
获取之后再调用过程中还需要再下载gonum包 引文gota中的某一个文件使用gonum包中的一个函数 所以需要下载gonum
获取地址是 "gonum.org/v1/gonum/stat"

3.数据可以读取后存入数组切片中 也可以新建结构体 存储到结构体中

1.3.1用数据帧操作CSV数据
1.使用第三方包dataframe来创建数据帧
优势:数据帧和相应功能非常适合表格数据集合的过滤、求子集和数据部分选择。
func main() {
irisFile, err := os.Open(“D:/gocode/iris.csv”)
if err != nil {
log.Fatal(err)
}
defer irisFile.Close()
irisDF := dataframe.ReadCSV(irisFile)
fmt.Println(irisDF)
filter := dataframe.F{
Colname: “species”,
Comparator: “==”,
Comparando: “Iris-versicolor”,
}
versicolorDf := irisDF.Filter(filter)
if versicolorDf.Err != nil {
log.Fatal(versicolorDf.Err)
}

}

1.4操作JSON数据
net包定位页面数据 ioutil包读取和保存数据,json包反序列化与序列化转化数据的格式
// 导入数据的路径
const citiBikeURL = “https://gbfs.citibikenyc.com/gbfs/en/station_status.json”

// JSON数据的格式转换
type stationData struct {
LastUpdated int json:"lastuodated"
TTL int json:"ttl"
Data struct {
Stations []station json:"stations"
} json:"data"
}

type station struct {
ID string json:"station_id"
NumBikesAvailable int json:"num_bikes_available"
NumBikesDisabled int json:"num_bikes_disabled"
NumDocksAvailable int json:"num_docks_available"
NumDocksDisabled int json:"num_docks_disabled"
IsInstalled int json:"is_installed"
IsRenting int json:"is_renting"
IsReturning int json:"is_returning"
LastReported int json:"last_reported"
HasAvailableKeys bool json:"eightd_has_available_keys"
}

func main() {

// 从网址获取数据
response, err := http.Get(citiBikeURL)
if err != nil {
	log.Fatal(err)
}
defer response.Body.Close()

// 将网址中的数据格式转换
body, err := ioutil.ReadAll(response.Body)
if err != nil {
	log.Fatal(err)
}
// 声明实例存储数据
var sd stationData
// 反序列化
if err := json.Unmarshal(body, &sd); err != nil {
	log.Fatal(err)
}
fmt.Printf("%+v\n\n", sd.Data.Stations[1])

// 反序列化后将数据存入
outputData, err := json.Marshal(&sd)
if err != nil {
	log.Fatal(err)
}
// 将数据存储到本地
if err := ioutil.WriteFile("citiBike.json", outputData, 0644); err != nil {
	log.Fatal(err)
}

}

1.5文中使用的是Postgress数据库 我使用的是mysql数据库
1.使用到了"github.com/go-sql-driver/mysql"这个包 自行下载看API手册即可
import (
“database/sql”
“fmt”

_ "github.com/go-sql-driver/mysql"

)

var (
DB *sql.DB
err error
)

func init() {
DB, err = sql.Open(“mysql”, “root:root@/flowerdb”)
if err != nil {
panic(err.Error())
}
}

func checkErr(err error) {
if err != nil {
panic(err)
}
}

func main() {
stmt, err := DB.Prepare(“SELECT * FROM iris where Slength =?”)
checkErr(err)
rows, err := stmt.Query(“100”)
checkErr(err)
for rows.Next() {
var year string
var month string
var day string
var thing string
var money string
err := rows.Scan(&year, &month, &day, &thing, &money)
checkErr(err)
fmt.Println(year, month, day, money, thing)
}
defer DB.Close()
defer stmt.Close()
defer rows.Close()
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值