第四節(jié) 數(shù)據(jù)加載、存儲(chǔ)

本章節(jié)以及后續(xù)章節(jié)的源碼,當(dāng)然也可以從我的github下載,在源碼中我自己加了一些中文注釋。

經(jīng)過(guò)前面文章對(duì)NumPy和Pandas庫(kù)的學(xué)習(xí),相信大家已經(jīng)能掌握基本的數(shù)據(jù)處理操作,更高級(jí)的數(shù)據(jù)處理操作將在本節(jié)之后介紹,像什么數(shù)據(jù)的清洗、轉(zhuǎn)換、合并、重塑、聚合、分組、可視化等都會(huì)介紹給大家。

俗話說(shuō),巧婦難為無(wú)米之炊,沒(méi)有數(shù)據(jù)源,就沒(méi)法進(jìn)行數(shù)據(jù)處理,本節(jié)就是講數(shù)據(jù)的加載和存儲(chǔ)。

進(jìn)入正題:

輸入輸出通常可以劃分幾個(gè)大類:讀取文本文件和其他更高效的磁盤存儲(chǔ)格式,加載數(shù)據(jù)庫(kù)中的數(shù)據(jù),利用Web API操作網(wǎng)絡(luò)資源

一、讀寫文本格式的數(shù)據(jù)

pandas提供了一些用于將表格型數(shù)據(jù)讀取為DataFrame對(duì)象的函數(shù),下表對(duì)它們進(jìn)行了總結(jié),其中read_csv和read_table是今后用的最多的:

read_csv和read_table函數(shù)的參數(shù):

1、基本操作

有些表格可能不是用固定的分隔符去分隔字段,可以用正則表達(dá)式來(lái)作為read_table的分隔符:

對(duì)于文件中出現(xiàn)的缺失值處理:默認(rèn)情況下,pandas會(huì)用一組經(jīng)常出現(xiàn)的標(biāo)記值進(jìn)行識(shí)別,如NA,-1.#IND、NULL等

2、逐塊讀取文本文件

在看大文件之前,我們先設(shè)置pandas顯示地更緊些:

pd.options.display.max_rows = 10

要逐塊讀取文件需要設(shè)置chunksize(行數(shù))

read_csv所返回的這個(gè)TextParser對(duì)象使你可以根據(jù)chunksize對(duì)文件進(jìn)行逐塊迭代。比如說(shuō),我們可以迭代處理ex6.csv,將值計(jì)數(shù)聚合到"key"列中,如下所示:

3、將數(shù)據(jù)寫到文本格式

用to_csv方法,可以將數(shù)據(jù)寫到一個(gè)以逗號(hào)分隔的文件中:

寫入成功:


寫入成功

4、手工處理分隔符文件

大部分存儲(chǔ)在磁盤上的表格型數(shù)據(jù)都能用pandas.read_table進(jìn)行加載,然而有時(shí)還是需要做一些手工處理。例如下面文件:

CSV文件的形式有很多種,只需定義csv.Dialect的一個(gè)子類即可定義出新格式(如專門的分隔符,字符串引用約定、行結(jié)束符等):

例如:

對(duì)于那些使用復(fù)雜分隔符或多字符的文件,csv模塊無(wú)能為力,可以使用字符串的split方法或正則表達(dá)式方法re.split進(jìn)行拆分和其他整理工作。


要手工輸出分隔符文件,可以使用csv.writer。它接受一個(gè)已打開且可寫的文件對(duì)象。

5、加載json數(shù)據(jù)

JSON已經(jīng)成為通過(guò)HTTP請(qǐng)求在Web瀏覽器和其他應(yīng)用程序之間發(fā)送數(shù)據(jù)的標(biāo)準(zhǔn)格式之一。

pandas.read_json可以自動(dòng)將特別格式的JSON數(shù)據(jù)集轉(zhuǎn)換為Series或DataFrame。如果你需要將數(shù)據(jù)從pandas輸出到JSON,可以使用to_json方法

6、XML和HTML:Web信息收集

Python有許多可以讀寫常見(jiàn)的HTML和XML格式數(shù)據(jù)的庫(kù),包括lxml、Beautiful Soup和html5lib。lxml的速度比較快,但其它的庫(kù)處理有誤的HTML或XML文件更好。

pandas有一個(gè)內(nèi)置的功能,read_html,它可以使用lxml和Beautiful Soup自動(dòng)將HTML文件中的表格解析為DataFrame對(duì)象。pandas.read_html有一些選項(xiàng),默認(rèn)條件下,它會(huì)搜索、嘗試解析標(biāo)簽內(nèi)的的表格數(shù)據(jù)。結(jié)果是一個(gè)列表的DataFrame對(duì)象:

我們可以做一些數(shù)據(jù)清洗和分析,比如計(jì)算按年份計(jì)算倒閉的銀行數(shù):

7、利用lxml.objectify解析XML

XML(Extensible Markup Language)是另一種常見(jiàn)的支持分層、嵌套數(shù)據(jù)以及元數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)格式。

紐約大都會(huì)運(yùn)輸署發(fā)布了一些有關(guān)其公交和列車服務(wù)的數(shù)據(jù)資料(http://www.mta.info/developers/download.html)。這里,我們將看看包含在一組XML文件中的運(yùn)行情況數(shù)據(jù)。每項(xiàng)列車或公交服務(wù)都有各自的文件(如Metro-North Railroad的文件是Performance_MNR.xml),其中每條XML記錄就是一條月度數(shù)據(jù),如下所示:

我們先用lxml.objectify解析該文件,然后通過(guò)getroot得到該XML文件的根節(jié)點(diǎn)的引用:

XML數(shù)據(jù)可以比本例復(fù)雜得多。每個(gè)標(biāo)記都可以有元數(shù)據(jù)??纯聪旅孢@個(gè)HTML的鏈接標(biāo)簽(它也算是一段有效的XML):

二、二進(jìn)制數(shù)據(jù)格式

1、pickle

實(shí)現(xiàn)數(shù)據(jù)的二進(jìn)制格式存儲(chǔ)最簡(jiǎn)單的辦法之一是使用python內(nèi)置的pickle序列化,為了使用方便,pandas對(duì)象都有一個(gè)用于將數(shù)據(jù)以pickle形式保存到磁盤上的save方法。

可以通過(guò)pickle直接讀取被pickle化的數(shù)據(jù),或是使用更為方便的pandas.read_pickle

pickle僅建議用于短期存儲(chǔ)格式。

2、HDF5格式

pandas內(nèi)置支持兩個(gè)二進(jìn)制數(shù)據(jù)格式:HDF5和MessagePack。HDF5是一個(gè)流行的工業(yè)級(jí)庫(kù),它是一個(gè)C庫(kù),帶有許多語(yǔ)言的接口。HDF5中HDF指的是層次型數(shù)據(jù)格式。每個(gè)HDF5文件都含有一個(gè)文件系統(tǒng)式的節(jié)點(diǎn)結(jié)構(gòu),它使你能夠存儲(chǔ)多個(gè)數(shù)據(jù)集并支持元數(shù)據(jù)。與其他簡(jiǎn)單格式相比,HDF5支持多種壓縮器的即時(shí)壓縮,還能更高效地存儲(chǔ)重復(fù)模式數(shù)據(jù)。對(duì)于那些非常大的無(wú)法直接放人內(nèi)存的數(shù)據(jù)集,HDF5就是不錯(cuò)的選擇,因?yàn)樗梢愿咝У胤謮K讀寫。

Python中的HDF5庫(kù)有兩個(gè)接口(即PyTables和h5py),他們各自采取了不同的問(wèn)題解決方式。h5py提供了一種直接而高級(jí)的HDF5 API訪問(wèn)接口,而PyTables則抽象了HDF5的許多細(xì)節(jié)以提供多種靈活的數(shù)據(jù)容器、表索引、查詢功能以及對(duì)核外計(jì)算技術(shù)的某些支持。

Pandas有一個(gè)最小化的類似于字典的HDFStore類,它通過(guò)PyTables存儲(chǔ)pandas對(duì)象:

HDFStore支持兩種存儲(chǔ)模式,'fixed'和'table'。后者通常會(huì)更慢,但是支持使用特殊語(yǔ)法進(jìn)行查詢操作

put是store['obj2'] = frame方法的顯示版本,允許我們?cè)O(shè)置其它的選項(xiàng),比如格式。

pandas.read_hdf函數(shù)可以快捷使用這些工具:


如果要處理的數(shù)據(jù)位于遠(yuǎn)程服務(wù)器,比如Amazon S3或HDFS,使用專門為分布式存儲(chǔ)(比如Apache Parquet)的二進(jìn)制格式也許更加合適。Python的Parquet和其它存儲(chǔ)格式還在不斷的發(fā)展之中

如果需要處理本地海量數(shù)據(jù),建議好好研究PyTables和h5py。由于許多數(shù)據(jù)分析問(wèn)題都是IO密集型(而不是CPU密集型),利用HDF5這樣的工具能顯著提升應(yīng)用程序的效率。

3、讀取Microsoft Excel文件

pandas的ExcelFile類或pandas.read_excel函數(shù)支持讀取存儲(chǔ)在Excel 2003(或更高版本)中的表格型數(shù)據(jù)。

要使用ExcelFile,通過(guò)傳遞xls或xlsx路徑創(chuàng)建一個(gè)實(shí)例。如果要讀取一個(gè)文件中的多個(gè)表單,創(chuàng)建ExcelFile會(huì)更快,但你也可以將文件名傳遞到pandas.read_excel。

如果要將pandas數(shù)據(jù)寫入為Excel格式,你必須首先創(chuàng)建一個(gè)ExcelWriter,然后使用pandas對(duì)象的to_excel方法將數(shù)據(jù)寫入到其中。還可以不使用ExcelWriter,而是傳遞文件的路徑到to_excel。

三、使用Web API加載數(shù)據(jù)

這個(gè)其實(shí)是爬蟲的相關(guān)內(nèi)容,大家自行學(xué)習(xí)爬蟲的相關(guān)庫(kù),如requests庫(kù),BeautifulSoup庫(kù),urllib庫(kù),selenium庫(kù),Scrapy爬蟲框架等。

網(wǎng)絡(luò)爬蟲是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。

爬蟲用來(lái)獲取很多數(shù)據(jù)。相關(guān)知識(shí)點(diǎn)很多,可以分出一個(gè)專業(yè)領(lǐng)域。對(duì)爬蟲感興趣的可以去專門學(xué)習(xí)。


搜索最新的30個(gè)GitHub上的pandas主題,響應(yīng)對(duì)象的json方法會(huì)返回一個(gè)包含被解析過(guò)的JSON字典,加載到一個(gè)Python對(duì)象中:

data中的每個(gè)元素都是一個(gè)包含所有GitHub主題頁(yè)數(shù)據(jù)(不包含評(píng)論)的字典。我們可以直接傳遞數(shù)據(jù)到DataFrame,并提取感興趣的字段:

四、使用數(shù)據(jù)庫(kù)加載數(shù)據(jù)

在許多應(yīng)用中,數(shù)據(jù)庫(kù)很少取自文本文件,因?yàn)檫@種方式存儲(chǔ)大量數(shù)據(jù)很低效?;赟QL的關(guān)系型數(shù)據(jù)庫(kù)使用非常廣泛,此外還有一些非SQL(即noSQL)型數(shù)據(jù)庫(kù)也變得非常流行。


這種數(shù)據(jù)規(guī)整操作相當(dāng)多,你肯定不想每查一次數(shù)據(jù)庫(kù)就重寫一次。SQLAlchemy項(xiàng)目是一個(gè)流行的Python SQL工具,它抽象出了SQL數(shù)據(jù)庫(kù)中的許多常見(jiàn)差異。pandas有一個(gè)read_sql函數(shù),可以讓你輕松的從SQLAlchemy連接讀取數(shù)據(jù)。這里,我們用SQLAlchemy連接SQLite數(shù)據(jù)庫(kù),并從之前創(chuàng)建的表讀取數(shù)據(jù):

使用數(shù)據(jù)庫(kù)加載數(shù)據(jù)涉及到了數(shù)據(jù)庫(kù)的相關(guān)知識(shí),數(shù)據(jù)庫(kù)也是一門分支,需要系統(tǒng)了解其原理以及設(shè)計(jì),正確使用。

快速學(xué)習(xí):

第一節(jié) NumPy基礎(chǔ)(一)

第二節(jié) NumPy基礎(chǔ)(二)

第三節(jié) Pandas入門基礎(chǔ)

第四節(jié) 數(shù)據(jù)加載、存儲(chǔ)

第五節(jié) 數(shù)據(jù)清洗

第六節(jié) 數(shù)據(jù)合并、重塑

第七節(jié) 數(shù)據(jù)聚合與分組運(yùn)算

第八節(jié) 數(shù)據(jù)可視化

第九節(jié) pandas高級(jí)應(yīng)用

第十節(jié) 時(shí)間序列

第十一節(jié) Python建模庫(kù)

數(shù)據(jù)分析案例--1880-2010年間全美嬰兒姓名的處理

數(shù)據(jù)分析案例--MovieLens 1M數(shù)據(jù)集

數(shù)據(jù)分析案例--USA.gov數(shù)據(jù)

數(shù)據(jù)分析案例--2012聯(lián)邦選舉委員會(huì)數(shù)據(jù)庫(kù)

數(shù)據(jù)分析案例--USDA食品數(shù)據(jù)庫(kù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ◆◆◆ 李笑來(lái)在他的《把時(shí)間當(dāng)做朋友》里說(shuō),當(dāng)你對(duì)未來(lái)充滿迷惑的時(shí)候,不要著急,因?yàn)槟悴⒉还陋?dú),對(duì)未來(lái)充滿迷惑并不...
    漂流瓶的時(shí)光閱讀 1,309評(píng)論 0 0
  • 第三部分:護(hù)士職業(yè)生涯的設(shè)計(jì) 01 N0-N4的層級(jí)進(jìn)階模式 面對(duì)這樣一個(gè)龐大的團(tuán)隊(duì)和其迅猛的發(fā)展趨勢(shì),生涯規(guī)劃技...
    燕尾無(wú)聲閱讀 2,411評(píng)論 1 10
  • 夏天可真冷 凍得我直冒汗 想去冬天曬太陽(yáng) 可惜隔著秋天 海水可真甜 融了一大塊鹽 如果在海里下一把面 就變成一大鍋...
    種麥子閱讀 412評(píng)論 1 1
  • 早上打開微信,看到劉莉?qū)俟俚谋磉_(dá)很生氣,之后官官出現(xiàn)后,雙方的語(yǔ)言表達(dá)更加尖銳,互相攻擊對(duì)方的脆弱。 看到他們的...
    上善若水澤萬(wàn)物閱讀 178評(píng)論 1 5

友情鏈接更多精彩內(nèi)容