數據科學家的命令行技巧

来源:https://www.cnblogs.com/xuexiqun784789432/archive/2018/07/29/9385606.html
-Advertisement-
Play Games

對於許多數據科學家來說,數據操作起始於Pandas或Tidyverse。從理論上看,這個概念沒有錯。畢竟,這是為什麼這些工具首先存在的原因。然而,對於分隔符轉換等簡單任務來說,這些選項通常可能是過於重量級了。 有意掌握命令行應該在每個開發人員的技能鏈上,特別是數據科學家。學習shell中的來龍去脈無 ...


 

 

數據科學家的命令行技巧

對於許多數據科學家來說,數據操作起始於Pandas或Tidyverse。從理論上看,這個概念沒有錯。畢竟,這是為什麼這些工具首先存在的原因。然而,對於分隔符轉換等簡單任務來說,這些選項通常可能是過於重量級了。

有意掌握命令行應該在每個開發人員的技能鏈上,特別是數據科學家。學習shell中的來龍去脈無可否認地會讓你更高效。除此之外,命令行還在計算方面有一次偉大的歷史記錄。例如,awk - 一種數據驅動的腳本語言。Awk首次出現於1977年,它是在傳奇的K&R一書中的K,Brian Kernighan的幫助下出現的。在今天,大約50年之後,awk仍然與每年出現的新書保持相關聯! 因此,可以肯定的是,對命令行技術的投入不會很快貶值的。

如果你想瞭解大數據的學習路線,想學習大數據知識以及需要免費的學習資料可以加群:784789432.歡迎你的加入。每天下午三點開直播分享基礎知識,晚上20:00都會開直播給大家分享大數據項目實戰。

 

我們會談及的內容

  • ICONV
  • HEAD
  • TR
  • WC
  • SPLIT
  • SORT & UNIQ
  • CUT
  • PASTE
  • JOIN
  • GREP
  • SED
  • AWK
  • ICONV

文件編碼總是棘手的問題。目前大部分文件都是採用的 UTF-8 編碼。要想瞭解 UTF-8 的魔力,可以看看這個優秀的視頻。儘管如此,有時候我們還是會收到非 UTF-8 編碼的文件。這種情況下就需要嘗試轉碼。iconv 就是這種狀況下的救世主。iconv 是一個簡單的程式,可以輸入某種編碼的文本,然後以另一種編碼輸出。

  1. # Converting -f (from) latin1 (ISO-8859-1) 
  2. # -t (to) standard UTF_8 
  3.  
  4. iconv -f ISO-8859-1 -t UTF-8 < input.txt > output.txt 

常用選項:

  • iconv -l 列出所有支持的編碼
  • iconv -c 不作提示就丟棄無法轉換的字元

HEAD

如果你是重度Pandas的用戶,那麼你會對head很熟悉。通常在處理新數據時,我們想要做的第一件事就是瞭解究竟存在那些東西。這會引起Panda啟動,讀取數據,然後調用df.head() - 很費勁,至少可以說。head,不需要任何標誌,將輸出文件的前10行。head真正的能力在於徹查清除操作。 例如,如果我們想將文件的分隔符從逗號改變為pipe通配符。一個快速測試將是:head mydata.csv | sed 's/,/|/g'

  1. # Prints out first 10 lines  
  2. head filename.csv  
  3. # Print first 3 lines  
  4. head -n 3 filename.csv 

有用的選項:

  • head -n 輸出指定行
  • head -c 輸出指定的位元組

TR命令

Tr類似於翻譯,它是基於文件清理的一個強大使用的工具。一個理想的用法是替換文件中的分隔符。

  1. #將文件中的製表符分割轉換成逗號 
  2. cat tab_delimited.txt | tr "\t" "," comma_delimited.csv 

Tr的另一個特性是在你的處理中設置上所有的[:class:]變數。包括:

  1. [:alnum:] 所有字母和數字 
  2. [:alpha:] 所有字母 
  3. [:blank:] 所有水平空白 
  4. [:cntrl:] 所有控制字元 
  5. [:digit:] 所有數字 
  6. [:graph:] 所有可列印的字元,不包括空格 
  7. [:lower:] 全部小寫字母 
  8. [:print:] 所有可列印的字元,包括空格 
  9. [:punct:] 所有標點符號 
  10. [:space:] 所有的水平或垂直空格 
  11. [:upper:] 全部大寫字母 
  12. [:xdigit:] 所有十六進位數字 

可以將這些多樣化的變數鏈接在一起,組成一個強大的程式。下麵是一個基於字數統計的程式,用來檢查你的README文件是否使用過度。

  1. cat README.md | tr "[:punct:][:space:]" "\n" | tr "[:upper:]" "[:lower:]" | grep . | sort | uniq -c | sort -nr 

另外一個例子用於正則表達式

  1. # 將所有的大寫字母轉換成小寫 
  2. cat filename.csv | tr '[A-Z]' '[a-z]' 

有用的選項:

  • tr -d刪除字元
  • tr -s壓縮字元
  • \b退格
  • \f換頁
  • \v垂直選項卡
  • \NNN八進位值為NNN的字元

WC

字數統計。它的價值主要體現在使用 -l 參數可以進行行數統計。

  1. # Will return number of lines in CSV  
  2. wc -l gigantic_comma.csv 

個用這個工具來驗證各個命令的輸出實在方便。因此,如果我們要在文件中轉換分隔符,然後運行 wc -l,驗證總行數是相同的。如果不同,我們就知道一定是哪裡出錯了。

常用選項:

  • wc -c 列印位元組數
  • wc -m 列印字元數
  • wc -L 列印最長一行的長度
  • wc -w 列印字數

SPLIT命令

文件大小可以有顯著變化。根據工作的不同,拆分文件是有益的,就像split。基本用法如下:

  1. #我們拆分這個CSV文件,每500行分割為一個新的文件new_filename 
  2.  
  3. split -l 500 filename.csv new_filename_ 
  4.  
  5. # filename.csv 
  6. # ls output 
  7. # new_filename_aaa 
  8. # new_filename_aab 
  9. # new_filename_aac 

兩個地方很奇怪:一個是命名方式,一個是缺少擴展名。尾碼約定可以通過-d標識來數字化。添加文件擴展名,你需要執行下麵這個find命令。他會給當前文件夾下的所有文件追加.csv尾碼,所以需要小心使用。

  1. find . -type f -exec mv '{}' '{}'.csv \; 
  2.  
  3. # ls output 
  4. # filename.csv.csv 
  5. # new_filename_aaa.csv 
  6. # new_filename_aab.csv 
  7. # new_filename_aac.csv 

有效的選項:

  • split -b按特定位元組大小拆分
  • split -a生成長度為N的尾碼
  • split -x使用十六進位尾碼分割

SORT & UNIQ

前面的命令是顯而易見的:他們按照自己說的做。這兩者提供了最重要的一擊(即去重單詞計數)。這是由於有uniq,它只處理重覆的相鄰行。因此在管道輸出之前進行排序。一個有趣的事情是,sort -u將獲得與sort file.txt | uniq相同的結果。

Sort確實對數據科學家來說是一種很有用的小技巧:能夠根據特定的列對整個CSV進行排序。

  1. # Sorting a CSV file by the second column alphabetically  
  2. sort -t"," -k2,2 filename.csv  
  3. # Numerically  
  4. sort -t"," -k2n,2 filename.csv  
  5. # Reverse order  
  6. sort -t"," -k2nr,2 filename.csv 

這裡的-t選項是指定逗號作為分隔符。通常假設是空格或製表符。此外,-k標誌是用來指定我們的鍵的。它的語法是-km,n,m是起始欄位,n是最後一個欄位。

有用的選項:

  • sort -f 忽略大小寫
  • sort -r 逆序
  • sort -R 亂序
  • uniq -c 計算出現次數
  • uniq -d 只列印重覆行

CUT命令

cut用於刪除列。舉個慄子,如果我們只想要第一列和第三列。

  1. cut -d, -f 1,3 filename.csv 

選擇除了第一列以外的所有列

  1. cut -d, -f 2- filename.csv 

與其他的命令組合使用,cut命令作為過濾器

  1. #列印存在“some_string_value”的第1列和第3列的前10行 
  2. head filename.csv | grep "some_string_value" | cut -d, -f 1,3 

找出第二列中唯一值的數量。

  1. cat filename.csv | cut -d, -f 2 | sort | uniq | wc -l  
  2. # 計算唯一值出現的次數,限制輸出前10個結果  
  3. cat filename.csv | cut -d, -f 2 | sort | uniq -c | head 

PASTE

paste 是個有趣的小命令。如果你想合併兩個文件,而這兩個文件的內容又正好是有序的,那 paste 就可以這樣做。

  1. # names.txt 
  2. adam 
  3. john 
  4. zach 
  5.  
  6. # jobs.txt 
  7. lawyer 
  8. youtuber 
  9. developer 
  10.  
  11. Join the two into a CSV 
  12.  
  13. paste -d ',' names.txt jobs.txt > person_data.txt 
  14.  
  15. Output 
  16. adam,lawyer 
  17. john,youtuber 
  18. zach,developer 

關於更多 SQL_-esque 變體,請看下麵。

JOIN

Join是一種簡單的、準切向的SQL。最大的區別在於Join將返回所有列,匹配可能只發生在一個欄位上。預設情況下,join將嘗試使用第一列作為匹配鍵。對於不同的結果,需要以下語法:

  1. Join the first file (-1) by the second column 
  2. and the second file (-2) by the first 
  3.  
  4. join -t"," -1 2 -2 1 first_file.txt second_file.txt 

標準連接是一個內部連接。然而,外部連接也可以通過-af滯後來實現。另一個值得註意的是-e標誌,如果發現有欄位丟失,它可以用來替換成其他值。

  1. Outer join, replace blanks with NULL in columns 1 and 2 
  2. # -o which fields to substitute - 0 is key, 1.1 is first column, etc... 
  3.  
  4. join -t"," -1 2 -a 1 -a2 -e ' NULL' -o '0,1.1,2.2' first_file.txt second_file.txt 

雖然它不是最容易使用的命令,但是在絕望的時刻,它就是唯一可用的措施。

常用的選項:

  • join -a 列印未成對的行
  • join -e 替換缺失欄位
  • join -j 等同於 -1 FIELD -2 FIELD

GREP

全局搜索正則表達式並輸出,或使用grep;可能是最知名的命令,並且有很好的理由。 Grep具有很強的能力,特別是在大型代碼庫中查找方法。在數據科學領域,它充當了其他命令的改進機制。但其標準用法也很有用。

  1. # 遞歸搜索併列出當前目錄下包含'word'的所有文件 
  2. grep -lr 'word' . 
  3.  
  4. # 列出包含word的文件數目 
  5. grep -lr 'word' . | wc -l 

對包含word/pattern的行數進行計數

  1. grep -c 'some_value' filename.csv  
  2. # 同樣的功能,但是按照文件名列出當前目錄下所有包含該關鍵詞的文件  
  3. grep -c 'some_value' * 

Grep使用or運算符- \|來檢索多個值.

  1. grep "first_value\|second_value" filename.csv 

有用的選項

  • alias grep="grep --color=auto" 使grep支持彩色輸出
  • grep -E 使用擴展正則表達式
  • grep -w 僅匹配完整單詞
  • grep -l 列印匹配文件的名稱
  • grep -v 倒序匹配

大殺器

Sed和Awk是本文兩個最有用的命令。為了簡潔,我不會討論那些令人費解的細節。相反,我會討論各種各樣的命令來證明他們令人印象深刻的實力。如果你想瞭解的更多,這本書就可以。

SED

在內核中sed是一個流編輯器。它擅長替換,但是也可以用來重構。

最基本的sed命令包含了s/old/new/g。也就是全局搜索舊值,替換新值。沒有/g 我們的命令可能在第一次出現舊值就會終止。

為了儘快瞭解它的能力,我們來看一個例子。在這個情況你會拿到下麵的文件:

  1. balance,name 
  2. $1,000,john 
  3. $2,000,jack 

我們要做的第一件事就是移除美元符。-i 標識表示就地修改。''就是代表一個零長度文件擴展,因此重寫我們的初始文件。理想情況下,你會單獨測試這些並輸出到一個新文件。

  1. sed -i '' 's/\$//g' data.txt 
  2.  
  3. # balance,name 
  4. # 1,000,john 
  5. # 2,000,jack 

下一步,我們的balance列的逗號。

  1. sed -i '' 's/\([0-9]\),\([0-9]\)/\1\2/g' data.txt 
  2.  
  3. # balance,name 
  4. # 1000,john 
  5. # 2000,jack 

最終,Jack有一天起來並準備辭職了。所以,再見吧,我的朋友。

  1. sed -i '' '/jack/d' data.txt 
  2.  
  3. # balance,name 
  4. # 1000,john 

就像你所看到的,sed功能強大,但是樂趣不止於此。

AWK

最好的放最後。Awk不僅是一個簡單的命令:它是一個成熟的語言。在本文中包含的每一個命令中,awk目前是最酷的。如果你發現它令你印象深刻,這有大量的資源- 看這,這,和這。

awk包含的常用案例:

  • 文本處理
  • 格式化文本報告
  • 執行計算操作
  • 執行字元串操作

Awk在其最初雛形可以與grep平行。

  1. awk '/word/' filename.csv 

或者多使用一點魔法,讓grep和cut結合。在這,awk對所有行通過word列印了以tab分隔的第三和第四列。-F,只是將分隔符變為逗號。

  1. awk -F, '/word/ { print $3 "\t" $4 }' filename.csv 

Awk具有大量有用的內置變數。例如, NF -欄位數 - 和NR - 記錄數。為了獲取文件中這53個記錄:

  1. awk -F, 'NR == 53' filename.csv 

添加一個小竅門可以基於一個值或者多個值過濾。下麵的第一個例子,會列印這些記錄中第一列為string的行數和列。

  1. awk -F, ' $1 == "string" { print NR, $0 } ' filename.csv  
  2. # Filter based off of numerical value in second column  
  3. awk -F, ' $2 == 1000 { print NR, $0 } ' filename.csv 

多數值表達式:

  1. # Print line number and columns where column three greater 
  2. # than 2005 and column five less than one thousand 
  3.  
  4. awk -F, ' $3 >= 2005 && $5 <= 1000 { print NR, $0 } ' filename.csv 

計算第三列之和:

  1. awk -F, '{ x+=$3 } END { print x }' filename.csv 

計算那些第一列值為“something”的第三列之和。

  1. awk -F, '$1 == "something" { x+=$3 } END { print x }' filename.csv 

獲取文件的行數列數:

  1. awk -F, 'END { print NF, NR }' filename.csv  
  2. # Prettier version  
  3. awk -F, 'BEGIN { print "COLUMNS", "ROWS" }; END { print NF, NR }' filename.csv 

列印出現過兩次的行:

  1. awk -F, '++seen[$0] == 2' filename.csv 

移除多行:

  1. # Consecutive lines 
  2. awk 'a !~ $0; {a=$0}'] 
  3.  
  4. # Nonconsecutive lines 
  5. awk '! a[$0]++' filename.csv 
  6.  
  7. # More efficient 
  8. awk '!($0 in a) {a[$0];print} 

使用內置函數gsub()替換多個值。

  1. awk '{gsub(/scarlet|ruby|puce/, "red"); print}' 

這個awk命令合併了多個CSV文件,忽略頭併在結尾追加。

  1. awk 'FNR==1 && NR!=1{next;}{print}' *.csv > final_file.csv 

需要精簡一個大文件?好的,awk可以在sed的幫助下完成這件事。具體來說,基於一個行數,這個命令將一個大文件分為多個小文件。這個一行文件也會添加一個擴展名。

  1. sed '1d;$d' filename.csv | awk 'NR%NUMBER_OF_LINES==1{x="filename-"++i".csv";}{print > x}'  
  2. # Example: splitting big_data.csv into data_(n).csv every 100,000 lines  
  3. sed '1d;$d' big_data.csv | awk 'NR%100000==1{x="data_"++i".csv";}{print > x}' 

結束前

命令行擁有無窮的力量。本文所涵蓋的命令行知識足以讓你從零基礎到入門。除了這些已涉及的內容外,針對日常數據操作還有需要可考慮的實用程式。Csvkit, xsv和q是其中三個值得關註的。如果你希望進一步深入到命令行的數據科學領域,那麼請看此書。它也可以在此免費獲得!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、yum配置 yum的配置文件在 /etc/yum.conf $releasever 當前系統的發行版本,$basearch CPU體系,使用命令 arch 查看 2、配置yum源 yum源文件在 /etc/yum.repos.d/ 中 看到 .repo 結尾的文件都是yum文件,其中,CentO ...
  • 1,Startx:切換到圖形界面 2,Pwd:查看當前目錄 3,Whoami:查看當前用戶 4,Cd: 1. 命令格式: cd [目錄名] 2. 命令功能: 切換當前目錄至dirName 3. 常用範例 3.1 例一:進入系統根目錄 命令: 輸出: 說明:進入系統根目錄,上面命令執行完後拿ls命令看 ...
  • 本篇文章主要介紹SqlServer使用時的註意事項。 想成為一個高級程式員,資料庫的使用是必須要會的。而資料庫的使用純熟程度,也側面反映了一個開放的水平。 下麵介紹SqlServer在使用和設計的過程中需要註意的事項。 SqlServer註意事項 Sql事務啟動語句 開始事務:BEGIN TRANS ...
  • 系列目錄 一、安裝MySql 二、安裝並破解Navicat 三、沒有my.in配置文件怎麼辦 四、設置MySql的大小寫敏感 五、重置MySql登陸密碼 這一篇可以說是我的踩坑的血淚史了。。。 MySql在Windows下預設是大小寫不敏感的,當表名中有大寫字母的時候,MySql會直接把它轉化成小寫 ...
  • 本文通過大量圖片來分析和描述分庫、分表以及資料庫分區是怎樣進行的。 1.sharding前的初始數據分佈 在本文中,我打算用高考考生相關信息作為實驗數據。請無視表的欄位是否符合現實,也請無視表的設計是否符合範式。 3張表: 考生表,存放全國所有高考考生信息,假設34個省、(直轄)市、(自治區、特別行 ...
  • if exists(select * from sys.objects where name='存儲過程名稱')drop proc 存儲過程名稱goCREATE proc 存儲過程名稱@tableName varchar(8000), --表名、視圖名@indexCol varchar(50) = ...
  • 占座 ...
  • exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure SELECT * into T_System_Organizati ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...