經常有小伙伴問,如何制作數據可視化大屏?
今天將手把手帶你爬取奧運會相關信息,并利用可視化大屏為你展示奧運詳情。讓一個沒關注過奧運會的朋友,也能夠秒懂奧運會。
1、項目背景
奧運會剛剛過去,你是否已經看過2020東京奧運會呢?
2、奧運會相關信息爬取
- 爬取字段: 國家、國家ID、排名、金牌數、銀牌數、銅牌數、獎牌總數、項目名、運動員、獲獎類型、獲獎時間;
- 爬取說明: 基于兩個接口的數據爬取【json格式的數據】,直接采用鍵值對的方式獲取相關數據;
- 使用工具: Pandas+requests
本文是基于兩個接口
的數據爬取,相對容易的多。
#這個鏈接主要展示:各國的金銀銅牌及其總數!
https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609
#這個鏈接主要展示:每個參賽隊員的參賽項目和獲得的獎牌情況!
https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609
① 導入相關庫
importrequests
importpandasaspd
frompprintimportpprint
requests
庫用于發起網頁請求,獲取網頁中的源代碼;
pandas
庫用于存儲和讀取獲取到的信息;
pprint
庫是漂亮的打印,對于json格式的數據,能夠很好的展示結構,方便我們解析;
② 爬蟲講解
url='https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
data=requests.get(url).json()
pprint(data)
三行代碼就可以獲取到網頁的源代碼,利用pprint
庫,可以清晰的展示json結構,對于我們解析數據很有幫助。
我們要的數據,都存在于body
鍵下面的allMedalData
鍵中,allMedalData鍵的值是一個列表,里面有很多字典組成的鍵值對信息,就是我們要爬取的數據。
直接利用鍵獲取對應的值信息,代碼如下:
df1=pd.DataFrame()
forinfoindata1['body']['allMedalData']:
name=info['countryName']
name_id=info['countryId']
rank=info['rank']
gold=info['goldMedalNum']
silver=info['silverMedalNum']
bronze=info['bronzeMedalNum']
total=info['totalMedalNum']
#組織數據
orangized_data=[[name,name_id,rank,gold,silver,bronze,total]]
#然后追加df
df1=df1.append(orangized_data)
df1.columns=['名稱','ID','排名','金牌','銀牌','銅牌','獎牌總數']
df1
對于另外一個網頁,我們采取同樣的方式。
url='https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
data2=requests.get(url).json()
pprint(data2)
是不是此時感覺結構更清楚了?
df2=pd.DataFrame()
forinfoindata2['body']['medalTableDetail']:
english_name=info['countryName']
name_id=info['countryId']
award_time=info['awardTime']
item_name=info['bigItemName']
sports_name=info['sportsName']
medal_type=info['medalType']
#組織數據
orangized_data=[[english_name,name_id,award_time,item_name,sports_name,medal_type]]
#然后追加df
df2=df2.append(orangized_data)
df2.columns=['英文縮寫','ID','獲獎時間','項目名','運動員','金牌類型']
df2
3、數據預處理
對于爬取到的數據,往往是有問題的,我們需要提前預處理一下,方便后續做可視化展示。
① 數據拼接
對我們共有三個表格,分別存儲著不同的信息。我們需要對其進行合適的拼接,方便最后可視化。
表格df1表示各國獎牌數,數據是這樣的:
表格df3表示國家名中英文對照表,數據是這樣的:
利用上述兩張表,我們可以左連接,將英文名稱添加到df1表上。
df4=pd.merge(df1,df3,on="名稱",how="left")
df4.head(10)
最終效果如下:
表格df5表示運動項目獲獎詳情,數據是這樣的:
此時,我們又可以將df4和df5做一個左連接,將這兩張表合成一張大表,就可以得到不同國家不同項目獲得的獎牌數。
df6=pd.merge(df4,df5,on="名稱",how="left")
df6.head(10)
② 關于金牌類型的說明
上面得到的表df6,其實還不是最后的表,因為上述表中金牌類型是數字1、2、3,但是我們需要的是金牌、銀牌、銅牌。因此,我們自己再定義一個df7。
x={"獲獎名次":["金牌","銀牌","銅牌"],"金牌類型":[1,2,3]}
df7=pd.DataFrame(x)
df7
效果如下:
因此,我們拿df6與自己構造得到的df7再做一個左連接,就可以的到最后完整的表了。
df8=pd.merge(df6,df7,on="名稱",how="left")
df8.head(10)
③ 中英文名映射轉換
由于使用pyecharts繪制世界地圖時,名稱必須是英文的,所以我們需要將這里的中文名稱
映射為英文名稱
。于是我在網上找到了下面這個文件:
我們要做的就是將它與表格中的數據,做個映射轉換
。先把它轉換為一個Excel文件吧,方便我們以后直接使用。
withopen("國家名中英文對照表.txt","r",encoding="utf-8")asf:
x=f.read()
df3=pd.DataFrame()
foriinx.split("
"):
x=i.split(":")[0].strip()
y=i.split(":")[1].strip()
orangined_data=[[x,y]]
df3=df3.append(orangined_data)
df3.columns=["名稱","英文名稱"]
df3.to_excel("國家名中英文對照表.xlsx",index=None)
然后,在和上述的df2表格做一個左連接
即可。
df4=pd.merge(df2,df3,on="名稱",how="left")
df4
結果如下:
4、可視化展示
關于可視化部分,使用的是pyecharts
庫。這部分一共分以下8個主題:
- ① 2020東京奧運會各國獎牌分布圖;
- ② 2020東京奧運會獎牌榜詳情;
- ③ 2020東京奧運會獎牌榜總數前十名;
- ④ 2020東京奧運會金牌榜總數前十名;
- ⑤ 2020東京奧運會中國各項目獲獎詳情;
- ⑥ 中國選手每日獲得獎牌數;
- ⑦ 中國選手每日獲得金牌數;
- ⑧ 中國選手奪金詳細數據;
說明: 這里就不做結果分析了,因為通過上圖,相信大家應該能夠很清晰的了解到2020東京奧運會,哪怕你沒看過。
責任編輯:haq-
可視化
+關注
關注
1文章
1194瀏覽量
20936 -
python
+關注
關注
56文章
4793瀏覽量
84634
原文標題:用 Python 制作可視化大屏,特簡單!
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論