版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)清洗實(shí)踐指南2022目目錄x 目 第1章為什么需要清洗數(shù)據(jù) x 目 新視角 1數(shù)據(jù)科學(xué)過(guò)程 2傳達(dá)數(shù)據(jù)清洗工作的內(nèi)容 3數(shù)據(jù)清洗環(huán)境 4入門示例 5小結(jié) 9第2章基礎(chǔ)知識(shí)——格式、類型與編碼 11文件格式 11文本文件與二進(jìn)制文件 11常見(jiàn)的文本文件格式 14分隔格式 14歸檔與壓縮 20歸檔文件 20壓縮文件 21數(shù)據(jù)類型、空值與編碼 24數(shù)據(jù)類型 25數(shù)據(jù)類型間的相互轉(zhuǎn)換 29轉(zhuǎn)換策略 30隱藏在數(shù)據(jù)森林中的空值 37字符編碼 412.4小結(jié) 46第3章數(shù)據(jù)清洗的老黃牛——電子表格和文本編輯器 47電子表格中的數(shù)據(jù)清洗 47Excel的文本分列功能 47字符串拆分 51字符串拼接 51
文本編輯器里的數(shù)據(jù)清洗 54文本調(diào)整 55列選模式 56加強(qiáng)版的查找與替換功能 56文本排序與去重處理 58ProcessLinesContaining 60示例項(xiàng)目 60第一步:?jiǎn)栴}陳述 60第二步:數(shù)據(jù)收集 60第三步:數(shù)據(jù)清洗 61第四步:數(shù)據(jù)分析 633.4小結(jié) 63第4章講通用語(yǔ)言——數(shù)據(jù)轉(zhuǎn)換 64基于工具的快速轉(zhuǎn)換 64從電子表格到CSV 65從電子表格到JSON 65使用phpMyAdminSQL語(yǔ)句中生成CSV或JSON 67使用PHP實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換 69使用PHPSQLJSON的數(shù)據(jù)轉(zhuǎn)換 69使用PHPSQLCSV的數(shù)據(jù)轉(zhuǎn)換 70使用PHPJSONCSV的數(shù)據(jù)轉(zhuǎn)換 71使用PHPCSVJSON的數(shù)據(jù)轉(zhuǎn)換 71使用Python實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換 72使用Python實(shí)現(xiàn)CSVJSON的數(shù)據(jù)轉(zhuǎn)換 72目 錄 xi使用csvkit實(shí)現(xiàn)CSV到JSON的數(shù)據(jù)轉(zhuǎn)換 使用Python實(shí)現(xiàn)JSON到CSV的數(shù)據(jù)轉(zhuǎn)換 示例項(xiàng)目 GDF格式的Facebook數(shù)據(jù) 第二步:在文本編輯器中查看GDF文件 第三步:從GDF格式到JSON格式的轉(zhuǎn)換 第四步:構(gòu)建D3圖 Pajek格式 第六步:簡(jiǎn)單的社交網(wǎng)絡(luò)分析 4.5小結(jié) 第5章收集并清洗來(lái)自網(wǎng)絡(luò)的數(shù)據(jù) 理解HTML頁(yè)面結(jié)構(gòu) 行分隔模型 樹(shù)形結(jié)構(gòu)模型 方法一:Python和正則表達(dá)式 第一步:查找并保存實(shí)驗(yàn)用的Web文件 第二步:觀察文件內(nèi)容并判定有價(jià)值的數(shù)據(jù) Python程序把數(shù)據(jù)保存到CSV文件中 第四步:查看文件并確認(rèn)清洗結(jié)果 使用正則表達(dá)式解析HTML的局限性 方法二:Python和BeautifulSoup 第一步:找到并保存實(shí)驗(yàn)用的文件 第二步:安裝BeautifulSoup 第三步:編寫(xiě)抽取數(shù)據(jù)用的Python程序 第四步:查看文件并確認(rèn)清洗結(jié)果
方法三:ChromeScraper 92Chrome擴(kuò)展Scraper 92第二步:從網(wǎng)站上收集數(shù)據(jù) 92第三步:清洗數(shù)據(jù) 94示例項(xiàng)目:從電子郵件和論壇中抽取數(shù)據(jù) 95項(xiàng)目背景 95第一部分:清洗來(lái)自GoogleGroups電子郵件的數(shù)據(jù) 第二部分:清洗來(lái)自網(wǎng)絡(luò)論壇的數(shù)據(jù) 995.6小結(jié) 105第6章清洗PDF文件中的數(shù)據(jù) 106為什么PDF文件很難清洗 106簡(jiǎn)單方案——復(fù)制 107我們的實(shí)驗(yàn)文件 107第一步:把我們需要的數(shù)據(jù)復(fù)制出來(lái) 108第二步:把復(fù)制出來(lái)的數(shù)據(jù)粘貼到文本編輯器中 109第三步:輕量級(jí)文件 110第二種技術(shù)——pdfMiner 111第一步:安裝pdfMiner 111PDF文件中提取文本 111第三種技術(shù)——Tabula 113第一步:下載Tabula 113第二步:運(yùn)行Tabula 113第三步:用Tabula提取數(shù)據(jù) 114第四步:數(shù)據(jù)復(fù)制 114第五步:進(jìn)一步清洗 114所有嘗試都失敗之后——第四種技術(shù) 1156.6小結(jié) 117第7章RDBMS清洗技術(shù) 1187.1準(zhǔn)備 118第一步:下載并檢查Sentiment140 119xii 目 錄第二步:清洗要導(dǎo)入的數(shù)據(jù) 119第三步:把數(shù)據(jù)導(dǎo)入MySQL 120發(fā)現(xiàn)并清洗異常數(shù)據(jù) 121創(chuàng)建自己的數(shù)據(jù)表 122第四步:清洗&字符 123第五步:清洗其他未知字符 124第六步:清洗日期 125第七步:分離用戶提及、標(biāo)簽和URL 127創(chuàng)建一些新的數(shù)據(jù)表 128提取用戶提及 128提取標(biāo)簽 130提取URL 131第八步:清洗查詢表 132第九步:記錄操作步驟 1347.11小結(jié) 135第8章數(shù)據(jù)分享的最佳實(shí)踐 136準(zhǔn)備干凈的數(shù)據(jù)包 136為數(shù)據(jù)編寫(xiě)文檔 139README文件 1398.2.2文件頭 141數(shù)據(jù)模型和圖表 142維基或CMS 144為數(shù)據(jù)設(shè)置使用條款與許可協(xié)議 144數(shù)據(jù)發(fā)布 146數(shù)據(jù)集清單列表 146StackExchange上的OpenData 147編程馬拉松 1478.5小結(jié) 148第9章StackOverflow項(xiàng)目 149第一步:關(guān)于StackOverflow的問(wèn)題 149第二步:收集并存儲(chǔ)StackOverflow數(shù)據(jù) 151
下載StackOverflow數(shù)據(jù) 151文件解壓 152創(chuàng)建MySQL數(shù)據(jù)表并加載數(shù)據(jù) 152構(gòu)建測(cè)試表 154第三步:數(shù)據(jù)清洗 156創(chuàng)建新的數(shù)據(jù)表 157提取URL并填寫(xiě)新數(shù)據(jù)表 158提取代碼并填寫(xiě)新表 159第四步:數(shù)據(jù)分析 161哪些代碼分享網(wǎng)站最為流行 161問(wèn)題和答案中的代碼分享網(wǎng)站都有哪些 162提交內(nèi)容會(huì)同時(shí)包含代碼分享URL和程序源代碼嗎 165第五步:數(shù)據(jù)可視化 166第六步:?jiǎn)栴}解析 169從測(cè)試表轉(zhuǎn)向完整數(shù)據(jù)表 1699.8小結(jié) 170第10章Twitter項(xiàng)目 171第一步:關(guān)于推文歸檔數(shù)據(jù)的問(wèn)題 171第二步:收集數(shù)據(jù) 172下載并提取弗格森事件的數(shù)據(jù)文件 173創(chuàng)建一個(gè)測(cè)試用的文件 174處理推文ID 174第三步:數(shù)據(jù)清洗 179創(chuàng)建數(shù)據(jù)表 179用Python為新表填充數(shù)據(jù) 180第四步:簡(jiǎn)單的數(shù)據(jù)分析 182第五步:數(shù)據(jù)可視化 183第六步:?jiǎn)栴}解析 186把處理過(guò)程應(yīng)用到全數(shù)據(jù)量(非測(cè)試用)數(shù)據(jù)表 18610.8小結(jié) 1871.1 新視角 1.1 新視角 1為什么需要清洗數(shù)據(jù)第1章不過(guò),你可能還未聽(tīng)說(shuō)過(guò)的是,數(shù)據(jù)科學(xué)的這些希望與夢(mèng)想都建立在亂七八糟的數(shù)據(jù)之上。在正式應(yīng)用于我們認(rèn)為是數(shù)據(jù)科學(xué)的核心的算法和可視化之前,這些數(shù)據(jù)往往需要經(jīng)過(guò)遷移、壓縮、清洗、打散、分片、分塊以及其他多種轉(zhuǎn)換處理。本章內(nèi)容將涵蓋以下幾個(gè)方面:關(guān)于數(shù)據(jù)科學(xué)的六個(gè)簡(jiǎn)單處理步驟,包含數(shù)據(jù)清洗與數(shù)據(jù)清洗有關(guān)的參考建議對(duì)數(shù)據(jù)清洗有幫助的工具一個(gè)關(guān)于如何將數(shù)據(jù)清洗融入整個(gè)數(shù)據(jù)科學(xué)過(guò)程的入門示例新視角看門人工作2 第1章 為什么需要清洗數(shù)據(jù)不會(huì)真的有人因?yàn)闆](méi)有見(jiàn)過(guò)人們聚眾討論看門人的工作多么有趣、多么酷而開(kāi)始評(píng)頭論足數(shù)據(jù)科學(xué)過(guò)程數(shù)據(jù)清洗是如何融入數(shù)據(jù)科學(xué)中的呢?簡(jiǎn)短的回答就是,清洗工作是關(guān)鍵的一步,它直接影響在它之前和之后的處理工作。傳達(dá)數(shù)據(jù)清洗工作的內(nèi)容 311第一步是問(wèn)題陳述。識(shí)別出你要解決的問(wèn)題是什么。接下來(lái)要做的是數(shù)據(jù)收集與存儲(chǔ)。數(shù)據(jù)從何而來(lái)?它們?cè)谀睦锎娣??格式又是什么?于接下?lái)的分析和挖掘?用什么公式?使用什么機(jī)器學(xué)習(xí)算法?順序又是怎樣的呢?理結(jié)果還有哪些不足?這個(gè)方法能徹底解決問(wèn)題嗎?你還能找出別的什么辦法嗎?接下來(lái)要做的又是什么?數(shù)據(jù)清洗與數(shù)據(jù)收集和存儲(chǔ)(第2步)的關(guān)系也十分密切。這意味著你得收集原始數(shù)據(jù),對(duì)傳達(dá)數(shù)據(jù)清洗工作的內(nèi)容哪怕你并不需要把數(shù)據(jù)科學(xué)過(guò)程制成正式的報(bào)告文檔,你仍然會(huì)發(fā)現(xiàn),認(rèn)真地記錄下曾經(jīng)按什么順序做了些什么事情,對(duì)以后的工作也是極有幫助的。PAGE10第PAGE10第1章 為什么需要清洗數(shù)據(jù)1.5 入門示例PAGE1.5 入門示例PAGE5工作日志我們寫(xiě)了一條SQL查詢語(yǔ)句來(lái)檢索出每條數(shù)據(jù)及其相關(guān)描述。為了能在Python中進(jìn)行詞頻分析,我們需要把數(shù)據(jù)調(diào)整成JSON格式。因此我們做了一個(gè)PHP腳本,用它來(lái)循環(huán)遍歷查詢結(jié)果,并以JSON格式保存到文件中(第一個(gè)版本的數(shù)據(jù)文件。這個(gè)文件里的數(shù)據(jù)有些格式上的錯(cuò)誤,比如包含了沒(méi)有轉(zhuǎn)義的問(wèn)號(hào)和一些多余的內(nèi)嵌PHP腳本中修正。運(yùn)行第二個(gè)腳本之后,我們就可以得到一份干凈的JSON文件了(第二個(gè)版本的數(shù)據(jù)文件。數(shù)據(jù)清洗環(huán)境。下面列出了你需要準(zhǔn)備的工具和技術(shù)。MacOSX上的程序Windows的命令提示符運(yùn)行,但其他的命令則需要通過(guò)功能更強(qiáng)的命令行程序來(lái)運(yùn)行,比如。Mac上的1TextWrangler,Linux上的vi或emacs,或是Windows上的Notepad++、Sublime編輯器等。1Python2.7EnthoughtPython33的話,可以考慮再安裝一個(gè)2.7版本。crooftxce和eh。在第7章“RDBMS清洗技術(shù)”中,我們需要使用MySQL數(shù)據(jù)庫(kù)和一個(gè)用于訪問(wèn)該數(shù)據(jù)庫(kù)的客戶端軟件。入門示例準(zhǔn)備好了嗎?現(xiàn)在讓我們磨好手里的廚刀并結(jié)合六步框架來(lái)解決一些簡(jiǎn)單的數(shù)據(jù)清洗問(wèn)題吧。這個(gè)例子會(huì)用到對(duì)公眾開(kāi)放的安然(Enron)公司電子郵件數(shù)據(jù)集。這是一個(gè)非常有名的數(shù)你可以在維基百科/wiki/Enron上閱讀更多關(guān)于安然公司和導(dǎo)致它破產(chǎn)的金融丑聞。在另外一個(gè)頁(yè)面/wiki/Enron_Corpus上,你可以閱讀關(guān)于安然公司電子郵件語(yǔ)料庫(kù)的信息。http://www.ahschulz.de/enron-email-data/上面的指南下載一份MySQL版本。MySQL服務(wù)器中一個(gè)稱為Enron這是我們的第一個(gè)數(shù)據(jù)統(tǒng)計(jì)查詢,語(yǔ)句如下:SELECTdate(date)ASdateSent,count(mid)ASnumMsgFROMmessageGROUPBYdateSentORDERBYdateSent;(如9(如0或4下表是截取出來(lái)的一部分?jǐn)?shù)據(jù)片段(完整的結(jié)果集長(zhǎng)達(dá)約1300行是正確的。但是,有些日期值有著明顯的錯(cuò)誤。dateSentnumMsg0002-03-0510002-03-0730002-03-0820002-03-1211979-12-3161997-01-0111998-01-0411998-01-0511998-10-303這些錯(cuò)誤日期的產(chǎn)生很有可能是由郵件客戶端配置不當(dāng)導(dǎo)致的。這里,我們有三種處理方案可以選擇。什么都不處理:也許,我們可以選擇忽略這些錯(cuò)誤數(shù)據(jù),直接開(kāi)始構(gòu)建線性圖。但是,最小的錯(cuò)誤日期始于0001年,最大的錯(cuò)誤日期至2044年結(jié)束,所以我們可以想象,最終的線性圖時(shí)間軸上將有1300個(gè)刻度線,每個(gè)刻度上面顯示著1或者2。光是聽(tīng)起來(lái)就沒(méi)有什么吸引人的地方,也沒(méi)提供什么有用的信息,所以不處理就等同于數(shù)據(jù)毫無(wú)用處。修正數(shù)據(jù):我們可以嘗試算出錯(cuò)誤消息對(duì)應(yīng)的正確日期,從而生成正確的數(shù)據(jù)集來(lái)創(chuàng)建圖形。扔掉受影響的郵件:我們可以做出一個(gè)明智的決定,放棄那些日期不在預(yù)定范圍之內(nèi)的郵件。為了在選項(xiàng)二和選項(xiàng)三之間做個(gè)決斷,我們需要先計(jì)算一下1999~2002年有多少封郵件會(huì)受到影響。為此,我們編寫(xiě)了下面的SQL語(yǔ)句:SELECTcount(*)FROMmessageWHEREyear(date)<1998oryear(date)>2002;Result:325結(jié)果顯示一共有325封郵件包含日期錯(cuò)誤,乍一看確實(shí)有點(diǎn)多,但請(qǐng)等一下,實(shí)際上這些數(shù)SELECTdate(date)ASdateSent,count(mid)ASnumMsgFROMmessageWHEREyear(date)BETWEEN1998AND2002GROUPBYdateSentORDERBYdateSent;dateSentnumMsg1998-01-0411998-01-0511998-10-3031998-11-0211998-11-0311998-11-0441998-11-0511998-11-1321在新的數(shù)據(jù)中,1998年1月的兩個(gè)日期看起來(lái)有些問(wèn)題,因?yàn)槠渌]件都始于10月,而且10月之后的郵件數(shù)量更為規(guī)律一些。這很奇怪,同時(shí)也反映了另一個(gè)問(wèn)題:我們是否還有必要在x軸上標(biāo)記每一個(gè)日期,即使這一天一封郵件都沒(méi)有發(fā)出?1如果我們的答案是肯定的話,那就需要顯示每一個(gè)日期,即使它對(duì)應(yīng)的郵件數(shù)量是0。這意味著我們需要再做一輪數(shù)據(jù)清洗工作,生成那些沒(méi)有郵件往來(lái)的日期所對(duì)應(yīng)的數(shù)據(jù)。加入零數(shù)據(jù),其實(shí)這取決于我們用什么樣的工具來(lái)創(chuàng)建圖表以及圖表的種類。舉個(gè)例子來(lái)說(shuō),的Spreadsheets就能在初始數(shù)據(jù)中缺少日期的情況下,在x軸上自動(dòng)進(jìn)行零值數(shù)據(jù)補(bǔ)齊,創(chuàng)建線性圖或是條狀圖。在我們的數(shù)據(jù)中,這些需要補(bǔ)齊的零值就是1998年所缺失的日期。Spreadsheets在頭部和尾部所展現(xiàn)的長(zhǎng)長(zhǎng)的零值數(shù)據(jù)。D3JavaScript可視庫(kù)也能完成同樣的工作,零值數(shù)據(jù)也是自動(dòng)補(bǔ)齊的,如下圖所示。關(guān)于如何使用D3完成一個(gè)簡(jiǎn)單的線性圖,請(qǐng)參考教程:/mbostock/3883245。Excel的線性圖也有同樣的數(shù)據(jù)補(bǔ)齊功能,如下所示。接下來(lái),我們需要考慮一下是否需要零值數(shù)據(jù),要不要讓它們?cè)趚軸上顯示(數(shù)據(jù)查詢結(jié)果1998~20021822天小結(jié) 91起到什么作用;此外,倘若圖表過(guò)于擁擠,有些較小的空隙我們就看不到了。1為了比較兩種圖表之間的差別,我們可以快速地把相同的數(shù)據(jù)再次放入GoogleSpreadsheets(你也可以在x或3中完成這個(gè)任務(wù),但這次我們只需選擇數(shù)量這一個(gè)字段來(lái)構(gòu)建圖表就可Spreadsheets就不會(huì)在x(中間部分)也都被保留了下來(lái)。根據(jù)比較結(jié)果和我們先前的計(jì)劃(還記得我們要做的只是創(chuàng)建一個(gè)簡(jiǎn)單的條形圖吧,現(xiàn)在終于可以繼續(xù)下一步工作,不用煩惱是否需要?jiǎng)?chuàng)建零值數(shù)據(jù)了。值出現(xiàn)在2001年10月和月,恰好是丑聞被揭露的時(shí)候。還有兩次較小一點(diǎn)的峰值發(fā)生在2001年6月26日和27日,以及2000年12月12日和13日,那時(shí)的安然也有新聞事件發(fā)生(分別是加利福尼亞州的能源危機(jī)事件和公司領(lǐng)導(dǎo)層的變動(dòng)。1.6 小結(jié)80%(在這個(gè)全文PAGE10第PAGE10第1章 為什么需要清洗數(shù)據(jù)共計(jì)900個(gè)單詞的案例中,光是談?wù)摂?shù)據(jù)清洗的基本原理和方案就用了700個(gè)單詞)①。數(shù)據(jù)清洗的的確確是數(shù)據(jù)科學(xué)過(guò)程的關(guān)鍵部分,它不僅涉及對(duì)技術(shù)問(wèn)題的理解,同時(shí)還要求我們做出相應(yīng)的價(jià)值判斷。作為數(shù)據(jù)清洗工作的一部分,我們甚至需要在尚未完成分析與可視化步驟的時(shí)候,預(yù)先考慮它們的輸出結(jié)果將是什么樣子。重新審視數(shù)據(jù)清洗在這一章的工作中所扮演的角色,我們很容易發(fā)現(xiàn),清洗效果的提升能夠大幅減少后續(xù)處理的時(shí)間。——————————①這里指的是英文原版字?jǐn)?shù)統(tǒng)計(jì)。——譯者注2.1 文件格式 2.1 文件格式 基礎(chǔ)知識(shí)——格式、類型與編碼第2章22文件格式,包括壓縮標(biāo)準(zhǔn)數(shù)據(jù)類型的基礎(chǔ)知識(shí)(包括多種用于表示缺失數(shù)據(jù)的類型)字符編碼文件格式在這一節(jié)中,我們將描述數(shù)據(jù)科學(xué)家們?cè)谔幚韺?shí)際數(shù)據(jù)時(shí)常常會(huì)遇到的五花八門的文件格文本文件與二進(jìn)制文件從網(wǎng)絡(luò)上收集數(shù)據(jù)的時(shí)候,你可能遇到過(guò)下面幾種情況。數(shù)據(jù)可以以文件形式進(jìn)行下載。數(shù)據(jù)可以通過(guò)存儲(chǔ)系統(tǒng)的交互式界面進(jìn)行訪問(wèn),比如利用查詢接口來(lái)訪問(wèn)數(shù)據(jù)庫(kù)系統(tǒng)。PAGE12第PAGE12第2章 基礎(chǔ)知識(shí)——格式、類型與編碼2.1 文件格式PAGE2.1 文件格式PAGE13數(shù)據(jù)可以通過(guò)持續(xù)不斷的流的形式進(jìn)行訪問(wèn)。數(shù)據(jù)可以通過(guò)應(yīng)用編程接口(API)來(lái)訪問(wèn)。文本(例如字母、數(shù)字,或是換行、回車、制表符這樣的控制字符,那么我們就可以說(shuō)這個(gè)文件是文本格式的。相比之下,二進(jìn)制文件包含的字節(jié)則是由大部分非人類可讀的字符組成的。文件的打開(kāi)與讀取開(kāi)一個(gè)文件,并成功讀取了里面的內(nèi)容(即便你不太理解里面的內(nèi)容Excel文件需要使用MicrosoftExcel電子表格程序才能打開(kāi)和讀取,數(shù)碼相機(jī)拍攝的照片文件需要使用圖形程序來(lái)讀取,如Photoshop或Preview等。有些時(shí)候,二進(jìn)制文件也可以被多個(gè)兼容的軟件包MicrosoftExcel或Microsoft文以.xlsx為擴(kuò)展名的Excel.docx為擴(kuò)展名的.pptx為擴(kuò)展名的Powerpoint文件;以.png、.jpg和.gif為擴(kuò)展名的圖形文件;以.mp3、.ogg、.wmv和.mp4為擴(kuò)展名的音樂(lè)和視頻文件;以.txt為擴(kuò)展名的文本文件。在互聯(lián)網(wǎng)上,有的網(wǎng)站列出了常見(jiàn)文件擴(kuò)展名以及與之有關(guān)的應(yīng)用程序,其中比較有名的是。另外在維基百科上還有文件擴(kuò)展名的字母列表,其訪問(wèn)地址為https://en.wikipedia.org/wiki/List_of_filename_extensions_(alphabetical)。深入文件內(nèi)部22在OSX或Linux中||rn(pw(cflossmole2:~megan$pwd/Users/meganflossmole2:~megan$cdDownloadsflossmole2:Downloadsmegan$lessOlympicAthletes_0.xlsx"OlympicAthletes_0.xlsx"maybeabinaryfile.Seeitanyway?如果程序提示你“viewanyway”的話,那么這個(gè)文件就是一個(gè)二進(jìn)制文件,你應(yīng)該做好看yn拒絕繼續(xù)查看。下圖是用less命令查看文件OlympicAthletes_0.xlsx的結(jié)果。結(jié)果果然是一團(tuán)糟吧!查看完文件內(nèi)容之后,你可以輸入字母q退出less程序。在Windows中在Windows的命令提示符里有一個(gè)對(duì)應(yīng)的more程序。操作方法與之前介紹過(guò)的less命令類似(sssornoscdWindows8|Windows系統(tǒng)|常見(jiàn)的文本文件格式(文件和PDF文件會(huì)在本書(shū)后面的章節(jié)里分別)本書(shū)所關(guān)注的文本文件類型主要有三種:分隔格式(結(jié)構(gòu)化數(shù)據(jù))JSON格式(半結(jié)構(gòu)化數(shù)據(jù))HTML格式(非結(jié)構(gòu)化數(shù)據(jù))這些文件有著各自不同的布局格式(主要是在文件讀取的時(shí)候內(nèi)容的表現(xiàn)形式不同分隔格式(列)(行分隔符下面的示例中列舉了三條記錄(這三行記錄描述了三個(gè)人的信息,每條記錄的值都采用逗標(biāo)題行Firstname,birthdate,favoritecolorSally,1970-09-09,blueManu,1984-11-03,redMartin,1978-12-10,yellow查看不可見(jiàn)字符2在前面的例子中,換行符和回車符都是看不見(jiàn)的。怎么才能看到不可見(jiàn)字符呢?我們將在Mac系統(tǒng)中使用這類似于Windows上的Notepad++)invisibles的功能(可以通過(guò)|Display激活)來(lái)查看不可見(jiàn)字符。2Linux系統(tǒng)或Mac上的窗口中使用vi(一種命令行文本編輯器)工具。使用vi查看文件里不可見(jiàn)字符的過(guò)程如下。首先,輸入下面的命令:vi<filename>然后輸入:進(jìn)入vi的命令模式。接下來(lái)輸入setlist并按回車鍵,這時(shí)就能看到不可見(jiàn)字符了。下面的截圖演示的是通過(guò)setlist命令在vi里顯示行尾字符,其對(duì)應(yīng)符號(hào)為$。封閉錯(cuò)誤數(shù)據(jù)Firstname,birthdate,favoritecolor,salarySally,1971-09-16,lightblue,129,000Manu,1984-11-03,red,159,960Martin,1978-12-10,yellow,76,888如何在創(chuàng)建文件時(shí)搞定這個(gè)問(wèn)題呢?其實(shí),有兩種方案。方案一:分隔文件創(chuàng)建者需要在整個(gè)數(shù)據(jù)表創(chuàng)建之前,刪除最后一列中的逗號(hào)(也就是說(shuō)工資中不可以包含逗號(hào)字符。方案二:分隔文件創(chuàng)建者需要使用額外的符號(hào)來(lái)對(duì)數(shù)據(jù)進(jìn)行封閉處理。字符轉(zhuǎn)義喜歡的顏色列表中有l(wèi)ight"Carolina"blue,該怎么解決呢?Firstname,birthdate,favoritecolor,salary"Sally","1971-09-16","light"Carolina"blue","129,000""Manu","1984-11-03","red","159,960""Martin","1978-12-10","yellow","76,888"Firstname,birthdate,favoritecolor,salary"Sally","1971-09-16","light\"Carolina\"blue","129,000""Manu","1984-11-03","red","159,960""Martin","1978-12-10","yellow","76,888”確保數(shù)據(jù)能夠被正確無(wú)誤地分隔。如果在工作過(guò)程中,你碰巧發(fā)現(xiàn)在你接收的數(shù)據(jù)中含有分隔錯(cuò)誤,那么你可以參考第3章中所教授的技巧來(lái)清洗這些數(shù)據(jù)。2JSON格式2(vptjtoo-s半結(jié)構(gòu)化數(shù)據(jù)集的特點(diǎn)是數(shù)據(jù)的值都有其對(duì)應(yīng)的屬性標(biāo)識(shí),而且順序無(wú)關(guān)緊要,有時(shí)甚至可以缺失某些屬性。JSON就是這樣以屬性值為基礎(chǔ)的數(shù)據(jù)集,示例如下:{"firstName":"Sally","birthDate":"1971-09-16","faveColor":"light\"Carolina\"blue","salary":129000}JSON在有些方面與分隔文件類似,但也有不同的地方。首先,字符串值必須使用雙引號(hào)進(jìn)(轉(zhuǎn)義字符也是)在JSON中,逗號(hào)不可以出現(xiàn)在數(shù)字類型的數(shù)據(jù)中,除非這個(gè)值被當(dāng)作字符串使用并用引號(hào)——){"firstName":"Sally","birthDate":"1971-09-16","faveColor":"light\"Carolina\"blue","salary":"129,000"}(這兩種功能在分隔文件中實(shí)現(xiàn)起來(lái)比較困難pet字段,還有一個(gè)帶有層級(jí)結(jié)構(gòu)的jobTitle字段。這里需要注意的是,之前的salary字段已經(jīng)被轉(zhuǎn)移到新的job字段里了:{"firstName":"Sally","birthDate":"1971-09-16","faveColor":"light\"Carolina\"blue","pet":[{"type":"dog","name":"Fido"},{"type":"dog","name":"Lucky"}],"job":{"jobTitle":"DataScientist","company":"DataWizards,Inc.","salary":129000}}JSON實(shí)驗(yàn)JSON作為數(shù)據(jù)交換格式極為流行,這是因?yàn)樗鼣U(kuò)展性好,容易使用,并支持多值屬性、可缺失屬性、嵌套屬性/層級(jí)屬性。各種分布式數(shù)據(jù)集所采用的API也對(duì)JSON的發(fā)展有著極大的貢獻(xiàn)。接下來(lái)讓我們用API做個(gè)實(shí)驗(yàn),看看如何利用搜索關(guān)鍵詞來(lái)生成JSON數(shù)據(jù)結(jié)果集。APIURL的后面:/search?term=the+growlers在這個(gè)URL中,=后面的內(nèi)容就是搜索關(guān)鍵詞。我搜索的是我比較喜歡的一個(gè)樂(lè)隊(duì),名為Growlers。這里需要注意的是,URL中含有一個(gè)用來(lái)代替空格字符的+,因?yàn)閁RL是不允許包含空格字符的。iTunesAPI會(huì)根據(jù)我提供的關(guān)鍵詞從它的音樂(lè)數(shù)據(jù)庫(kù)里返回50個(gè)結(jié)果。整個(gè)結(jié)果集會(huì)被格式化成一個(gè)JSON對(duì)象。結(jié)果集中的每一個(gè)元素都是以名字值格式存在的JSON對(duì)象。這個(gè)例子返回的JSON數(shù)據(jù)貌似很長(zhǎng),因?yàn)榻Y(jié)果記錄有50個(gè)之多,但實(shí)際上每個(gè)結(jié)果都特別簡(jiǎn)單——因?yàn)樵谶@個(gè)URL中展現(xiàn)出來(lái)的iTunes數(shù)據(jù)沒(méi)有復(fù)雜的多值數(shù)據(jù)和層級(jí)數(shù)據(jù)。關(guān)于API更多的使用細(xì)節(jié),請(qǐng)?jiān)L問(wèn)AppleiTunes的開(kāi)發(fā)文檔:https://www.app/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html。HTML格式HTML文件,或稱為網(wǎng)頁(yè)文件,也是一種文本格式文件,其中經(jīng)常夾雜著各種冗余的數(shù)據(jù)。2HTMLHTMLHTML標(biāo)2下面的截圖是網(wǎng)站的一部分。盡管其中的內(nèi)容包括了圖片、色彩和其他非HTML雖然HTML源代碼接近1000行,但只要我們足夠細(xì)心,完全可以從中找出讓瀏覽器呈現(xiàn)出天氣表格的數(shù)據(jù)和布局指令:華氏溫度是后天的情況,因?yàn)榫W(wǎng)站可以隨時(shí)改變它的源代碼。除此之外,頁(yè)面上還混雜著許多其他數(shù)據(jù),所以我們將會(huì)在第5章討論如何從基于網(wǎng)頁(yè)的非結(jié)構(gòu)化文件中抽取數(shù)據(jù)。歸檔與壓縮(特別是分隔數(shù)據(jù)都是以壓縮文件的形歸檔文件tar在做數(shù)據(jù)科學(xué)工作時(shí),你碰到最多的歸檔文件可能就是磁帶歸檔(TAR)文件了。這種文件是通常是用tar程序創(chuàng)建的,并以.tar為后綴名。它的最初設(shè)計(jì)目的是用于磁帶歸檔技術(shù)。tar程序在類Unix操作系統(tǒng)中都存在,所以我們也可以在MacOSX的Terminal程序中使用它。要想創(chuàng)建tar文件,你需要給tar程序下達(dá)幾個(gè)指令,讓程序知道哪些文件是你想要包含的,輸(程序中的選項(xiàng)c用來(lái)表明我們想創(chuàng)建一個(gè)歸檔文件,選項(xiàng)v在加載文件列表的時(shí)候打印出文件名字,選項(xiàng)f)2.2 歸檔與壓縮PAGE2.2 歸檔與壓縮PAGE21PAGE22第PAGE22第2章 基礎(chǔ)知識(shí)——格式、類型與編碼tarcvffileArchive.tarreallyBigFile.csvanotherBigFile.csv如果想要“r”一個(gè)文件(也就是把歸檔文件展開(kāi),提取出里面的文件程序指向你想要展開(kāi)的文件即可。其中xvf中的字母x表示提取(eXtract)的意思:2tarxvffileArchive.tar2現(xiàn)在我們已經(jīng)知道一個(gè).tar格式的歸檔文件里面含有多個(gè)文件,但到底有多少文件,它們又tar命令中的選項(xiàng)t就可以派上用場(chǎng)了,它會(huì)以列表形式顯示tar文件中的內(nèi)容:tar–tffileArchive.tar除了tar以外還有許多別的歸檔程序,當(dāng)中包括一些具備壓縮功能的程序(比如,OSX系統(tǒng)上內(nèi)置的ZIP壓縮軟件和now上的各種IP和AR工具,它們?cè)谧鰵w檔的同時(shí)還能進(jìn)行文件壓縮處理,接下來(lái)我們就來(lái)看看壓縮的概念。壓縮文件如何壓縮文件如在SX上,從Fndr程序中隨便選中哪個(gè)文件或文件夾(或組單中選擇Compress。操作完成后就會(huì)在被壓縮文件所在的相同目錄下出現(xiàn)一個(gè)壓縮文件(.zip后綴名。操作截圖如下所示。如何解壓文件在Windows系統(tǒng)上,你可以在文件上點(diǎn)擊鼠標(biāo)右鍵,選擇Properties,這時(shí)你就可以看到與文件擴(kuò)展名關(guān)聯(lián)的程序了。之后可以使用OpenWith選項(xiàng)來(lái)查看Windows會(huì)使用哪種程序來(lái)解壓文件。在這一節(jié)后面的內(nèi)容里,我們會(huì)繼續(xù)學(xué)習(xí)如何在OSX或Linux操作系統(tǒng)上使用命令行程序來(lái)解壓文件。使用zip、gzip和bzip2壓縮文件zip、gzip和bzip2是最為常見(jiàn)的壓縮程序。與之對(duì)應(yīng)的解壓縮程序分別為Unzip、Gunzip和Bunzip2。下表中列舉了每種程序以及它們對(duì)應(yīng)的壓縮和解壓縮命令。壓 縮 解 壓Zipzipfilename.csvfilename.zipunzipfilename.zipgzipgzipfilename.csvfilename.gzgunzipfilename.gzbzip2bzip2filename.csvfilename.bz2bunzip2filename.bz2有時(shí)你會(huì)發(fā)現(xiàn),有的文件在包含.tar后綴名的同時(shí)還包含了.gz或.bz2這樣的后綴名,例如.tgz和.tbz2somefile.tgztar程序進(jìn)行壓縮。這是因?yàn)間zip和bzip2本身沒(méi)有歸檔功能,它們只是壓縮程序而已。因此,它們只能一次壓縮一個(gè)文件(或一個(gè)歸檔文件。而tar的工作才是把多個(gè)文件整合到一個(gè)獨(dú)立的文件中,所以我們常常會(huì)發(fā)現(xiàn)這些工具總是一起使用。gzip或bzip2對(duì)文件tar命令的后面添加一個(gè)ztarcvzffileArchive.tar.gzreallyBigFile.csvanotherBigFile.csv或者,你可以分兩個(gè)步驟來(lái)完成這個(gè)任務(wù):tarcvffileArchive.tarreallyBigFile.csvanotherBigFile.csvgzipfileArchive.tar這兩種操作都可以創(chuàng)建文件fileArchive.tar.gz。2如果想要解壓一個(gè)tar.gz文件,可以使用下面兩個(gè)命令:2gunzipfileArchive.tar.gztarxvffileArchive.tar類似的操作也適用于bzip2文件:tarcvjffileArchive.tar.bz2reallyBigFile.csvanotherBigFile.csv如果想要解壓一個(gè)tar.bz2文件,可以使用下面兩個(gè)命令:bunzip2fileArchive.tar.bztarxvffileArchive.tar壓縮選項(xiàng)在做壓縮和解壓處理時(shí),你應(yīng)該考慮如何使用更多的功能選項(xiàng)來(lái)更好地完成清洗工作。你是否需要在壓縮文件的時(shí)候保留原始文件?默認(rèn)情況下,大部分壓縮程序和歸檔程序都會(huì)刪除原始文件。如果你想在創(chuàng)建壓縮文件的同時(shí)保留原始文件,通常需要手動(dòng)添加這個(gè)選項(xiàng)。你想把新的文件添加到一個(gè)已經(jīng)存在的壓縮文件里嗎?大多數(shù)歸檔程序和壓縮程序都有這樣的功能選項(xiàng)。有時(shí)候,這種操作被稱為更新或替換。你是否需要對(duì)壓縮文件進(jìn)行加密處理,只有提供密碼才能打開(kāi)?其實(shí)許多壓縮程序都帶有這個(gè)功能。force這樣的功能選項(xiàng)吧。如何選擇壓縮程序這里所講的歸檔與壓縮的概念廣泛適用于各種操作系統(tǒng)和各種類型的壓縮文件。在大多數(shù)情況下,我們都是從不同的地方下載壓縮文件,隨后最為關(guān)心的是如何高效地解壓這些文件。假設(shè)我們處在一個(gè)可以使用多種文件壓縮格式的操作環(huán)境中,這時(shí)可以采用下面的原則來(lái)比較不同壓縮類型之間的優(yōu)缺點(diǎn)。其中能夠影響我們選擇壓縮方式的關(guān)鍵因素有:壓縮和解壓縮的速度壓縮比率(文件到底能縮減多少)壓縮方案的互操作性(文件容易解壓?jiǎn)幔┙?jīng)驗(yàn)之談gzip壓縮和解壓縮都比較快,并且在每個(gè)裝有OSX或Linux的機(jī)器上都可以使用。但是,在Windows系統(tǒng)上的一些用戶是沒(méi)有對(duì)應(yīng)的gunzip程序的。bzip2壓縮的文件比gzip和zip都要小,但壓縮花費(fèi)的時(shí)間也相對(duì)長(zhǎng)一些。它廣泛存在于OSX和Linux系統(tǒng)中。而Windows用戶就比較痛苦了,除非他們裝了能夠應(yīng)對(duì)bzip2格式的特殊軟件。zip在Linux、OSX和Windows系統(tǒng)上都存在,而且它的壓縮和解壓速度也不賴。但是壓縮比(比如跟bzip2相比)還是相當(dāng)有優(yōu)勢(shì)的。RAR是Windows上廣泛使用的歸檔和壓縮解決方案;但是在OSX和Linux系統(tǒng)上只有特殊的軟件才能處理這種格式,而且它的壓縮速度也不像其他方案那樣理想。最后要說(shuō)的是,你得根據(jù)項(xiàng)目的具體情況,以及受眾或用戶(可能是你本人、消費(fèi)者或者是客戶)的需求,來(lái)決定壓縮方案。數(shù)據(jù)類型、空值與編碼(或是至少要事先了解風(fēng)險(xiǎn)程度)的轉(zhuǎn)換。由于在實(shí)際存儲(chǔ)中很多數(shù)據(jù)都是以字符串形式保存的,所以我們還要學(xué)習(xí)如何辨識(shí)字符編Python2.3 數(shù)據(jù)類型、空值與編碼PAGE2.3 數(shù)據(jù)類型、空值與編碼PAGE25PAGE26第PAGE26第2章 基礎(chǔ)知識(shí)——格式、類型與編碼成另一種編碼的過(guò)程,并會(huì)討論這種策略的局限性。數(shù)據(jù)類型22數(shù)字類型數(shù)據(jù)整數(shù)(正數(shù)或負(fù)數(shù)(全部正數(shù)值。小數(shù)允許小數(shù)點(diǎn)后面有多少個(gè)數(shù)字(小數(shù)部分的長(zhǎng)度,允許包含的數(shù)字總個(gè)數(shù)(精度。例如數(shù)字34.984,它的小數(shù)部分長(zhǎng)度為3,精度為5。不同的數(shù)據(jù)存儲(chǔ)系統(tǒng)允許使用不同類型的小數(shù)。例如,DBMS可以讓我們?cè)诖罱〝?shù)據(jù)庫(kù)的時(shí)候自行決定數(shù)據(jù)存放形式,如浮點(diǎn)數(shù)、小數(shù)、貨幣。每種類型之間都稍有差別,比如在數(shù)學(xué)含義上的區(qū)別。我們需要閱讀DBMS所提供的相關(guān)指南來(lái)掌握好每種數(shù)據(jù)類型,從而可以始終在數(shù)據(jù)變化時(shí)占據(jù)主動(dòng)地位。DBMS供應(yīng)商常會(huì)出于內(nèi)存原因或其他原因多次修改某些數(shù)據(jù)類型的規(guī)范。菜單SystemPreferences里有一個(gè)稱為L(zhǎng)anguage&Region什么時(shí)候數(shù)字不是數(shù)字類型0~91101232451016現(xiàn)在,再看一個(gè)地址列表,字段中的數(shù)據(jù)都是以字符串類型存儲(chǔ)的:1ElmLane10Pine1016PineFrontSt.123MainSt.245Oak22日期和時(shí)間你可能對(duì)同一個(gè)日期的很多不同寫(xiě)法都很熟悉,而且有自己比較喜歡的寫(xiě)法。比如下面列表中的每一個(gè)小項(xiàng),它們都是同一個(gè)日期的常見(jiàn)寫(xiě)法:11-23-1411-23-201423-11-20142014-11-2323-Nov-14November23,201423November201423,201412月23-月1月1章中提到的EnronSQL查詢語(yǔ)句來(lái)計(jì)算在每年的5月12日有多少封郵件被發(fā)出,同時(shí)打印出相應(yīng)的星期值:SELECTYEAR(date)ASyr,DAYOFWEEK(date)ASday,COUNT(mid)FROMmessageWHEREMONTHNAME(date)="May"ANDDAY(date)=12GROUPBYyr,dayORDERBYyrASC;有些電子表格程序,如Excel,在內(nèi)部以數(shù)字形式存儲(chǔ)日期,但它允許用戶以他們喜歡的內(nèi)置格式或自定義格式來(lái)顯示這些值。Excel用小數(shù)來(lái)保存自1899年12月31日之后的日期數(shù)據(jù)。想要看到Excel中日期的內(nèi)部表現(xiàn),可以輸入一個(gè)日期數(shù)據(jù),并以General格式進(jìn)行查看,如下圖所示。Excel將1986年5月21日存儲(chǔ)為31553。那Excel為什么保留小數(shù)部分來(lái)存儲(chǔ)1899年之后的日期呢?難道天數(shù)不是完整的數(shù)字嗎?其實(shí),Excel存儲(chǔ)的小數(shù)部分值是用來(lái)表現(xiàn)時(shí)間部分的。從前面的示例截圖中可以看出,日期的內(nèi)部值31553被映射到午夜,而31553.5(半天時(shí)間)是中午,31553.75是下午六點(diǎn)。小數(shù)點(diǎn)后面的精度越高,我們得到的內(nèi)部表現(xiàn)就越精準(zhǔn)。DBMS和電子表格應(yīng)用程序都支持與數(shù)字類似的日期計(jì)算。在這兩種系統(tǒng)中,都有支持加減法以及其他日期計(jì)算的函數(shù),比如往一個(gè)日期中添加幾個(gè)星期得到一個(gè)新的日期值。字符串最為常見(jiàn)的數(shù)據(jù)存儲(chǔ)方式。此外,由于字符串幾乎能夠存儲(chǔ)任何其他類型的數(shù)據(jù)(不計(jì)效率它已成為數(shù)據(jù)通信或系統(tǒng)間數(shù)據(jù)移植的最廉價(jià)選擇。與數(shù)字類型數(shù)據(jù)一樣,我們所使用的存儲(chǔ)機(jī)制也提供了一些關(guān)于字符串的使用規(guī)則。例如,DBMS或是電子表格需要我們事先聲明要使用的字符串長(zhǎng)度為多少,或是要使用哪種類型的字符。還有一個(gè)重要的概念,那就是字符編碼,在本章的后面我們單獨(dú)拿出一節(jié)來(lái)對(duì)它進(jìn)行說(shuō)明。22(JSON或網(wǎng)頁(yè))中找到,這些格式能夠以字符串形式存儲(chǔ)數(shù)據(jù),或是為多種存儲(chǔ)方案(比如前面提到過(guò)的API、DBMSakOvrfo其他數(shù)據(jù)類型數(shù)字、日期/時(shí)間和字符串是使用最為廣泛的三種數(shù)據(jù)類型,但除此之外,還有許多其他來(lái)源于不同環(huán)境的數(shù)據(jù)類型。請(qǐng)看下面的例子。集合/枚舉:如果你的數(shù)據(jù)只有幾種值,你可能就需要集合類型或者枚舉類型了。比如大AB+BBC+CCDD,DW}。布爾:如果你的數(shù)據(jù)只限于兩種值,要么是0/1形式,要么是true/false形式,這時(shí)你可以考慮一下布爾類型。比如數(shù)據(jù)庫(kù)字段pakage_shipped表示包裹是否已經(jīng)郵寄出去了。((并P數(shù)據(jù)類型間的相互轉(zhuǎn)換數(shù)據(jù)類型間的相互轉(zhuǎn)換是數(shù)據(jù)清洗工作必不可少的一部分。每當(dāng)需要在字符串類型的數(shù)據(jù)上數(shù)據(jù)損耗并不會(huì)一直困擾我們(事實(shí)上,有些時(shí)候清洗過(guò)程是允許數(shù)據(jù)損耗存在的,但如果我們并不希望有數(shù)據(jù)損耗發(fā)生的話,這一現(xiàn)象就不容忽視了。其中包含的風(fēng)險(xiǎn)因素包括如下兩個(gè)。200不同精度間的轉(zhuǎn)換:假設(shè)你有一個(gè)小數(shù)列表,其中每一個(gè)值的精度都為四位數(shù)字,現(xiàn)在你想把數(shù)字轉(zhuǎn)換成精度為兩位數(shù)字的數(shù)據(jù),或許更糟,直接轉(zhuǎn)換成整數(shù)類型。這時(shí)每個(gè)數(shù)字都會(huì)被四舍五入或被截取,你將丟掉原有的精度信息。轉(zhuǎn)換策略數(shù)據(jù)庫(kù)函數(shù)(這個(gè)功能幾乎在每個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中都能找到們適合以查詢結(jié)果的形式直接導(dǎo)出或是存放到另一個(gè)字段中去。SQL級(jí)別的類型轉(zhuǎn)換接下來(lái)將演示幾個(gè)適用于采用SQL進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換的常見(jiàn)案例。例子一:解析MySQL數(shù)據(jù)并格式化為字符串1章中提到的Enronmessage,該表中包含一個(gè)日期字段,采用的是MySQL的datetime類型。假設(shè)我們想要打印出完整的月份拼寫(xiě)(與數(shù)字相對(duì)、星期和時(shí)間。怎么做才能達(dá)到最佳效果呢?目前我們手里有一條消息ID(mid)為52的記錄,內(nèi)容如下:2000-01-2104:51:002而我們希望得到的格式則是:24:51am,Friday,January21,2000SELECTconcat(hour(date),':',minute(date),',',dayname(date),',',monthname(date),'',day(date),',',year(date))FROMmessageWHEREmid=52;結(jié)果:4:51,Friday,January21,2000如果我們必須要包含a.m/p.m,可以使用條件語(yǔ)句來(lái)判斷小時(shí)部分的值,如果小于12則打印“a.m”,反之打印“p.m”:SELECTconcat(concat(hour(date),':',minute(date)),if(hour(date)<12,'am','pm'),concat(',',dayname(date),',',monthname(date),'',day(date),',',year(date)))FROMmessageWHEREmid=52;結(jié)果:4:51amFriday,January21,2000MySQL的日期和時(shí)間函數(shù),如day()和year(),它們的開(kāi)發(fā)文檔信息位于如concat(),其開(kāi)發(fā)文檔位于/doc/refman/5.7/en/string-functions.html提供的更為高級(jí)的date_format()了非常詳盡的解釋。下面例子中演示的代碼就是把日期類型數(shù)據(jù)轉(zhuǎn)成我們期望的格式:SELECTdate_format(date,'%l:%i%p,%W,%M%e,%Y')FROMmessageWHEREmid=52;結(jié)果:4:51AM,Friday,January21,2000這已經(jīng)非常接近我們希望的結(jié)果了,而且代碼要比選擇一中的精煉得多。唯一有偏差的地方就是a.m./p.m都是大寫(xiě)的。如果我們想要小寫(xiě)的形式,可以像下面這樣修改代碼:SELECTconcat(date_format(date,'%l:%i'),lower(date_format(date,'%p')),date_format(date,'%W,%M%e,%Y'))FROMmessageWHEREmid=52;結(jié)果:4:51am,Friday,January21,2000例子二:從字符串類型轉(zhuǎn)換到MySQL的日期類型referenceinfo。2的rfid字段,7(:From:LeVine,Debi>Sent:Thursday,August17,20006:29PM>To:ISOMarketParticipants>Subject:RequestforBids-ContractforGenerationUnderGas>CurtailmentConditions>>AttachedisaRequestforBidstosupplytheCaliforniaISOwith>Generation內(nèi)容挺亂的!先讓我們提取首行中的日期并把它轉(zhuǎn)成MySQL的日期類型吧,因?yàn)檫@種類型的數(shù)據(jù)才適合插入數(shù)據(jù)表或是參與日期計(jì)算。要完成這項(xiàng)任務(wù),需要用到MySQL的內(nèi)置函數(shù)str_to_date()。這個(gè)函數(shù)與前面討論的date_format()有點(diǎn)像,只是它用于逆向處理。下面的查詢語(yǔ)句先是找到單詞Sent:,并繼續(xù)查找后續(xù)的字符直到>符號(hào)為止,然后把得到的字符串轉(zhuǎn)換成MySQL的datetime類型:2SELECT2str_to_date(substring_index(substring_index(reference,'>',3),'Sent:',-1),'%W,%M%e,%Y%h:%i%p')FROMreferenceinfoWHEREmid=79;結(jié)果:2000-08-1718:29:00現(xiàn)在我們已經(jīng)有了datetime類型的數(shù)據(jù)了,可以選擇把它直接插入一個(gè)新的MySQL字段,或是利用更多的日期函數(shù)來(lái)對(duì)其進(jìn)行計(jì)算。例子三:把MySQL字符串類型的數(shù)據(jù)轉(zhuǎn)換成小數(shù)在這個(gè)例子中,我們需要考慮如何把文本中的數(shù)字轉(zhuǎn)換成適用于計(jì)算的數(shù)據(jù)格式。假設(shè)我們要從安然公司的某些電子郵件消息中提取每桶(縮寫(xiě)為bbl)原油的價(jià)格。首先需要做的是編寫(xiě)一條查詢語(yǔ)句,從某個(gè)發(fā)件人所發(fā)出的郵件中查找含有/bbl字樣的字符串,之后再向前查找美元符號(hào)并提取與之關(guān)聯(lián)的小數(shù)形式的數(shù)據(jù)。下面的樣例取自Enron數(shù)據(jù)庫(kù)中的message表,消息ID(mid)為270516,先讓我們看看字符串中的數(shù)字是什么樣子的:Marchhadslippedby51ctsatthesametimetotradeat$18.47/bbl.下一步我們可以使用MySQL命令提取字符串并執(zhí)行數(shù)字類型的轉(zhuǎn)換操作:SELECTconvert(substring_index(substring(body,locate('$',body)+1),'/bbl',1),decimal(4,2))aspriceFROMmessageWHEREbodyLIKE"%$%"ANDbodyLIKE"%/bbl%"ANDsender='energybulletin@';引入WHERE子句可以確保我們得到的消息包含原油價(jià)格。函數(shù)convert()與cast()的功能相似。大多數(shù)現(xiàn)代數(shù)據(jù)庫(kù)系統(tǒng)都擁有把某種數(shù)據(jù)類型轉(zhuǎn)成數(shù)字的功能。文件級(jí)別的類型轉(zhuǎn)換在這一節(jié)中,我們將演示一些在文件級(jí)別上操作數(shù)據(jù)類型的常見(jiàn)案例。文件,因?yàn)樵谶@種類型的文件中,所有的數(shù)據(jù)都是文本數(shù)據(jù)。例子一:Excel中的類型發(fā)現(xiàn)與轉(zhuǎn)換可能大多數(shù)人都知道,在Excel和類似的電子表格程序中,可以使用格式化菜單來(lái)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。一般的做法是選擇想要修改的單元格,然后使用ribbon上的下拉菜單進(jìn)行操作。如果這并不能滿足你的需求,還可以使用一個(gè)名為FormatCells的對(duì)話框,它可以通過(guò)格式化菜單打開(kāi)。利用對(duì)話框中提供的選項(xiàng),可以對(duì)轉(zhuǎn)換處理的輸出內(nèi)容進(jìn)行更為細(xì)粒度的控制。2其實(shí)在Excel中還有兩個(gè)較少有人知道的函數(shù),istext()和isnumber(),它們?cè)诟袷交瘮?shù)據(jù)方面用處也非常大。2這兩個(gè)函數(shù)適用于任意一個(gè)單元格,istext()型而返回TRUE或,而isnumber()則會(huì)依據(jù)數(shù)據(jù)是否為數(shù)字給出類似的結(jié)果。在與條件另外,Excel還提供了一些不需要使用菜單就能完成從字符串類型到其他數(shù)據(jù)類型轉(zhuǎn)換的函數(shù)。下圖演示了如何用TEXT()函數(shù)把數(shù)字類型的日期轉(zhuǎn)換成格式為yyyy-mm-dd的字符串類型日=TEXT(A4,"yyyy-mm-dd"),數(shù)字36528就會(huì)被轉(zhuǎn)換成2000-01-03。這樣就能得到字符串類型的日期數(shù)據(jù)了。例子二:JSON中的類型轉(zhuǎn)換JSON作為一種基于文本的半結(jié)構(gòu)化類型,并沒(méi)有提供太多的格式化選項(xiàng)和數(shù)據(jù)類型?;叵胍幌卤菊虑懊鎸?duì)JSON的描述,每個(gè)JSON對(duì)象都是以“名值”對(duì)為基礎(chǔ)構(gòu)建出來(lái)的。唯一可以JSON如果我們?cè)O(shè)計(jì)的JSON對(duì)象構(gòu)建程序有缺陷,那該怎么解決呢?比方說(shuō)程序總是生成字符串JSON數(shù)據(jù)在D3程序中處理,最終生成一個(gè)圖形。Enron數(shù)據(jù)庫(kù),然數(shù)據(jù)個(gè)數(shù)與第1章中使用的一樣。<?php//連接到數(shù)據(jù)庫(kù)$dbc=mysqli_connect('localhost','username','password','enron')ordie('Errorconnectingtodatabase!'.mysqli_error());//這里使用的查詢語(yǔ)句與第1章按照日期進(jìn)行分組的查詢語(yǔ)句一樣$select_query="SELECTdate(date)ASdateSent,count(mid)ASnumMsgFROMmessageGROUPBY1ORDERBY1";$select_result=mysqli_query($dbc,$select_query);//查詢失敗則終止處理if(!$select_result)die("SELECTfailed![$select_query]".mysqli_error());//構(gòu)建一個(gè)用于打印json格式數(shù)據(jù)的新數(shù)組$counts=array();while($row=mysqli_fetch_array($select_result)){array_push($counts,array('dateSent'=>$row['dateSent'],'numMsg' =>$row['numMsg']));}echojson_encode($counts);?>這里要注意的是json_encode()函數(shù)需要5.3版本的PHP或是更高級(jí)的版本,并且需要使用第1章中搭建的Enron數(shù)據(jù)庫(kù)。結(jié)果數(shù)據(jù)的問(wèn)題就是所有的值都是字符串類型——由于PHP把數(shù)字類型的numMsg也加上了雙引號(hào),所以JSON也把這個(gè)值當(dāng)成字符串處理:[{"dateSent":"0001-05-30","numMsg":"2"},{"dateSent":"0001-06-18","numMsg":"1"}2]2echojson_encode($counts,JSON_NUMERIC_CHECK);numMsg是數(shù)字類型了:[{"dateSent":"0001-05-30","numMsg":2},{"dateSent":"0001-06-18","numMsg":1}]session中的值或是Facebook用戶ID保存成字符串?dāng)?shù)據(jù)的時(shí)候。還是上面的PHP代碼,假如我們沒(méi)有對(duì)生成的JSON結(jié)果進(jìn)行調(diào)整的話——再來(lái)看一個(gè)例子,假設(shè)我們通過(guò)API來(lái)獲取JSON數(shù)據(jù)結(jié)果,并且顯示內(nèi)容沒(méi)有經(jīng)過(guò)任何調(diào)整——就不得不在JSON對(duì)象構(gòu)建之后對(duì)它進(jìn)行轉(zhuǎn)換。如果碰到這種情況,我們可以在使用D3時(shí)通過(guò)JavaScript代碼,利用+操作符來(lái)迫使目標(biāo)數(shù)據(jù)從字符串類型轉(zhuǎn)換成數(shù)字類型。具體代碼如下所示,我們先是讀取輸出的JSON內(nèi)容,然后構(gòu)建圖形。字段numMsg的值已經(jīng)從字符串類型被強(qiáng)制轉(zhuǎn)換成數(shù)字類型:d3.json("counts.json",function(d){return{dateSent:d.dateSent,numMsg:+d.numMsg};},function(error,rows){console.log(rows);});隱藏在數(shù)據(jù)森林中的空值在這一節(jié),我們要把我們的勺子伸到混有零、空值和null值的大雜燴湯里去了。情況的回答。升的老湯。太好了,你現(xiàn)在可以回答這個(gè)問(wèn)題了。這種情形下,答案應(yīng)該是3。零不同的數(shù)據(jù)環(huán)境和編程環(huán)境(DBMS、存儲(chǔ)系統(tǒng)和編程語(yǔ)言)在對(duì)待零、空值和NULL這三null、在使用Oracle數(shù)據(jù)庫(kù)的時(shí)候,請(qǐng)多加小心,因?yàn)镺racle中的空值、空白和NULL不同于其他系統(tǒng)。在讀完這一節(jié)內(nèi)容之后,具體細(xì)節(jié)還請(qǐng)參考Oracle的數(shù)據(jù)庫(kù)文檔。零首先,也是最重要的事。在零、空值和NULL中,最容易處理的就是零值數(shù)據(jù)。零是可測(cè)量(,還可以拿其他數(shù)字來(lái)跟零做比較(、、、、、…(但有種例外的情況,零不可以做除數(shù)??张c零相比,空值的處理要難一些,它們會(huì)在不同的情況下產(chǎn)生不同的含義,以字符串處理為2例。假設(shè)我們有一個(gè)用于表現(xiàn)中間名(middlename)的屬性??墒俏覜](méi)有中間名,所以我得把(囧)2在CSV或分隔文件中,空值看起來(lái)就像下面的內(nèi)容一樣——注意后面的兩條記錄,它們的“favoritecolor”字段都為空:Firstname,birthdate,favoritecolor,salary"Sally","1971-09-16","lightblue",129000"Manu","1984-11-03","",159960"Martin","1978-12-10","",76888而在往MySQL數(shù)據(jù)庫(kù)中INSERT數(shù)據(jù)的時(shí)候,則使用下面的代碼插入“Manu”記錄:INSERTINTOpeople(firstName,birthdate,faveoriteColor,salary)VALUES("Manu","1984-11-03","",159960);而對(duì)于半結(jié)構(gòu)化的數(shù)據(jù)格式,如JSON,有些時(shí)候也是可能出現(xiàn)空對(duì)象和空字符串的。請(qǐng)看下面的例子:{"firstName":"Sally","birthDate":"1971-09-16","faveColor":"","pet":[],"job":{"jobTitle":"DataScientist","company":"DataWizards,Inc.","salary":129000}}在這里,我們拿走了Sally的寵物,并把她的“favoritecolor”字段置為空字符串??瞻渍?qǐng)注意,(兩個(gè)雙引號(hào)中間夾著一個(gè)空格字符,有時(shí)候也稱空白,但空格的說(shuō)法可能更空值的說(shuō)法更為恰當(dāng)。請(qǐng)看下面兩個(gè)MySQL的INSERT語(yǔ)句,注意比較它們之間的不同之處:--thisSQLhasanemptyforSally'sfavoriteColorandaspaceforFrank'sINSERTINTOpeople(firstName,birthdate,faveoriteColor,salary)VALUES("Sally","1971-09-16","",129000),("Frank","1975-10-23","",76000);除了空格外,有時(shí)其他不可見(jiàn)字符也會(huì)被誤當(dāng)成空或空白來(lái)解析,這樣的字符有制表符、回null如果你查一下詞典對(duì)null的解釋,答案很有可能就是零。但千萬(wàn)不要被誤導(dǎo)了。在實(shí)際的處理中,有很多關(guān)于NULL的定義。對(duì)于我們來(lái)說(shuō),NULL并非意味著空無(wú)一物;實(shí)際上,它的出現(xiàn)表明連空值都缺席了。那它和空到底有什么分別?首先,空可以等價(jià)于空值,就像空字符串的長(zhǎng)度為0一樣??梢韵胂蟮贸觯掌鋵?shí)是一個(gè)實(shí)實(shí)在在的值,可以針對(duì)它做一些比較操作。但是NULL就不一樣了,NULL不等于NULL,而且NOTNULL也不等于NOTNULL。有人就曾建議說(shuō),我們應(yīng)該像念咒那樣牢牢記住,NULL不等于任何值,甚至是它本身。只有在不希望出現(xiàn)任何數(shù)據(jù)的情況下才應(yīng)該使用NULL。這就跟我們不想把湯鍋放到爐子上一樣!為什么中間名的例子可以使用“空”而不能使用NULL?在清洗數(shù)據(jù)的時(shí)候總是用零來(lái)替代空或null會(huì)有用嗎?我們當(dāng)然可以很自信地說(shuō)我們已經(jīng)掌握了發(fā)出的全部郵件,這些日期的統(tǒng)計(jì)數(shù)量完全可以估算為零。但是,如果使用是第1章提到的Enron數(shù)據(jù)庫(kù)中的電子郵件,我們會(huì)非常明確事實(shí)不是這樣的。使用數(shù)據(jù)2--0有可能會(huì)滿足要求。但你應(yīng)該把這個(gè)操作用文檔記錄下來(lái)(參考1.3節(jié),因字符編碼2在早期的計(jì)算中,所有的字符串類型數(shù)據(jù)都是采用128個(gè)不同的符號(hào)構(gòu)建而成的。這種早期(2個(gè)字符包含a-z、A-Z、0-9、標(biāo)點(diǎn)符號(hào)、空格以及一些如今不太常用的電傳代碼。如果在我們的數(shù)據(jù)2(這些符號(hào)集合統(tǒng)稱為Unicode。Unicode符號(hào)編碼稱為UTF-8)現(xiàn)在還有一UTF-8依然是中的主流編碼格式。而在本書(shū)中,我們主要關(guān)注的是如何把以某種編碼格式存在的數(shù)據(jù)轉(zhuǎn)換成另外一種編碼格式。與此有關(guān)的一些示例場(chǎng)景如下。有一個(gè)MySQL數(shù)據(jù)庫(kù),它是以某種簡(jiǎn)單的編碼格式創(chuàng)建的(比如采用MySQL默認(rèn)的256位n1字符集,其中以n1格式存放了一些U-8數(shù)據(jù),而現(xiàn)在你希望把整個(gè)表改成UTF-8編碼格式。在Python2.7程序里面有一些只適用于ASCII編碼的函數(shù),但現(xiàn)在我們迫切需要用它們處理使用UTF-8編碼的文件或字符串。字符編碼問(wèn)題絕不局限于此,這里只是拋磚引玉而已。例子一:從MySQL數(shù)據(jù)中找出多字節(jié)字符(需要使用length()函數(shù)(需要使用char_length()函數(shù))來(lái)把它們找出來(lái)。下面的例子里使用了MySQL所支持的MyISAM版本數(shù)據(jù)庫(kù),關(guān)于這個(gè)版本的文檔信息請(qǐng)參考/doc/index-other.html。默認(rèn)情況下,MySQL中MyISAM版本的test數(shù)據(jù)庫(kù)采用的是latin1_swedish_ci字符編碼。所以,如果我們查詢含有特殊字符的國(guó)家名字,得用下面的語(yǔ)句才能看到想要查詢的C?ted’Ivoire:SELECTName,length(Name)FROMCountryWHERECode='CIV';運(yùn)行結(jié)果顯示的國(guó)家名字是C?ted’Ivoire,總長(zhǎng)度15,但它編碼后的內(nèi)容則是C??ted?Ivoire。除此以外,在其他一些字段上也有類似的奇怪編碼。為了修正這個(gè)問(wèn)題,需要使用下面的SQL命令把國(guó)家名字這一字段的默認(rèn)編碼調(diào)整為utf8:ALTERTABLECountryCHANGEName`Name`CHAR(52)CHARACTERSETutf8COLLATEutf8_general_ciNOTNULLDEFAULT'';現(xiàn)在可以清空數(shù)據(jù)表重新插入239個(gè)國(guó)家:TRUNCATECountry;現(xiàn)在所有的國(guó)家名字都采用UTF-8重新編碼。我們可以用下面的SQL來(lái)測(cè)試下結(jié)果,看看是否有國(guó)家采用了多字節(jié)字符來(lái)展現(xiàn)它們的名字:SELECT*FROMCountryWHERElength(Name)!=char_length(Name);結(jié)果顯示C?ted’Ivoire和法屬島嶼Réunion都是多字節(jié)字符。如果你無(wú)法訪問(wèn)world數(shù)據(jù)庫(kù),或是別的什么數(shù)據(jù)庫(kù),請(qǐng)參考下面的例子。你可以運(yùn)行下面的MySQL查詢命令來(lái)進(jìn)行多字節(jié)字符比較:SELECTlength('私は、データを愛(ài)し'),char_length('私は、データを愛(ài)し');在這個(gè)例子中,日語(yǔ)字符長(zhǎng)度為9,而編碼長(zhǎng)度實(shí)際為27?!挥靡粭lSQL語(yǔ)句就輕松地找出那些含有多字節(jié)的記錄,并以此為依據(jù)定制接下來(lái)的清洗計(jì)劃。這時(shí)你只需要執(zhí)行上面的命令就可以找到當(dāng)前使用多字節(jié)編碼的數(shù)據(jù)。例子二:找出MySQL中以Latin-1編碼存儲(chǔ)的Unicode字符以及其等價(jià)的UTF-8編碼形式下面示例中的代碼使用了convert()函數(shù)和RLIKE操作符打印出保存在MySQL數(shù)據(jù)庫(kù)中并MySQL數(shù)據(jù)庫(kù)也恰巧有Latin-1編碼的字段的話,也可以使用這段代碼,其實(shí)直至今日Latin-1編碼仍舊是大部分MySQL數(shù)據(jù)庫(kù)的默認(rèn)編碼(自MySQL5起就一直這樣。在這段代碼中,我們使用了面向公眾開(kāi)放的電影與影評(píng)數(shù)據(jù)庫(kù)Movielens。整套數(shù)據(jù)集廣泛。順利地運(yùn)行這里所演示的例子,請(qǐng)?jiān)L問(wèn)/megansquire/datacleaning/blob/master/ch2movies.sql,獲取由本書(shū)作者準(zhǔn)備的CREATE和INSERT命令語(yǔ)句。通過(guò)這些命令語(yǔ)句,你很容易創(chuàng)建出演示用的數(shù)據(jù)表并完成下面的示例代碼。2SELECTconvert(2convert(titleUSINGBINARY)USINGlatin1)AS'latin1version',convert(convert(titleUSINGBINARY)USINGutf8)AS'utf8version'FROMmoviesWHEREconvert(titleUSINGBINARY)RLIKEconcat('[',unhex('80'),'-',unhex('FF'),']');從下面的截圖中可以看到上面的命令在phpMyAdmin中的運(yùn)行結(jié)果,這里只展示Movielens數(shù)據(jù)庫(kù)movies表的前三部影片信息,它們的title字段均采用Latin-1編碼。有什么辦法能把一個(gè)已經(jīng)存在的數(shù)據(jù)庫(kù)轉(zhuǎn)成UTF-8格式呢?自然語(yǔ)言的信息方面起著重要的作用,我們強(qiáng)烈建議你使用編碼創(chuàng)建數(shù)據(jù)UTF-8下來(lái)你就可以用UTF-8編碼格式插入數(shù)據(jù)了。最棘手的情況就是面對(duì)大量采用非UTF-8SELECT、convert()和INSERT。你得從這些方案中選出一個(gè)最適合當(dāng)前數(shù)據(jù)庫(kù)系統(tǒng)的。例子三:處理文件級(jí)別的UTF-8編碼有時(shí)你可能需要調(diào)整一下代碼來(lái)處理文件級(jí)別的UTF-8UTF-8Python2.7程序,它使用了API抓取10條推文數(shù)據(jù)并把這些數(shù)據(jù)寫(xiě)入到文件中:importtwitterimportsys####################defoauth_login():CONSUMER_KEY=''CONSUMER_SECRET=''OAUTH_TOKEN=''OAUTH_TOKEN_SECRET=''auth=twitter.oauth.OAuth(OAUTH_TOKEN,OAUTH_TOKEN_SECRET,CONSUMER_KEY,CONSUMER_SECRET)twitter_api=twitter.Twitter(auth=auth)returntwitter_api###################twitter_api=oauth_login()codeword='DataCleaning'twitter_stream=twitter.TwitterStream(auth=twitter_api.auth)stream=twitter_stream.statuses.filter(track=codeword)f=open('outfile.txt','wb')counter=0max_tweets=10fortweetinstream:printcounter,"-",tweet['text'][0:10]f.write(tweet['text'])f.write('\n')counter+=1ifcounter>=max_tweets:f.close()sys.exit()認(rèn)證才可以,/apps/new簡(jiǎn)單地做一些10章中的10章會(huì)講解開(kāi)發(fā)者賬號(hào)的全部設(shè)置過(guò)程,并詳盡地描述推文數(shù)據(jù)的采集過(guò)程。這個(gè)小程序會(huì)找出以DataCleaning為關(guān)鍵字的最近的10(之所以選擇這個(gè)關(guān)鍵詞,是因?yàn)槲易罱谝赃@個(gè)詞為主題的標(biāo)簽下發(fā)布了幾條全由表情符號(hào)和UTF-8字符組成的推文,我確信查詢結(jié)果的前10)但是在用上面的Python代碼把這些推文數(shù)據(jù)保存成文件的時(shí)候,程序拋出了下面的報(bào)錯(cuò):UnicodeEncodeError:'ascii'codeccan'tencodecharacteru'\u00c9'inposition72:ordinalnotinrange(128)2原因是open()函數(shù)不能用來(lái)處理UTF-8字符??梢圆捎脙煞N方法來(lái)修復(fù)這個(gè)問(wèn)題:過(guò)濾2UTF-8字符,或是改變文件寫(xiě)入的方式。方法一:過(guò)濾UTF-8字符fortweetinstream:encoded_tweet=tweet['text'].encode('ascii','ignore')printcounter,"-",encoded_tweet[0:10]f.write(encoded_tweet)這段新代碼將冰島語(yǔ)書(shū)寫(xiě)的推文內(nèi)容從原來(lái)的:égelskag?gn改成:gelskaggn從文本分析的角度來(lái)講,這句話已經(jīng)失去了原有的意義,因?yàn)樽帜竒和ggn根本就不是單詞。所以說(shuō),采用這種方式來(lái)清洗推文里的字符編碼并非最佳方案。方法二:以UTF-8字符寫(xiě)入文件還有一種選擇就是在打開(kāi)文件的時(shí)候使用支持UTF-8的codecs或io庫(kù)。在文件的上方添加一行導(dǎo)入編碼庫(kù)的代碼,然后像下面這樣操作即可:f=codecs.open('outfile.txt','a+','utf-8')參數(shù)a+表明在文件已經(jīng)創(chuàng)建的情況下,我們希望繼續(xù)往文件中追加數(shù)據(jù)。此外,我們還可以換一種方式,在程序的頂部引入io庫(kù),然后使用它提供的open()函數(shù),這個(gè)函數(shù)允許傳入一個(gè)指定的編碼,代碼如下:f=io.open('outfile.txt','a+',encoding='utf8')我們可以使用Python3嗎?為什么例子還使用2.7版本呢?Python3在處理UTF-8編碼方面確實(shí)要比Python2.7容易得多,這是個(gè)不爭(zhēng)的事實(shí)。如果你的開(kāi)發(fā)環(huán)境是Python3,那么你完全可以使用它。我個(gè)人更喜歡使用EnthoughtCanopy來(lái)做數(shù)據(jù)分析、數(shù)據(jù)挖掘和教學(xué)工作。Python有許多發(fā)行版本——Enthought是其中之一——是為2.7版本編寫(xiě)的,并且在一段時(shí)間內(nèi)不大可能升遷到Python3。原因是Python3版本對(duì)語(yǔ)言內(nèi)部做了相當(dāng)大的調(diào)整(比如我們一開(kāi)始說(shuō)的UT8原生處理能力,這意味著有許多重要的有用的包不得不重小結(jié)這一章涵蓋了許多基本概念,本書(shū)后面講數(shù)據(jù)清洗時(shí)都會(huì)用到。這些技術(shù)中,有的很簡(jiǎn)單,3.1 電子表格中的數(shù)據(jù)清洗 3.1 電子表格中的數(shù)據(jù)清洗 數(shù)據(jù)清洗的老黃?!娮颖砀窈臀谋揪庉嬈鞯?章3電們已經(jīng)簡(jiǎn)單地掌握了這兩種工具的使用方法,而在這一章,我們將深入學(xué)習(xí)以下內(nèi)容。3學(xué)會(huì)使用Excel拆分與拼接,異常數(shù)據(jù)的查找與格式化,數(shù)據(jù)排序,從電子表格向MySQL據(jù),利用電子表格來(lái)生成SQL語(yǔ)句。學(xué)會(huì)使用文本編輯器實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)抽取與操作,并把它們轉(zhuǎn)換成對(duì)我們更為有用的格在小型項(xiàng)目中同時(shí)使用這兩種工具來(lái)完成數(shù)據(jù)清洗任務(wù)。電子表格中的數(shù)據(jù)清洗Excel的文本分列功能Spreadsheets的時(shí)候,這些軟件工具首先會(huì)嘗試查找分隔符號(hào)(如逗號(hào)或制表符,然后根據(jù)相應(yīng)的分隔符號(hào)把PAGE48PAGE48第3章 數(shù)據(jù)清洗的老黃牛——電子表格和文本編輯器3.1 電子表格中的數(shù)據(jù)清洗PAGE3.1 電子表格中的數(shù)據(jù)清洗PAGE49[2014-09-1914:10:47]===#eurovision4CongratulationstoAustria,winneroftheEurovisionSongContest2014![2014-09-1914:10:47]===#tinkerforge3[2014-09-1914:10:47]===##new3Welcometo##NEW要想得到IRC聊天服務(wù)器上的一份聊天頻道和主題數(shù)據(jù),可以使用alis命或/msgFreenode/msgalis*IRC的更多信息請(qǐng)參考/services.shtml。單憑肉眼我們就可以看出,處于最前面的數(shù)據(jù)是時(shí)間戳類型,緊接著的是===,然后是#和頻道名稱,頻道名稱后面是一個(gè)數(shù)字(表示在構(gòu)建頻道列表時(shí)該頻道中有多少用戶道的描述信息。但是,當(dāng)我們把這些數(shù)據(jù)粘貼到Excel或是GoogleSpreadsheets后,是不可能自動(dòng)Spreadsheets中的表現(xiàn)。從高亮的單元格A1中可以看出,整行數(shù)據(jù)都是置于函數(shù)欄的,這表明該行數(shù)據(jù)在粘貼后全部處于單元格A1中。想要解決這個(gè)問(wèn)題,辦法之一就是使用Excel的文本分列向?qū)?,將?shù)據(jù)拆分成可以識(shí)別的幾大塊,之后再重新組織數(shù)據(jù)并按照需求剔除不需要的字符。具體的操作步驟如下。(位于數(shù)據(jù)菜單中。在向?qū)У牡谝粋€(gè)步驟中選擇固定33這是第一輪文本分列的拆分結(jié)果。D兩個(gè)空格作為分隔符號(hào)(因?yàn)檫@個(gè)功能只允許我們使用單個(gè)字符,所以我們需要使用換(先使用查找)這里我選擇了符號(hào)^。這一步看起來(lái)不太優(yōu)雅,如果你有什么更好的方法,盡管放手做吧。與其他一些工具相比,Excel的查找和替換功能是非常有限的。稍后我們會(huì)在3.2節(jié)學(xué)習(xí)正則表達(dá)式的使用方法。添加一個(gè)不太常見(jiàn)的分隔字符有利于我們拆分剩余的字段。現(xiàn)在可以使用查找和替換刪除A列和B列中的字符[和]()遺憾的是,有時(shí)Excel做得太多了,它會(huì)把日期格式轉(zhuǎn)化成我們不太想要的:9/19/2014。如(10-在列F中,字符串的開(kāi)端還有額外的空格字符。使用trim()空格字符。在列F旁邊插入一個(gè)新列,然后調(diào)用trim()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人入股合作協(xié)議書(shū)樣本:金融科技股權(quán)投資合同4篇
- 2025個(gè)人商品房買賣合同補(bǔ)充協(xié)議范本制作指南
- 二零二五版高端別墅門窗定制合同樣本4篇
- 強(qiáng)制退股協(xié)議書(shū)(2篇)
- 工程合同條款承包協(xié)議書(shū)
- 2024年中級(jí)經(jīng)濟(jì)師考試題庫(kù)及參考答案(預(yù)熱題)
- 設(shè)備裝卸施工方案
- 二零二五版美容院美甲美睫技術(shù)培訓(xùn)合同3篇
- 通省隧道施工方案
- 二零二五年度棉被產(chǎn)品進(jìn)出口貿(mào)易合作框架協(xié)議4篇
- 2025年工程合作協(xié)議書(shū)
- 2025年山東省東營(yíng)市東營(yíng)區(qū)融媒體中心招聘全媒體采編播專業(yè)技術(shù)人員10人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年宜賓人才限公司招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- KAT1-2023井下探放水技術(shù)規(guī)范
- 垃圾處理廠工程施工組織設(shè)計(jì)
- 天皰瘡患者護(hù)理
- 駕駛證學(xué)法減分(學(xué)法免分)題庫(kù)及答案200題完整版
- 2024年四川省瀘州市中考英語(yǔ)試題含解析
- 2025屆河南省九師聯(lián)盟商開(kāi)大聯(lián)考高一數(shù)學(xué)第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)模擬試題含解析
- 撫養(yǎng)權(quán)起訴狀(31篇)
- 2024年“一崗雙責(zé)”制度(五篇)
評(píng)論
0/150
提交評(píng)論