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

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

時間:2020-10-12來源:lb577.com點擊量:作者:Sissi
時間:2020-10-12點擊量:作者:Sissi


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

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

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

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

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

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

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

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

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

  數(shù)據(jù)集
 

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

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

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

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

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

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

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

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

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

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

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

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

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

  這看起來很像我們用來處理的行和列。我們只是缺少告訴我們每一列含義的標(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鍵看起來很有趣,因為它可能包含鍵列表列表中各列的信息data。

  提取列上的信息

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  轉(zhuǎn)換列
 

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

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

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

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

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

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

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

  我們還可以列出最常見的交通停止時間:

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

  看來最多的停靠點是在午夜左右,而最少的??奎c是在凌晨5點左右。這可能是有道理的,因為人們在深夜從酒吧和晚餐開車回家,并且可能會受到傷害。這也可能是一個數(shù)據(jù)質(zhì)量問題,time_of_stop因此有必要仔細(xì)閱讀專欄以獲取完整的答案。
 

  細(xì)分止損
 

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

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

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

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

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

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

  這表明許多交通站點都集中在縣的右下角。我們可以通過熱圖進一步擴展我們的分析:

 

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

  下一步
 

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


 

預(yù)約申請免費試聽課

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

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

?2007-2022/ lb577.com 北京漫動者數(shù)字科技有限公司 備案號: 京ICP備12034770號 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc

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

網(wǎng)站地圖