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