七個用於數據科學(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
轉載自:伯樂在線 - 大飛

相關文章
相關標籤/搜索