使用大型JSON數據集可能會很痛苦,尤其是當它們太大而無法容納到內存中時。在這種情況下,命令行工具和Python的組合可以成為探索和分析數據的有效方法。在這篇專注于學習python編程的文章中,我們將研究如何利用Pandas之類的工具來探索和繪制馬里蘭州蒙哥馬利縣的警察活動。我們將首先查看JSON數據,然后使用Python探索和分析JSON。
當數據存儲在SQL數據庫中時,它傾向于遵循看起來像表的剛性結構。這是來自SQLite數據庫的示例:
如您所見,數據由行和列組成,其中每一列都映射到已定義的屬性,例如id或code。在上面的數據集中,每一行代表一個國家,每一列代表有關該國家的一些事實。
但是隨著捕獲數據量的增加,存儲數據時我們通常不知道數據的確切結構。這稱為非結構化數據。一個很好的例子是網站訪問者的事件列表。這是發(fā)送到服務器的事件列表的示例:
如您所見,上面列出了三個單獨的事件。每個事件都有不同的字段,并且某些字段嵌套在其他字段中。這種類型的數據很難存儲在常規(guī)SQL數據庫中。這種非結構化數據通常以稱為JavaScript Object Notation(JSON)的格式存儲。JSON是一種將列表和字典之類的數據結構編碼為字符串的方法,以確保它們易于被機器讀取。即使JSON以Javascript開頭,實際上它只是一種格式,并且可以用任何語言讀取。
Python具有強大的JSON支持,并帶有json庫。我們既可以將列表和字典轉換為JSON,也可以將字符串轉換為列表和字典。JSON數據看起來很像Python中的字典,其中存儲了鍵和值。
在如何在Python中使用Pandas和JSON處理大型數據集中,我們將在命令行上瀏覽JSON文件,然后將其導入Python并使用Pandas進行處理。
數據集
我們將查看一個包含有關馬里蘭州蒙哥馬利縣交通違章信息的數據集。您可以在此處下載數據。數據包含有關違規(guī)發(fā)生地點,汽車類型,接收違規(guī)者的人口統(tǒng)計信息以及其他一些有趣信息。我們可以使用此數據集回答很多問題,包括:
1)哪些類型的汽車最有可能因超速而停車?
2)警察什么時候最活躍?
3)“速度陷阱”有多普遍?還是門票在地理位置上分布得相當均勻?
4)人們最常做的事情是什么?
不幸的是,我們不預先知道JSON文件的結構,因此我們需要做一些探索才能弄清楚。我們將使用Jupyter Notebook進行此探索。
探索JSON數據
即使JSON文件只有600MB,我們也會將其視為更大,因此我們可以探討如何分析不適合內存的JSON文件。我們要做的第一件事是看md_traffic.json文件的前幾行。JSON文件只是一個普通的文如何在Python中使用Pandas和JSON處理大型數據集件,因此我們可以使用所有標準命令行工具與之交互:
由此可見,JSON數據是一個字典,并且格式正確。meta是頂級鍵,縮進兩個空格。我們可以使用grep命令來打印所有具有兩個前導空格的行,從而獲得所有頂級鍵:
這向我們顯示meta和data是md_traffic.json數據中的頂級鍵。一個名單列表似乎與有關data,而這有可能包含在我們的交通違法行為集中的每個記錄。每個內部列表都是一個記錄,第一個記錄出現在grep命令的輸出中。這與我們處理CSV文件或SQL表時使用的結構化數據非常相似。這是數據外觀的截斷視圖:
這看起來很像我們用來處理的行和列。我們只是缺少告訴我們每一列含義的標題。我們可能可以在meta密鑰下找到此信息。
meta通常指有關數據本身的信息。讓我們深入研究一下meta,看看其中包含什么信息。從head命令,我們知道至少有3鑰匙的水平,meta包含一鍵view,它包含了鍵id,name,averageRating和其他人。我們可以使用grep打印出任何帶有2-6前導空格的行,從而打印出JSON文件的完整鍵結構:
這向我們顯示了與關聯的完整密鑰結構md_traffic.json,并告訴我們JSON文件的哪些部分與我們相關。在這種情況下,columns鍵看起來很有趣,因為它可能包含鍵列表列表中各列的信息data。
提取列上的信息
現在我們知道哪個鍵包含列中的信息,我們需要讀入這些信息。由于我們假設JSON文件不適合內存,因此我們不能僅使用json庫直接讀取它。相反,我們需要以一種內存有效的方式來迭代讀取它。
我們可以使用ijson包完成此操作。ijson將迭代解析json文件,而不是一次讀取所有內容。這比直接讀取整個文件要慢,但是它使我們能夠處理無法容納在內存中的大文件。要使用ijson,我們指定要從中提取數據的文件,然后指定要提取的關鍵路徑:
在上面的代碼中,我們打開md_traffic.json文件,然后使用itemsijson中的方法從文件中提取列表。我們使用meta.view.columns符號指定列表的路徑。回想一下這meta是一個頂級密鑰,它包含view內部,columns內部也包含在內。然后meta.view.columns.item,我們指定表明我們應該提取meta.view.columns列表中的每個單獨的項目。該items函數將返回一個生成器,因此我們使用list方法將生成器轉換為Python列表。我們可以打印出列表中的第一項:
從上面的輸出中,看起來其中的每個項目columns都是一個字典,其中包含有關每一列的信息。為了獲得我們的標題,看起來fieldName是要提取的相關密鑰。要獲取我們的列名,我們只需fieldName從以下各項中提取鍵columns:
大!現在我們有了列名,接下來可以提取數據本身了。
提取數據
您可能還記得,數據已鎖定在密鑰內的列表列表中data。我們需要將這些數據讀入內存以進行操作。幸運的是,我們可以使用剛剛提取的列名稱來僅獲取相關的列。這樣可以節(jié)省大量空間。如果數據集更大,則可以迭代處理一批行。因此,請閱讀第一10000000行,進行一些處理,然后閱讀下一行10000000,依此類推。在這種情況下,我們可以定義我們關心的列,并再次用于ijson迭代處理JSON文件:
現在我們已經讀完數據,我們可以打印出第一個項目data:
將數據讀入熊貓
現在,我們將數據作為列表列表,并將列標題作為列表,我們可以創(chuàng)建Pandas Dataframe來分析數據。如果您不熟悉Pandas,則它是一個數據分析庫,它使用高效的表格數據結構(稱為數據框)來表示您的數據。Pandas允許您將列表列表轉換為數據框,并分別指定列名稱。
現在我們將數據存儲在一個數據框中,我們可以進行一些有趣的分析。下表列出了按汽車顏色劃分的??奎c數:
偽裝似乎是一種非常流行的汽車顏色。下表列出了創(chuàng)建該引用的警察部門:
隨著紅光攝像機和高速激光儀的興起,有趣的是,巡邏車仍是迄今為止引證的主要來源。
轉換列
我們現在幾乎可以做一些時間和基于位置的分析,但我們需要的轉換longitude,latitude以及date列從字符串第一個浮動。我們可以使用下面的代碼來轉換latitude和longitude:
奇怪的是,一天中的時間和停止日期存儲在兩個單獨的列中time_of_stop,和date_of_stop。我們將同時解析它們,并將它們轉換為單個datetime列:
現在,我們可以繪制出哪些天導致流量最多的停止:
在此情節(jié)中,星期一為0,星期日為6??雌饋碇苋胀?孔疃?,而周一停靠最少。這也可能是數據質量問題,由于某些原因,無效日期導致了星期日。您必須更深入地研究該date_of_stop列才能確定其含義(這超出了如何在Python中使用Pandas和JSON處理大型數據集的范圍)。
我們還可以列出最常見的交通停止時間:
看來最多的停靠點是在午夜左右,而最少的停靠點是在凌晨5點左右。這可能是有道理的,因為人們在深夜從酒吧和晚餐開車回家,并且可能會受到傷害。這也可能是一個數據質量問題,time_of_stop因此有必要仔細閱讀專欄以獲取完整的答案。
細分止損
現在,我們已經轉換了位置和日期列,我們可以繪制出交通站點的地圖。因為映射在CPU資源和內存方面非常密集,所以我們需要從頭stops開始過濾掉我們使用的行:
在上面的代碼中,我們選擇了過去一年中的所有行。我們可以進一步縮小范圍,僅選擇在高峰時段(每個人都在工作的早晨)發(fā)生的行:
使用出色的大葉包,我們現在可以可視化所有??奎c的發(fā)生位置。Folium允許您利用傳單輕松地在Python中創(chuàng)建交互式地圖。為了保持性能,我們將僅可視化的第一1000行morning_rush:
這表明許多交通站點都集中在縣的右下角。我們可以通過熱圖進一步擴展我們的分析:
下一步
在這篇專注于學習python編程的文章中,我們學習了如何使用Python通過命令行工具,ijson,Pandas,matplotlib和folium從原始JSON數據轉換為功能齊全的地圖。如果您想了解有關這些工具的更多信息,請查看有關AAA教育的數據分析,數據可視化和命令行課程。
填寫下面表單即可預約申請免費試聽!怕錢不夠?可先就業(yè)掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業(yè)?一地學習,可推薦就業(yè)!
?2007-2022/ 5wd995.cn 北京漫動者數字科技有限公司 備案號: 京ICP備12034770號 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc