猜猜看,下麵這一組調查對象是什麼? 為什麼會這樣呢? 因為我在佈置作業的時候,很貼心地給了一個樣例,是我之前寫的一篇教程《 如何用R和API免費獲取Web數據? 》。 於是,多組作業,都雷同。 講到這裡,他們一副不好意思的表情。 我卻發覺,這裡蘊藏著一個問題。 幾乎所有國內雲市場的 API 產品,都 ...
猜猜看,下麵這一組調查對象是什麼?
為什麼會這樣呢?
因為我在佈置作業的時候,很貼心地給了一個樣例,是我之前寫的一篇教程《 如何用R和API免費獲取Web數據? 》。
於是,多組作業,都雷同。
講到這裡,他們一副不好意思的表情。
我卻發覺,這裡蘊藏著一個問題。
幾乎所有國內雲市場的 API 產品,都有豐富的文檔。不少還乾脆給出了各種編程語言對應調用代碼。
這是一款收費 API ,100次調用的價格為1分錢。
作為作業練習,100次調用已經足夠了。
這價格,他們表示可以接受。
我自己走了一遍流程。
點擊“立即購買”按鈕。
你會被引領到付費頁面。如果你沒有登錄,可以根據提示用淘寶賬號登錄。
支付1分錢以後,你會看到如下的成功提示。
之後,系統會提示給你一些非常重要的信息。
如果你的操作系統裡面已經安裝了 curl (沒有安裝的話,可以點擊這個鏈接,尋找對應的操作系統版本下載安裝),嘗試把上圖中 curl 開頭的那一行代碼拷貝下來,複製到文本編輯器裡面。
就像這樣:
curl -i -k --get --include 'https://ali-weather.showapi.com/weatherhistory?area=%E4%B8%BD%E6%B1%9F&areaid=101291401&month=201601' -H 'Authorization:APPCODE 你自己的AppCode'
然後,一定要把其中的“你自己的AppCode”這個字元串,替換為你真實的 AppCode 。
把替換好的語句複製粘貼到終端視窗裡面運行。
運行結果,如下圖所示:
看見視窗下方包含中文的數據了嗎?
利用 API 獲取數據,就是這麼簡單。
上圖中,除了剛纔我們使用的 curl ,還包括以下語言訪問 API 介面的樣例說明:
-
Java
-
C#
-
PHP
-
Python
-
Object C
我們以 Python 作為例子,點開標簽頁看看。
你只需要把樣例代碼全部拷貝下來,用文本編輯器保存為“.py”為擴展名的 Python 腳本文件,例如 demo.py 。
為什麼許多學生做不出來結果呢?
我讓他們實際跑了一下,發現確實有的學生粗心大意,忘了替換自己的 AppCode 。
但是大部分同學,由於安裝最新版本的 Anaconda (Python 3.6版),都遇到了下麵的問題:
你可能會認為這是因為沒有正確安裝 urllib2 模塊,於是執行
pip install urllib2
你可能會看到下麵的報錯提示:
在他們看來,官方網站提供的樣例,就應該是可以運行的。報了錯,又不能通過自己的軟體包安裝“三板斧”來解決,就會慌亂和焦慮。
更進一步,他們也不太瞭解 JSON 格式。
雖然,JSON已是一種非常清晰的、人機皆可通讀的數據存儲方式了。
他們想瞭解的,是怎麼把問題遷移到自己能夠解決的範圍內。
環境
首先我們來看看代碼運行環境。
前面提到過,如果樣例代碼的運行環境,和你本地的運行 環境不一 ,計時代碼本身沒問題,也無法正常執行 。
這個界面來自 Jupyter Lab。
圖中左側分欄,是工作目錄下的全部文件。
右側打開的,是咱們要使用的ipynb文件。
根據我的講解,請你逐條執行,並仔細觀察運行結果。
本例中,我們主要會用到以下兩個新的軟體包。
首先是號稱“給人用”(for humans)的HTTP工具包requests。
代碼
首先,讀入HTTP工具包requests。
import requests
第二句裡面,有“Your AppCode here”字樣,請把它替換為你自己的AppCode,否則下麵運行會報錯。
appcode = 'Your AppCode here'
我們嘗試獲取麗江5月份的天氣信息。
在API信息頁面上,有城市和代碼對應的表格。
位置比較隱蔽,在公司簡介的上方。
看來我們需要在HTTP數據頭(header)中,加入 AppCode。
我們依次把這些信息都寫好。
url = 'https://ali-weather.showapi.com/weatherhistory'payload = {'areaid': areaid, 'month': month}headers = {'Authorization': 'APPCODE {}'.format(appcode)}
下麵,我們就該用 requests 包來工作了。
requests 的語法非常簡潔,只需要指定4樣內容:
-
調用方法為“GET”
-
訪問地址 url
既然調用成功,我們看看 API 介面返回的具體數據內容吧。
調用返回值的 content 屬性:
r.content
這一屏幕,密密麻麻的。
其中許多字元,甚至都不能正常顯示。這可怎麼好?
沒關係,從 API 信息頁上,我們得知返回的數據,是 JSON 格式。
返回的是一個列表。
因為列表裡面只有一個城市,所以我們只讓它返回第一項即可。
dfs[0]
這次顯示的,就是數據框了:
假設我們要綜合分析幾個城市的天氣信息,那麼就可以把這幾個數據框整合在一起。
用到的方法,是 Pandas 內置的 concat
函數。
它接收一個數據框列表,把其中每一個個數據框沿著縱軸(預設)連接在一起。
df = pd.concat(dfs)
看看此時的總數據框效果:
df
這是開頭部分:
這是結尾部分:
3個城市,4個多月的數據都正確讀取和整合了。
下麵我們嘗試做分析。
這次就對了,日期和 AQI 都分別變成了我們需要的類型。其他數據,暫時保持原樣。
有的是因為本來就該是字元串,例如城市名稱。
另一些,是因為我們暫時不會用到。
下麵我們繪製一個簡單的時間序列對比圖形。
讀入繪圖工具包 plotnine 。
註意我們同時讀入了 date_breaks
,用來指定圖形繪製時,時間標註的間隔。
我們指定橫軸為時間序列,縱軸為 AQI,用不同顏色的線來區分城市。
繪製時間的時候,以“2周”作為間隔周期,標註時間上的數據統計量信息。
我們修改橫軸的標記為中文的“日期”。
因為時間顯示起來比較長,如果按照預設樣式,會堆疊在一起,不好看,所以我們讓它旋轉45度角,這樣避免重疊,一目瞭然。
為了讓圖中的中文正常顯示,我們需要指定中文字體,這裡我們選擇的是開源的“文泉驛微米黑”。
數據可視化結果,如下圖所示。
怎麼樣,這張對比圖,繪製得還像模像樣吧?
從圖中,你可以分析出什麼結果呢?
反正我看完這張圖, 很想去麗江 。
當然,要是能給我的repo加一顆星,就更好了。
討論
你之前嘗試過用 Python 和 API 獲取數據嗎?你使用了哪些更好用的軟體包進行數據獲取、處理、分析與可視化呢?你還使用過哪些其他的數據產品市場?歡迎留言,把你的經驗和思考分享給大家,我們一起交流討論。
轉載於:玉樹芝蘭”(nkwangshuyi) 。
歡迎關註我的博客:https://home.cnblogs.com/u/Python1234/
歡迎加入千人交流答疑群:125240963