视频笔记:Go 数据科学 - Daniel Whitenack


原文链接: 视频笔记:Go 数据科学 - Daniel Whitenack

视频信息

Go for Data Science
by Daniel Whitenack
at GopherCon 2016

{% owl youtube D5tDubyXLrQ %}

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 代码

import pandas as pd
cols = [
  'integercolumn',
  'stringcolumn'
]

data = pd.read_csv('example.csv', names=cols)

print data['integercolumn'].max()

Go 代码:

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 返回:

$ python example2.py
2.0

而 golang 返回

$ 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 可以变得超简单:

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 频道

`