七个用于数据科学(data science)的命令行工具

标签: IT技术 工具与资源 data science 大数据 数据科学 | 发表时间:2013-12-31 17:55 | 作者:大飞
出处:http://blog.jobbole.com

数据科学是 OSEMN(和 awesome 相同发音),它包括获取(Obtaining)、整理(Scrubbing)、探索(Exploring)、建模(Modeling)和翻译(iNterpreting)数据。作为一名数据科学家,我用命令行的时间非常长,尤其是要获取、整理和探索数据的时候。而且我也不是唯一一个这样做的人。最近, Greg Reda介绍了可用于数据科学的经典命令行工具。在这之前,Seth Brown介绍了如何 在Unix下进行探索性的数据分析

下面我将介绍在我的日常工作中发现很有用的七个命令行工具。包括: jqjson2csvcsvkit、scrape、 xml2json、 sample 和 Rio。(我自己做的scrape、sample和Rio可以在 这里拿到)。任何建议意见、问题甚至git上的拉取请求都非常欢迎(其他人建议的工具可以在最后找到)。好的,下面我们首先介绍jq。

1. jq – sed for JSON

JSON现在越来越流行,尤其当API盛行了以后。我还记得处理JSON时,用grep和sed写着丑陋的代码。谢谢jq,终于可以不用写的这么丑了。

假设我们对2008总统大选的所有候选人感兴趣。纽约时报有一个关于 竞选财务的API。让我们用curl取一些JSON:

curl -s 'http://api.nytimes.com/svc/elections/us/v3/finances/2008/president/totals.json?api-key=super-secret' > nyt.json

-s表示静默模式。然后我们用jq最简单的格式jq ‘.’,可以把得到的丑陋的代码

{"status":"OK","base_uri":"http://api.nytimes.com/svc/elections/us/v3/finances/2008/","cycle":2008,"copyright":"Copyright (c) 2013 The New York Times Company. All Rights Reserved.","results":[{"candidate_name":"Obama, Barack","name":"Barack Obama","party":"D",

转换成漂亮的格式:

< nyt.json jq '.' | head { "results": [ { "candidate_id": "P80003338", "date_coverage_from": "2007-01-01", "date_coverage_to": "2008-11-24", "candidate_name": "Obama, Barack", "name": "Barack Obama", "party": "D",

同时,jq还可以选取和过滤JSON数据:

< nyt.json jq -c '.results[] | {name, party, cash: .cash_on_hand} | select(.cash | tonumber > 1000000)' 
{"cash":"29911984.0","party":"D","name":"Barack Obama"}
{"cash":"32812513.75","party":"R","name":"John McCain"}
{"cash":"4428347.5","party":"D","name":"John Edwards"}

更多使用方法参见 手册,但是不要指望jq能做所有事。Unix的哲学是写能做一件事并且做得好的程序,但是jq功能强大!下面就来介绍json2csv。

2. json2csv – 把JSON转换成CSV

虽然JSON适合交换数据,但是它不适合很多命令行工具。但是不用担心,用json2csv我们可以轻松把JSON转换成CSV。现在假设我们把数据存在million.json里,仅仅调用

< million.json json2csv -k name,party,cash

就可以把数据转换成:

Barack Obama,D,29911984.0
John McCain,R,32812513.75
John Edwards,D,4428347.5

有了CSV格式我们就可以用传统的如 cut -d 和 awk -F 一类的工具了。grep和sed没有这样的功能。因为CSV是以表格形式存储的,所以csvkit的作者开发了csvkit。

3. csvkit – 转换和使用CSV的套装

csvkit不只是一个程序,而是一套程序。因为大多数这类工具“期望”CSV数据有一个表头,所以我们在这里加一个。

echo name,party,cash | cat - million.csv > million-header.csv

我们可以用csvsort给候选人按竞选资金排序并展示:

< million-header.csv csvsort -rc cash | csvlook

|---------------+-------+--------------|
|  name         | party | cash         |
|---------------+-------+--------------|
|  John McCain  | R     | 32812513.75  |
|  Barack Obama | D     | 29911984.0   |
|  John Edwards | D     | 4428347.5    |
|---------------+-------+--------------|

看起来好像MySQL哈?说到数据库,我们可以把CSV写到sqlite数据库(很多其他的数据库也支持)里,用下列命令:

csvsql --db sqlite:///myfirst.db --insert million-header.csv
sqlite3 myfirst.db
sqlite> .schema million-header
CREATE TABLE "million-header" (
    name VARCHAR(12) NOT NULL, 
    party VARCHAR(1) NOT NULL, 
    cash FLOAT NOT NULL
);

插入后数据都会正确因为CSV里也有格式。此外,这个套装里还有其他有趣工具,如 in2csv、 csvgrep 和csvjoin。通过csvjson,数据甚至可以从csv转换会json。总之,你值得一看。

4. scrape – 用XPath和CSS选择器进行HTML信息提取的工具

JSON虽然很好,但是同时也有很多资源依然需要从HTML中获取。scrape就是一个Python脚本,包含了lxml和cssselect包,从而能选取特定HTML元素。维基百科上有个网页列出了所有国家的边界线语国土面积的比率,下面我们来把比率信息提取出来吧

curl -s 'http://en.wikipedia.org/wiki/List_of_countries_and_territories_by_border/area_ratio' | scrape -b -e 'table.wikitable > tr:not(:first-child)' | head
<!DOCTYPE html>
<html>
<body>
<tr>
<td>1</td>
<td>Vatican City</td>
<td>3.2</td>
<td>0.44</td>
<td>7.2727273</td>
</tr>

-b命令让scrape包含和标签,因为有时xml2json会需要它把HTML转换成JSON。

5. xml2json – 把XML转换成JSON

如名字所说,这工具就是把XML(HTML也是一种XML)转换成JSON的输出格式。因此,xml2json是连接scrape和jq之间的很好的桥梁。

curl -s 'http://en.wikipedia.org/wiki/List_of_countries_and_territories_by_border/area_ratio' | scrape -be 'table.wikitable > tr:not(:first-child)' | xml2json | jq -c '.html.body.tr[] | {country: .td[1][], border: .td[2][], surface: .td[3][], ratio: .td[4][]}' | head
{"ratio":"7.2727273","surface":"0.44","border":"3.2","country":"Vatican City"}
{"ratio":"2.2000000","surface":"2","border":"4.4","country":"Monaco"}
{"ratio":"0.6393443","surface":"61","border":"39","country":"San Marino"}
{"ratio":"0.4750000","surface":"160","border":"76","country":"Liechtenstein"}
{"ratio":"0.3000000","surface":"34","border":"10.2","country":"Sint Maarten (Netherlands)"}
{"ratio":"0.2570513","surface":"468","border":"120.3","country":"Andorra"}
{"ratio":"0.2000000","surface":"6","border":"1.2","country":"Gibraltar (United Kingdom)"}
{"ratio":"0.1888889","surface":"54","border":"10.2","country":"Saint Martin (France)"}
{"ratio":"0.1388244","surface":"2586","border":"359","country":"Luxembourg"}
{"ratio":"0.0749196","surface":"6220","border":"466","country":"Palestinian territories"}

当然JSON数据之后可以输入给json2csv。

6. sample – 用来debug

我写的第二个工具是sample。(它是依据bitly的 data_hacks写的,bitly还有好多其他工具值得一看。)当你处理大量数据时,debug管道非常尴尬。这时,sample就会很有用。这个工具有三个用处:

  1. 逐行展示数据的一部分。
  2. 给在输出时加入一些延时,当你的数据进来的时候有些延时,或者你输出太快看不清楚时用这个很方便。
  3. 限制程序运行的时间。

下面的例子展现了这三个功能:

seq 10000 | sample -r 20% -d 1000 -s 5 | jq '{number: .}'

这表示,每一行有20%的机会被给到jq,没两行之间有1000毫秒的延迟,5秒过后,sample会停止。这些选项都是可选的。为了避免不必要的计算,请尽早sample。当你debug玩之后你就可以把它移除了。

7. Rio – 在处理中加入R

这篇文章没有R就不完整。将R/Rscript加入处理不是很好理解,因为他们并没有标准化输入输出,因此,我加入了一个命令行工具脚本,这样就好理解了。

Rio这样工作:首先,给标准输入的CSV被转移到一个临时文件中,然后让R把它读进df中。之后,在-e中的命令被执行。最后,最后一个命令的输出被重定向到标准输出中。让我用一行命令展现这三个用法,对每个部分展现5个数字的总结:

curl -s 'https://raw.github.com/pydata/pandas/master/pandas/tests/data/iris.csv' > iris.csv
< iris.csv Rio -e 'summary(df)'
  SepalLength      SepalWidth     PetalLength      PetalWidth   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.054   Mean   :3.759   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
     Name          
 Length:150        
 Class :character  
 Mode  :character

如果加入了-s选项,sqldf包会被引入,这样CSV格式就会被输出,这可以让你之后用别的工具处理数据。

< iris.csv Rio -se 'sqldf("select * from df where df.SepalLength > 7.5")' | csvlook
|--------------+------------+-------------+------------+-----------------|
|  SepalLength | SepalWidth | PetalLength | PetalWidth | Name            |
|--------------+------------+-------------+------------+-----------------|
|  7.6         | 3          | 6.6         | 2.1        | Iris-virginica  |
|  7.7         | 3.8        | 6.7         | 2.2        | Iris-virginica  |
|  7.7         | 2.6        | 6.9         | 2.3        | Iris-virginica  |
|  7.7         | 2.8        | 6.7         | 2          | Iris-virginica  |
|  7.9         | 3.8        | 6.4         | 2          | Iris-virginica  |
|  7.7         | 3          | 6.1         | 2.3        | Iris-virginica  |
|--------------+------------+-------------+------------+-----------------|

如果你用-g选项,ggplot2会被引用,一个叫g得带有df的ggplot对象会被声明。如果最终输出是个ggplot对象,一个PNG将会被写到标准输出里。

< iris.csv Rio -ge 'g+geom_point(aes(x=SepalLength,y=SepalWidth,colour=Name))' > iris.png

iris

我制作了这个工具,为了可以在命令行中充分利用R的力量。当然它有很多缺陷,但至少我们不需要再学习gnuplot了。

别人建议的命令行工具

下面是其他朋友通过twitter和hacker news推荐的工具,谢谢大家。

结论

我介绍了七个我日常用来处理数据的命令行工具。虽然每个工具各有所长,我经常是将它们与传统工具(如grep, sed, 和awk)一起使用。将小工具结合起来使用组成一个大的流水线,这就是其用处所在。

不知你们对这个列表有什么想法,你们平时喜欢用什么工具呢。如果你们也做了什么好玩的工具,欢迎将其加入数据科学工具包 data science toolbox

如果你不认为自己能制作工具,也不用担心,下次当你写一个异乎寻常的命令行流水线时,记得将它放到一个文件里,加一个#!,加一些参数,改成可执行文件,你就做成一个工具啦~

虽然命令行工具的强大在获取、处理和探索数据时不容小觑,在真正的探索、建模和理解翻译数据时,你还是最好在科学计算环境下进行。比如 R或者 IPython notebook+ pandas

如果感兴趣,欢迎 follow me on Twitter

七个用于数据科学(data science)的命令行工具,首发于 博客 - 伯乐在线

相关 [数据 科学 data] 推荐:

七个用于数据科学(data science)的命令行工具

- - 博客 - 伯乐在线
数据科学是 OSEMN(和 awesome 相同发音),它包括获取(Obtaining)、整理(Scrubbing)、探索(Exploring)、建模(Modeling)和翻译(iNterpreting)数据. 作为一名数据科学家,我用命令行的时间非常长,尤其是要获取、整理和探索数据的时候. 而且我也不是唯一一个这样做的人.

数据治理(Data Governance)

- - ITeye博客
数据治理是指从使用零散数据变为使用统一主数据、从具有很少或没有组织和流程治理到企业范围内的综合数据治理、从尝试处理主数据混乱状况到主数据井井有条的一个过程. 数据治理其实是一种体系,是一个关注于信息系统执行层面的体系,这一体系的目的是整合IT与业务部门的知识和意见,通过一个类似于监督委员会或项目小组的虚拟组织对企业的信息化建设进行全方位的监管,这一组织的基础是企业高层的授权和业务部门与IT部门的建设性合作.

现在很火的数据科学到底是什么?你对做Data Scientist感兴趣吗?

- - 美国留学申请与就业找工作咨询博客|Warald|一亩三分地论坛
开头:如果你极其讨厌编程、大学数学勉强合格,或者跟人交流能力巨挫,那这篇文章可能不适合你看,你也可以自动叉掉其他关于data science/scientist的文章. Warald会花一周时间集中介绍一下这门科学,用具体的例子谈一下数据科学家到底做哪些工作、读什么专业、需要什么样的技能,欢迎提问、评论、分享,我会在下面的博文中选择回复.

社交数据(Social Data)的变革

- - SocialBeta
本文译者张宇,博晓通科技联合创始人,研究垂直搜索应用,关注社交媒体发展,注重语义技术落地,喜欢社交数据分析. 微博交流 @inter3i社交媒体分析. 2009年,个人生成的数据比自有史以来到2008年为止所有人类产生数据都多(原文未提出处). 整个世界已经目睹了消费者数据问询和收集方式的两次次重大变革.

Big Data(大数据)技术简析

- - 服务器运维与网站架构|Linux运维|互联网研究
Big Data是近来的一个技术热点,但从名字就能判断它并不是什么新词. 历史上,数据库、数据仓库、数据集市等信息管理领域的技术,很大程度上也是为了解决大规模数据的问题. 被誉为数据仓库之父的Bill Inmon早在20世纪90年代就经常将Big Data挂在嘴边了. 然而,Big Data作为一个专有名词成为热点,主要应归功于近年来互联网、云计算、移动和物联网的迅猛发展.

Data Structure Visualizations: 数据结构及算法可视化工具

- tiger - 黑客志
Data Structure Visualizations是旧金山大学的David Galles开发的一个以可视化方式演示数据结构和算法的非常棒的工具,可以很好的帮助你理解这些抽象的数据结构和算法,不管你是需要应付考试的CS学生,还是需要对付一些公司的变态面试题的上班族,你都会发现这是一个非常有用的工具,并且这个工具同时提供Java,Flash,以及基于HTML5的Web版本.

文章: 数据集成的演化:从EII到Big Data

- - InfoQ cn
 “企业信息集成(EII):实用方式”于2005年发布,描述了一套集成不同数据源的方法论,它利用了当时的先进技术,如面向服务架构(SOA)、Web Services、XML、资源描述架构(RDF)、基于XML的元数据格式、数据提取、转换和加载(ETL)等. EII基本能够为关系型数据元素提供统一视角,但在性能效率上还无法替代数据仓库和多维数据库.

oracle 11g Flashback Data Archive(闪回数据归档)

- - CSDN博客数据库推荐文章
Flashback Data Archive(闪回数据归档). UNDO表空间记录的回滚信息虽然可以提供回闪查询,但时间久了,这些信息会被覆盖掉,其实只要事务一提交,他们就变成可覆盖的对象了,所以经常在做回闪查询时,我们会因为找不到undo block而收到1555错误,11G里面引入了Flashback Data Archive ,他用于存储数据的所有改变,时间由你自己设定,消耗的是更多的磁盘空间,现在来看下这个特性.

使用Percona Data Recovery Tool for InnoDB恢复数据

- - OurMySQL
   昨晚收到一则求助,一个用户的本地数据库的重要数据由于误操作被删除,需要进行紧急恢复,用户的数据库日常并没有进行过任何备份,binlog也没有开启,所以从备份和binlog入手已经成为不可能,咨询了丁奇,发了一篇percona的 文章给我,顿时感觉有希望,于是到percona的官网上下载了 恢复工具:.

大数据从“小”做起——中小企业Big Data解决之道

- - 弯曲评论
本文是最新的拙作,希望能大家能提点意见^_^. 任何一个时代或者模式的兴起,都离不开与之相关的Killer App,比如,C/S时代的SAP ERP,互联网 1.0 时代的门户,以及互联网 2.0时代的搜索和SNS等,那么在当今云计算这个时代有那些Killer App呢. 当然首当其冲的肯定是以VMware 和Amazon EC2为代表的虚拟化和相关IaaS服务,除此之外,新近崛起的大数据绝对也是云计算的Killer App之一,并且不仅类似百度、阿里以及腾讯这样的互联网巨头有相关的应用需求,而且根据我个人平时与客户接触,发现有很多普通中小企业,特别是中型的互联网和物联网企业,在这方面的场景也有很多.