旗下產(chǎn)業(yè): A產(chǎn)業(yè)/?A實(shí)習(xí)/?A計(jì)劃
全國(guó)統(tǒng)一咨詢熱線:010-5367 2995
首頁(yè) > 熱門(mén)文章 > 大數(shù)據(jù)分析 > 如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集

時(shí)間:2020-10-12來(lái)源:m.5wd995.cn點(diǎn)擊量:作者:Sissi
時(shí)間:2020-10-12點(diǎn)擊量:作者:Sissi


  使用大型JSON數(shù)據(jù)集可能會(huì)很痛苦,尤其是當(dāng)它們太大而無(wú)法容納到內(nèi)存中時(shí)。在這種情況下,命令行工具和Python的組合可以成為探索和分析數(shù)據(jù)的有效方法。在這篇專注于學(xué)習(xí)python編程的文章中,我們將研究如何利用Pandas之類的工具來(lái)探索和繪制馬里蘭州蒙哥馬利縣的警察活動(dòng)。我們將首先查看JSON數(shù)據(jù),然后使用Python探索和分析JSON。
 

  當(dāng)數(shù)據(jù)存儲(chǔ)在SQL數(shù)據(jù)庫(kù)中時(shí),它傾向于遵循看起來(lái)像表的剛性結(jié)構(gòu)。這是來(lái)自SQLite數(shù)據(jù)庫(kù)的示例:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  如您所見(jiàn),數(shù)據(jù)由行和列組成,其中每一列都映射到已定義的屬性,例如id或code。在上面的數(shù)據(jù)集中,每一行代表一個(gè)國(guó)家,每一列代表有關(guān)該國(guó)家的一些事實(shí)。
 

  但是隨著捕獲數(shù)據(jù)量的增加,存儲(chǔ)數(shù)據(jù)時(shí)我們通常不知道數(shù)據(jù)的確切結(jié)構(gòu)。這稱為非結(jié)構(gòu)化數(shù)據(jù)。一個(gè)很好的例子是網(wǎng)站訪問(wèn)者的事件列表。這是發(fā)送到服務(wù)器的事件列表的示例:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  如您所見(jiàn),上面列出了三個(gè)單獨(dú)的事件。每個(gè)事件都有不同的字段,并且某些字段嵌套在其他字段中。這種類型的數(shù)據(jù)很難存儲(chǔ)在常規(guī)SQL數(shù)據(jù)庫(kù)中。這種非結(jié)構(gòu)化數(shù)據(jù)通常以稱為JavaScript Object Notation(JSON)的格式存儲(chǔ)。JSON是一種將列表和字典之類的數(shù)據(jù)結(jié)構(gòu)編碼為字符串的方法,以確保它們易于被機(jī)器讀取。即使JSON以Javascript開(kāi)頭,實(shí)際上它只是一種格式,并且可以用任何語(yǔ)言讀取。
 

  Python具有強(qiáng)大的JSON支持,并帶有json庫(kù)。我們既可以將列表和字典轉(zhuǎn)換為JSON,也可以將字符串轉(zhuǎn)換為列表和字典。JSON數(shù)據(jù)看起來(lái)很像Python中的字典,其中存儲(chǔ)了鍵和值。
 

  在如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集中,我們將在命令行上瀏覽JSON文件,然后將其導(dǎo)入Python并使用Pandas進(jìn)行處理。
 

  數(shù)據(jù)集
 

  我們將查看一個(gè)包含有關(guān)馬里蘭州蒙哥馬利縣交通違章信息的數(shù)據(jù)集。您可以在此處下載數(shù)據(jù)。數(shù)據(jù)包含有關(guān)違規(guī)發(fā)生地點(diǎn),汽車類型,接收違規(guī)者的人口統(tǒng)計(jì)信息以及其他一些有趣信息。我們可以使用此數(shù)據(jù)集回答很多問(wèn)題,包括:
 

  1)哪些類型的汽車最有可能因超速而停車?

  2)警察什么時(shí)候最活躍?

  3)“速度陷阱”有多普遍?還是門(mén)票在地理位置上分布得相當(dāng)均勻?

  4)人們最常做的事情是什么?
 

  不幸的是,我們不預(yù)先知道JSON文件的結(jié)構(gòu),因此我們需要做一些探索才能弄清楚。我們將使用Jupyter Notebook進(jìn)行此探索。
 

  探索JSON數(shù)據(jù)
 

  即使JSON文件只有600MB,我們也會(huì)將其視為更大,因此我們可以探討如何分析不適合內(nèi)存的JSON文件。我們要做的第一件事是看md_traffic.json文件的前幾行。JSON文件只是一個(gè)普通的文如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集件,因此我們可以使用所有標(biāo)準(zhǔn)命令行工具與之交互:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  由此可見(jiàn),JSON數(shù)據(jù)是一個(gè)字典,并且格式正確。meta是頂級(jí)鍵,縮進(jìn)兩個(gè)空格。我們可以使用grep命令來(lái)打印所有具有兩個(gè)前導(dǎo)空格的行,從而獲得所有頂級(jí)鍵:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  這向我們顯示meta和data是md_traffic.json數(shù)據(jù)中的頂級(jí)鍵。一個(gè)名單列表似乎與有關(guān)data,而這有可能包含在我們的交通違法行為集中的每個(gè)記錄。每個(gè)內(nèi)部列表都是一個(gè)記錄,第一個(gè)記錄出現(xiàn)在grep命令的輸出中。這與我們處理CSV文件或SQL表時(shí)使用的結(jié)構(gòu)化數(shù)據(jù)非常相似。這是數(shù)據(jù)外觀的截?cái)嘁晥D:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  這看起來(lái)很像我們用來(lái)處理的行和列。我們只是缺少告訴我們每一列含義的標(biāo)題。我們可能可以在meta密鑰下找到此信息。
 

  meta通常指有關(guān)數(shù)據(jù)本身的信息。讓我們深入研究一下meta,看看其中包含什么信息。從head命令,我們知道至少有3鑰匙的水平,meta包含一鍵view,它包含了鍵id,name,averageRating和其他人。我們可以使用grep打印出任何帶有2-6前導(dǎo)空格的行,從而打印出JSON文件的完整鍵結(jié)構(gòu):

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  這向我們顯示了與關(guān)聯(lián)的完整密鑰結(jié)構(gòu)md_traffic.json,并告訴我們JSON文件的哪些部分與我們相關(guān)。在這種情況下,columns鍵看起來(lái)很有趣,因?yàn)樗赡馨I列表列表中各列的信息data。

  提取列上的信息

  現(xiàn)在我們知道哪個(gè)鍵包含列中的信息,我們需要讀入這些信息。由于我們假設(shè)JSON文件不適合內(nèi)存,因此我們不能僅使用json庫(kù)直接讀取它。相反,我們需要以一種內(nèi)存有效的方式來(lái)迭代讀取它。
 

  我們可以使用ijson包完成此操作。ijson將迭代解析json文件,而不是一次讀取所有內(nèi)容。這比直接讀取整個(gè)文件要慢,但是它使我們能夠處理無(wú)法容納在內(nèi)存中的大文件。要使用ijson,我們指定要從中提取數(shù)據(jù)的文件,然后指定要提取的關(guān)鍵路徑:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  在上面的代碼中,我們打開(kāi)md_traffic.json文件,然后使用itemsijson中的方法從文件中提取列表。我們使用meta.view.columns符號(hào)指定列表的路徑?;叵胍幌逻@meta是一個(gè)頂級(jí)密鑰,它包含view內(nèi)部,columns內(nèi)部也包含在內(nèi)。然后meta.view.columns.item,我們指定表明我們應(yīng)該提取meta.view.columns列表中的每個(gè)單獨(dú)的項(xiàng)目。該items函數(shù)將返回一個(gè)生成器,因此我們使用list方法將生成器轉(zhuǎn)換為Python列表。我們可以打印出列表中的第一項(xiàng):

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  從上面的輸出中,看起來(lái)其中的每個(gè)項(xiàng)目columns都是一個(gè)字典,其中包含有關(guān)每一列的信息。為了獲得我們的標(biāo)題,看起來(lái)fieldName是要提取的相關(guān)密鑰。要獲取我們的列名,我們只需fieldName從以下各項(xiàng)中提取鍵columns:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  大!現(xiàn)在我們有了列名,接下來(lái)可以提取數(shù)據(jù)本身了。
 

  提取數(shù)據(jù)
 

  您可能還記得,數(shù)據(jù)已鎖定在密鑰內(nèi)的列表列表中data。我們需要將這些數(shù)據(jù)讀入內(nèi)存以進(jìn)行操作。幸運(yùn)的是,我們可以使用剛剛提取的列名稱來(lái)僅獲取相關(guān)的列。這樣可以節(jié)省大量空間。如果數(shù)據(jù)集更大,則可以迭代處理一批行。因此,請(qǐng)閱讀第一10000000行,進(jìn)行一些處理,然后閱讀下一行10000000,依此類推。在這種情況下,我們可以定義我們關(guān)心的列,并再次用于ijson迭代處理JSON文件:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  現(xiàn)在我們已經(jīng)讀完數(shù)據(jù),我們可以打印出第一個(gè)項(xiàng)目data:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  將數(shù)據(jù)讀入熊貓
 

  現(xiàn)在,我們將數(shù)據(jù)作為列表列表,并將列標(biāo)題作為列表,我們可以創(chuàng)建Pandas Dataframe來(lái)分析數(shù)據(jù)。如果您不熟悉Pandas,則它是一個(gè)數(shù)據(jù)分析庫(kù),它使用高效的表格數(shù)據(jù)結(jié)構(gòu)(稱為數(shù)據(jù)框)來(lái)表示您的數(shù)據(jù)。Pandas允許您將列表列表轉(zhuǎn)換為數(shù)據(jù)框,并分別指定列名稱。

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  現(xiàn)在我們將數(shù)據(jù)存儲(chǔ)在一個(gè)數(shù)據(jù)框中,我們可以進(jìn)行一些有趣的分析。下表列出了按汽車顏色劃分的??奎c(diǎn)數(shù):

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  偽裝似乎是一種非常流行的汽車顏色。下表列出了創(chuàng)建該引用的警察部門(mén):

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  隨著紅光攝像機(jī)和高速激光儀的興起,有趣的是,巡邏車仍是迄今為止引證的主要來(lái)源。
 

  轉(zhuǎn)換列
 

  我們現(xiàn)在幾乎可以做一些時(shí)間和基于位置的分析,但我們需要的轉(zhuǎn)換longitude,latitude以及date列從字符串第一個(gè)浮動(dòng)。我們可以使用下面的代碼來(lái)轉(zhuǎn)換latitude和longitude:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  奇怪的是,一天中的時(shí)間和停止日期存儲(chǔ)在兩個(gè)單獨(dú)的列中time_of_stop,和date_of_stop。我們將同時(shí)解析它們,并將它們轉(zhuǎn)換為單個(gè)datetime列:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  現(xiàn)在,我們可以繪制出哪些天導(dǎo)致流量最多的停止:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  在此情節(jié)中,星期一為0,星期日為6??雌饋?lái)周日停靠最多,而周一??孔钌佟_@也可能是數(shù)據(jù)質(zhì)量問(wèn)題,由于某些原因,無(wú)效日期導(dǎo)致了星期日。您必須更深入地研究該date_of_stop列才能確定其含義(這超出了如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集的范圍)。
 

  我們還可以列出最常見(jiàn)的交通停止時(shí)間:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  看來(lái)最多的??奎c(diǎn)是在午夜左右,而最少的??奎c(diǎn)是在凌晨5點(diǎn)左右。這可能是有道理的,因?yàn)槿藗冊(cè)谏钜箯木瓢珊屯聿烷_(kāi)車回家,并且可能會(huì)受到傷害。這也可能是一個(gè)數(shù)據(jù)質(zhì)量問(wèn)題,time_of_stop因此有必要仔細(xì)閱讀專欄以獲取完整的答案。
 

  細(xì)分止損
 

  現(xiàn)在,我們已經(jīng)轉(zhuǎn)換了位置和日期列,我們可以繪制出交通站點(diǎn)的地圖。因?yàn)橛成湓贑PU資源和內(nèi)存方面非常密集,所以我們需要從頭stops開(kāi)始過(guò)濾掉我們使用的行:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  在上面的代碼中,我們選擇了過(guò)去一年中的所有行。我們可以進(jìn)一步縮小范圍,僅選擇在高峰時(shí)段(每個(gè)人都在工作的早晨)發(fā)生的行:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  使用出色的大葉包,我們現(xiàn)在可以可視化所有停靠點(diǎn)的發(fā)生位置。Folium允許您利用傳單輕松地在Python中創(chuàng)建交互式地圖。為了保持性能,我們將僅可視化的第一1000行morning_rush:

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集
 

  這表明許多交通站點(diǎn)都集中在縣的右下角。我們可以通過(guò)熱圖進(jìn)一步擴(kuò)展我們的分析:

 

如何在Python中使用Pandas和JSON處理大型數(shù)據(jù)集

  下一步
 

  在這篇專注于學(xué)習(xí)python編程的文章中,我們學(xué)習(xí)了如何使用Python通過(guò)命令行工具,ijson,Pandas,matplotlib和folium從原始JSON數(shù)據(jù)轉(zhuǎn)換為功能齊全的地圖。如果您想了解有關(guān)這些工具的更多信息,請(qǐng)查看有關(guān)AAA教育的數(shù)據(jù)分析,數(shù)據(jù)可視化和命令行課程。


 

預(yù)約申請(qǐng)免費(fèi)試聽(tīng)課

填寫(xiě)下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽(tīng)!怕錢(qián)不夠?可先就業(yè)掙錢(qián)后再付學(xué)費(fèi)! 怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!

?2007-2021/北京漫動(dòng)者教育科技有限公司版權(quán)所有
備案號(hào):京ICP備12034770號(hào)

?2007-2022/ m.5wd995.cn 北京漫動(dòng)者數(shù)字科技有限公司 備案號(hào): 京ICP備12034770號(hào) 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc

京公網(wǎng)安備 11010802035704號(hào)

網(wǎng)站地圖