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

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

下面我将介绍在个人平常工做中发现颇有用的七个命令行工具。包括:jqjson2csvcsvkit、scrape、 xml2json、 sample 和 Rio。(我本身作的scrapesampleRio能够在这里拿到)。任何建议意见、问题甚至git上的拉取请求都很是欢迎(其余人建议的工具能够在最后找到)。好的,下面咱们首先介绍 jqhtml

1. jq – sed for JSON

JSON如今愈来愈流行,尤为当API盛行了之后。我还记得处理JSON时,用 grepsed 写着丑陋的代码。谢谢 jq,终于能够不用写的这么丑了。python

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

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

-s 表示静默模式。而后咱们用 jq 最简单的格式 jq ‘.’,能够把获得的丑陋的代码github

{"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",

转换成漂亮的格式:web

< 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数据:sql

< 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 里,仅仅调用json

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

就能够把数据转换成:segmentfault

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

有了CSV格式咱们就能够用传统的如 cut -dawk -F 一类的工具了。grepsed 没有这样的功能。由于 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里也有格式。此外,这个套装里还有其余有趣工具,如 in2csvcsvgrepcsvjoin。经过 csvjson,数据甚至能够从csv转换会json。总之,你值得一看。

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

JSON虽然很好,可是同时也有不少资源依然须要从HTML中获取。scrape就是一个Python脚本,包含了 lxmlcssselect 包,从而能选取特定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](https://github.com/bitly/data_hacks)写的,bitly还有好多其余工具值得一看。)当你处理大量数据时,debug管道很是尴尬。这时,sample就会颇有用。这个工具备三个用处:

逐行展现数据的一部分。
给在输出时加入一些延时,当你的数据进来的时候有些延时,或者你输出太快看不清楚时用这个很方便。
限制程序运行的时间。
下面的例子展示了这三个功能:

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](http://pandas.pydata.org/)。

若是感兴趣,欢迎follow me on Twitter


原文:7 command-line tools for data science
转载自:伯乐在线 - 大飞

相关文章
相关标签/搜索