使用MongoDB、Seaborn和Matplotlib分析API數據

介紹

軟件開發職位通常要求的技能是使用NoSQL數據庫(包括MongoDB)的經驗。本教程將探索如何使用API收集數據,將數據存儲在MongoDB數據庫中,並對數據進行一些分析。

但是,在進入代碼之前,讓我們花點時間來複習一下MongoDB和API,以確保我們能理解我們是如何處理收集的數據的。

MongoDB和NoSQL

MongoDB是一種NoSQL數據庫,支持以非關係形式存儲數據。通過將NoSQL數據庫與其前身/競爭對手—SQL數據庫進行比較,我們就可以更好地理解NoSQL數據庫。

SQL代表結構化查詢語言,它是一種關係型數據庫管理工具。關係型數據庫是將數據存儲為一系列鍵和值的數據庫,數據表中的每一行都有自己惟一的鍵。可以通過查找相應的鍵來檢索數據庫中的值。這就是SQL數據庫存儲數據的方式,但是,NoSQL數據庫可以以非關聯的方式存儲數據。

NoSQL代表“不僅僅是SQL”,它指的是這樣一個事實:儘管SQL類型的查詢可以使用NoSQL系統完成,但它們也可以完成SQL數據庫難以完成的事情。NoSQL數據庫為其處理的數據提供了更廣泛的存儲選項,而且由於數據的相關性較低,因此,數據可以以更多地方式進行檢索,從而加快了一些操作的速度。與SQL數據庫相比,NoSQL數據庫可以使節點或字段的添加更簡單。

有很多流行的NoSQL框架,包括MongoDB、OrientDB、InfinityDB、Aerospike和CosmosDB。MongoDB是一個特定的NoSQL框架,它以文檔的形式存儲數據,充當面向文檔的數據庫。

MongoDB之所以流行,是因為它的通用性和簡單的雲集成,並且能夠用於各種各樣的任務。MongoDB使用JSON格式存儲數據。MongoDB數據庫的查詢也是以JSON格式進行,因為存儲和檢索命令都是基於JSON格式的,所以,MongoDB的命令很容易記住和編寫。

API是什麼?

API是應用程序編程接口,其功能是簡化客戶機和服務器之間的通信。創建API通常是為了方便那些對應用程序開發人員所使用的語言缺乏經驗的人來收集信息。

API也可以是控制來自服務器的信息流的有用方法,鼓勵那些對訪問服務器信息感興趣的人使用官方渠道來訪問,而不是構建一個網絡爬蟲。網站中最常見的API是REST(表徵狀態轉移)API,它利用標準的HTTP請求和響應來發送、接收、刪除和修改數據。在本教程中,我們將訪問REST API並以HTTP格式發送請求。

我們將使用什麼API ?

我們將使用的API是GameSpot的API。GameSpot是網絡上最大的視頻遊戲評論網站之一,您可以在這裡訪問它的API。(地址:https://www.gamespot.com/api/ )

進行設置

在開始之前,您應該確保自己獲得了GameSpot的API密鑰。您還應該確保已經安裝了MongoDB及其Python庫。Mongo的安裝說明可以在這裡找到。

安裝PyMongo庫只需運行以下命令:

使用MongoDB、Seaborn和Matplotlib分析API數據

您可能還希望安裝MongoDB Compass程序,該程序允許您使用GUI輕鬆地可視化和編輯MongoDB數據庫的各個方面。

使用MongoDB、Seaborn和Matplotlib分析API數據

創建MongoDB數據庫

現在,我們可以通過創建MongoDB數據庫來開始我們的項目。首先,我們將處理我們的導入項。我們將從PyMongo導入MongoClient,以及requests 和pandas:

使用MongoDB、Seaborn和Matplotlib分析API數據

當使用MongoDB創建了一個數據庫之後,我們首先需要連接到客戶端,然後使用客戶端創建我們想要的數據庫:

使用MongoDB、Seaborn和Matplotlib分析API數據

MongoDB可以在一個數據庫中存儲多個數據集合,所以我們還需要定義我們想要使用的集合的名稱:

使用MongoDB、Seaborn和Matplotlib分析API數據

就是這樣。我們的數據庫和集合已經創建好了,可以開始向其中插入數據了。這很簡單,不是嗎?

使用該API

現在,我們已經準備好使用GameSpot API來收集數據。通過查看這裡(地址:https://www.gamespot.com/api/documentation )的API文檔,我們可以確定我們的請求所需的格式。

我們需要將請求發送到包含我們API密鑰的基本URL。GameSpot的API有多個資源,我們可以從這些資源中獲取數據。例如,他們有一個列出了遊戲的發佈日期和運行平臺等數據的資源。

然而,我們對他們的遊戲評論資源比較感興趣,我們將從該API資源中獲取一些特定的字段。此外,GameSpot要求您在發出請求時要指定一個唯一的用戶代理標識符,我們將通過創建一個header來實現,我們將把此header傳入requests函數:

使用MongoDB、Seaborn和Matplotlib分析API數據

我們將需要以下數據字段:id, title, score, deck, body, good, bad:

使用MongoDB、Seaborn和Matplotlib分析API數據

GameSpot一次只允許返回100個結果。出於這個原因,為了獲得足夠數量的評論進行分析,我們需要創建一個數字範圍並循環遍歷它們,一次檢索100個結果。

您可以選擇任何您想要的數字。我選擇獲取他們所有的評論,最高可達14900條:

使用MongoDB、Seaborn和Matplotlib分析API數據

我們將創建一個函數來連接基地址、要返回的字段列表、排序方案(升序或降序)和查詢的偏移量。

我們將獲得我們想要循環的頁面數量,然後對每100個條目,我們將創建一個新的URL並請求數據:

使用MongoDB、Seaborn和Matplotlib分析API數據

回想一下,MongoDB將數據存儲為JSON。因此,我們需要使用json()方法將我們的響應數據轉換成JSON格式。

將數據轉換為JSON後,我們將從響應中獲得“results”屬性,因為這部分實際上包含了我們感興趣的數據。然後,我們將遍歷100個不同的結果,並使用來自PyMongo的insert_one()命令將每個結果插入到我們的集合中。當然,您也可以使用insert_many()將它們全部放到一個列表中。

現在讓我們調用該函數並讓它收集數據:

使用MongoDB、Seaborn和Matplotlib分析API數據

為什麼我們不檢查一下,看看我們的數據是否已經像我們預期的那樣插入到了我們的數據庫?我們可以使用Compass程序直接查看數據庫及其內容:

使用MongoDB、Seaborn和Matplotlib分析API數據

我們可以看到數據已經正確地插入了。

我們還可以進行一些數據庫檢索並打印它們。為此,我們將創建一個空列表來存儲條目,並在“reviews”集合上使用.find()命令。

當使用PyMongo中的find函數時,檢索也需要格式化為JSON。傳入find函數的參數將有一個字段和值。

默認情況下,MongoDB總是返回_id字段(它自己唯一的ID字段,而不是我們從GameSpot中獲取的ID),但是我們可以通過指定一個0值來告訴它禁止這種情況。我們想要返回的字段,比如本例中的score字段,應該被賦予一個1值:

使用MongoDB、Seaborn和Matplotlib分析API數據

以下是成功獲取並打印的內容:

使用MongoDB、Seaborn和Matplotlib分析API數據

我們還可以通過使用Pandas輕鬆地將查詢結果轉換為數據幀:

使用MongoDB、Seaborn和Matplotlib分析API數據

以下是返回的結果:

使用MongoDB、Seaborn和Matplotlib分析API數據

在開始分析一些數據之前,讓我們先花點時間看看如何將兩個集合連接在一起。如前所述,GameSpot有多個資源來獲取數據,我們可能希望從第二個數據庫(如Games數據庫)獲取值。

MongoDB是一個NoSQL數據庫,因此與SQL不同,它不打算處理數據庫之間的關係和將數據字段連接在一起。但是,有一個函數可以近似於數據庫連接,即lookup()函數。

lookup()函數作用類似於數據庫連接,我們可以通過指定一個管道來完成此操作,該管道包含您想要從其中獲取連接元素的數據庫,以及您想要從輸入文檔(localField)和“from”文檔(foreignField)中獲得的字段。

最後,您選擇一個名稱來將外部文檔轉換為它,它們將顯示在我們的查詢響應表中的這個新名稱下面。如果您有第二個名為games的數據庫,並想要在一個查詢中將它們連接在一起,您可以這樣做:

使用MongoDB、Seaborn和Matplotlib分析API數據

分析數據

現在,我們可以開始分析和可視化在我們新創建的數據庫中發現的一些數據。讓我們確保我們有了分析所需的所有函數。

使用MongoDB、Seaborn和Matplotlib分析API數據

假設我們想對GameSpot的遊戲評論中發現的單詞進行一些分析。我們的數據庫中有這些信息,我們只需要得到它。

我們可以像之前一樣使用find()函數從我們的數據庫中收集排名前40的評論(或者您想要的任何數字),但這次我們將指定我們希望根據score變量進行排序,並按降序排序:

使用MongoDB、Seaborn和Matplotlib分析API數據

我們將該響應變換為一個Pandas數據幀並將其轉換進一個字符串。然後我們將提取

HTML標籤中包含評論文本的所有值,我們將使用BeautifulSoup來完成:

使用MongoDB、Seaborn和Matplotlib分析API數據

查看print語句,我們可以看到評論文本已經被收集了:

使用MongoDB、Seaborn和Matplotlib分析API數據

現在我們已經得到了評論文本數據,我們想用幾種不同的方法來分析它。讓我們試著對排名前40位的評論中常用的單詞進行一些直覺判斷。我們有幾種不同的方法:

  • 我們可以創建一個詞雲
  • 我們可以計數所有的單詞並按它們的出現次數進行排序
  • 我們可以進行命名實體識別

在我們對數據進行分析之前,我們必須對它進行預處理。

為了預處理數據,我們需要創建一個函數來過濾條目。此文本數據仍然充滿了各種標記和非標準字符,我們希望通過獲取評論的原始文本來刪除這些標記和非標準字符。我們將使用正則表達式來將非標準字符替換為空格。

我們也會使用一些來自NTLK的停止詞(不會對我們的文本添加意思的高度常用單詞)並且通過創建一個列表來保存所有的單詞,從而將它們從我們的文本中刪除,然後只有在單詞不在我們的停止詞列表中時才將它們加入到其中。

詞雲

讓我們獲取評論單詞的一個子集,將其可視化為一個語料庫。如果它在生成時太大的話,可能會導致詞雲出現一些問題。

例如,我過濾出了前5000個單詞:

使用MongoDB、Seaborn和Matplotlib分析API數據

現在,我們可以通過使用這裡提供的預先創建好的WordCloud庫來輕鬆地創建一個詞雲。

這個詞雲確實給我們提供了一些信息,關於什麼類型的詞在排名靠前的評論中經常使用:

使用MongoDB、Seaborn和Matplotlib分析API數據

不幸的是,它仍然充滿了常見的單詞,這就是為什麼使用tf-idf過濾方案對評論單詞進行過濾是一個好主意,但是對於這個簡單的演示來說,這已經足夠好了。

事實上,我們確實擁有一些關於遊戲評論中所談論的概念類型的信息:遊戲玩法,故事,角色,射擊,動作,地點等。

我們可以通過查看我們選擇的前40名評論之一來確認這些詞經常出現在遊戲評論中:Mike Mahardy對《神秘海域4》的評論:

使用MongoDB、Seaborn和Matplotlib分析API數據

果然,這篇評論討論了動作、遊戲玩法、角色和故事。

單詞的大小給了我們關於單詞在這些評論中出現的頻率的直觀感覺,但是我們也可以計算某些單詞出現的頻率。

計數器

我們可以通過將單詞分割開並將它們與其數目一起添加到一個單詞字典中,從而獲得一個最常見單詞的列表,每次看到相同的單詞時,這些單詞計數就會增加。

然後我們只需要使用Counter和most_common()函數:

使用MongoDB、Seaborn和Matplotlib分析API數據

以下是一些最常見的單詞的數目:

使用MongoDB、Seaborn和Matplotlib分析API數據

命名實體識別

我們還可以使用en_core_web_sm進行命名實體識別,這是spaCy中包含的一個語言模型。這裡列出了可以檢測到的各種概念和語言特徵。

我們需要從文檔(單詞列表)中抓取檢測到的命名實體和概念列表:

使用MongoDB、Seaborn和Matplotlib分析API數據

我們可以打印出找到的實體及其數目。

使用MongoDB、Seaborn和Matplotlib分析API數據

以下是打印的內容:

使用MongoDB、Seaborn和Matplotlib分析API數據

假設我們想要為不同的類別繪製最常見的識別詞語,比如人員和組織。我們只需要創建一個函數來獲得不同類別實體的計數,然後使用它來獲得我們想要的實體。

我們將得到一個命名實體/人員、組織和GPEs(位置)的列表:

使用MongoDB、Seaborn和Matplotlib分析API數據

現在我們要做的就是用一個函數來對命名實體數目繪製圖表:

使用MongoDB、Seaborn和Matplotlib分析API數據

我們來看看生成的圖表。

使用MongoDB、Seaborn和Matplotlib分析API數據

正如命名實體所期望的那樣,返回的大多數結果是視頻遊戲角色的名稱。這並不是完美的,因為它將“Xbox”等詞語錯誤地歸類為一個命名實體,而不是一個組織,但這仍然讓我們瞭解到排名靠前的評論中討論了哪些角色。

使用MongoDB、Seaborn和Matplotlib分析API數據

該組織圖為我們展示了一些正確的遊戲開發者和發行商,如Playstation和Nintendo,但它也將“480p”這樣的東西標記為一個組織。

使用MongoDB、Seaborn和Matplotlib分析API數據

以上是對GPEs(或地理位置)繪製的圖。看起來“Hollywood”和“Miami”經常出現在遊戲評論中。(是遊戲設置嗎?或者評論者可能是將遊戲中的某些東西描述為Hollywood風格的?)

正如您所看到的,進行命名實體識別和概念識別並不完美,但它可以讓您對正文中討論的主題有一些直覺。

對數值繪製圖表

最後,我們可以嘗試從數據庫繪製數值。讓我們從評論集合中獲取評分值,將它們加起來,然後對它們繪製圖表:

使用MongoDB、Seaborn和Matplotlib分析API數據

上圖是給出的評分的總數的分佈圖,從0到9.9。看起來最常給出的分數是7分和8分,這在直覺上是有道理的。7分通常被認為是10分評價量表的平均值。

結論

收集、存儲、檢索和分析數據是當今世界非常需要的技能,MongoDB是最常用的NoSQL數據庫平臺之一。

知道如何使用NoSQL數據庫以及如何解釋其中的數據將使您能夠執行許多常見的數據分析任務。

英文原文:https://stackabuse.com/analyzing-api-data-with-mongodb-seaborn-and-matplotlib/


分享到:


相關文章: