视频信息 #

Go for Data Science
by Daniel Whitenack
at GopherCon 2016

https://www.youtube.com/watch?v=D5tDubyXLrQ

幻灯地址:https://github.com/dwhitena/slides/tree/master/gophercon2016

什么是 Data Science #

  • ETL, Data Cleaning, Organization
  • Parsing, Extraction of Patterns
  • Arithmetic

Data science 的 struggle #

Integrity #

使用 python 经常出现无法预期的结果。

比如这里分别使用 python 和 golang 读取 CSV 的数值,并且求第一列的最大值。

Python 代码

1
2
3
4
5
6
7
8
9
import pandas as pd
cols = [
'integercolumn',
'stringcolumn'
]
data = pd.read_csv('example.csv', names=cols)
print data['integercolumn'].max()

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
f, err := os.Open("example.csv")
if err != nil {
err = errors.Wrap(err, "Could not open CSV")
log.Fatal(err)
}
r := csv.NewReader(bufio.NewReader(f))
records, err := r.ReadAll()
if err != nil {
err = errors.Wrap(err, "Could not parse CSV")
log.Fatal(err)
}
var intMax int
for _, record := range records {
intVal, err := strconv.Atoi(record[0])
if err != nil {
err = errors.Wrap(err, "Parse failed")
log.Fatal(err)
}
if intVal > intMax {
intMax = intVal
}
}
fmt.Println(intMax)

正常情况一些都没问题,但是如果数据有缺失,比如某些列值缺失。对于 golang 而言,会很严谨的报错,而 python 的不报错,继续执行。所以时间一久,数据量一大,当发生这种不一致的时候,就没法排障,因为根本不知道哪里出过错误。

比如当三行三列输入给入,而第三行的第一列缺失的时候。

Python 返回:

1
2
$ python example2.py
2.0

而 golang 返回

1
2
3
$ go run example2.go
2016/05/12 13:23:53 Parse failed: strconv.ParseInt: parsing "": invalid syntax
exit status 1

部署 #

  • GCE or AWS
  • SciKit
  • Numpy
  • Pandas

即使写好了觉得很赞的 Data Science 的应用,每次部署的都需要和 Ops 坐下来详细的谈应该用什么云,里面都装什么库,以及都什么版本等等,整个过程会变得相当繁琐和复杂。即使写了一个超长的 Dockerfile 来构建所需的环境,在之后自己进行维护这个镜像也变得不大现实。

而在 golang 中则完全不存在这样的问题,因为 golang 是静态编译,所以只要编译好,所有需要的依赖都在里面了。因此一切一下子就变轻松了。Dockerfile 可以变得超简单:

1
2
3
FROM scratch
ADD myservice /myservice
CMD ["/myservice"]

做一次 Data Science #

  • 使用 github.com/google/go-github/github 包来获取 Github 的 go 项目的信息。
  • 使用 pachyderm 来组织数据,pachyderm 也是用 Go 写的,并且基于 k8s。有一个 pfs 的类文件系统。

Arithmetic 和 Visualization #

推荐使用 gonum

  • plot
  • graph
  • stat
  • integrate
  • lapack
  • unit
  • matrix
  • mathext
  • floats
  • blas
  • optimize

可以进行矩阵运算(matrix),也可以画图(plot)。

Prediction #

这里使用线性回归,使用的是 github.com/sajari/regression 这个包。

预测,2016年讲座这天会有195个项目建立,2017年的时候将会有 240 个项目建立。

其它数据相关的项目 #

  • gophernotes: 交互式的 Go notebooks
  • GoLearn: 通用的机器学习
  • glow: 分布式计算系统(map reduce)
  • GoBot: 专门为传感器和 IoT 准备的 Go的库
  • golang 将内部支持多维 slice
  • TensorFlow 提供 Go API

Gopher Slack 还有一个 data science 频道