博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言机器学习第一章读书笔记
阅读量:4034 次
发布时间:2019-05-24

本文共 4416 字,大约阅读时间需要 14 分钟。

数据的收集与组织(例题中的代码链接)

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 []CSVRecordfor {	// 读取文件	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()
}

转载地址:http://bgydi.baihongyu.com/

你可能感兴趣的文章
Runnable和Thread 两种实现方式的区别和联系:
查看>>
并发和并行的区别
查看>>
JAVA多线程和并发基础面试问答
查看>>
线程池的介绍及简单实现
查看>>
利用session,cookie进行安全性控制
查看>>
Session和Cookie的区别及Session的生命周期
查看>>
线程池 Thread Pools
查看>>
Cannot forward after response has been committed 错误解决
查看>>
Linux系统调用--getpid/getppid函数详解
查看>>
二分法排序
查看>>
内部排序
查看>>
二叉树前序、中序、后序遍历相互求法
查看>>
静态链接库与动态链接库
查看>>
C++ 子类调用父类构造和析构函数的顺序
查看>>
[进程管理]linux 下 进程和线程的区别(baidu 面试)
查看>>
父类、构造函数、成员对象的调用时机
查看>>
父类、构造函数、成员对象的调用时机
查看>>
字符串处理 子串不重复
查看>>
PageRank迭代求解方法
查看>>
Java transient关键字使用小结及一些需要注意的细节
查看>>