目录 - W3 Z: v" P6 }; Y) B x! z) ^0 v! K
文章目录 $ ~) M* E. D6 ]* c" o5 [7 i, j8 ^9 {& D3 _0 p2 M$ p$ D
前言 ' |9 K9 x0 t4 k% {& m- G% z 6 s9 l7 k- p5 U( u! u一、数据爬取4 [+ f* S7 p5 q: p
0 a/ }9 W# O1 K ~二、数据预处理: o0 ~' w8 z9 Y, L- n
& r6 M8 k* _8 g6 i- y% S7 q
前言 1 j" `/ Y- i7 T& {9 D本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。0 A2 }. j1 o w/ e. T+ f
/ s7 H* W9 F3 D# W6 t ! T; A& i- a5 F* f, t* q' w一、数据爬取1 i) J" O# a: z( @- d/ C3 k1 Y
import requests8 ~: T5 X" q' ?$ r5 q- H4 m/ I" V' A
import pandas as pd2 W q" M+ g7 n+ W4 g. I
from pprint import pprint # @! k6 H4 }* z4 `( y( {导入相关库: y, m% ?, G8 ]2 b7 ~. s
. o$ }" Z4 k; `& q; G+ z- N% rrequests库用于发起网页请求,获取网页中的源代码;+ P ~& m( k! N
; z6 @) r: r5 {% l* K
pandas库用于存储和读取获取到的信息;: b/ }" L! K7 P. i5 y0 o, ~
4 x( \) @" p& `
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析; # X/ l& j/ Z `# }- G0 ~, n, w& _! @# F* C8 T! G
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'& t& B+ [/ I9 E# p) |7 |& r4 E- m
data1 = requests.get(url).json() * t6 a: e" T- a& E( Y1 g( j) E# pprint(data1); P, _ ~% b* D. Z7 K5 [# ~$ y
; j: q3 S/ E( l& }+ r' _
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。 6 n# x- s4 q. r1 H+ G1 \df1 = pd.DataFrame() 5 T4 P! g: c1 O" e0 Y- d6 bfor info in data1['body']['allMedalData']: w: E4 A# Z7 j9 I- p8 o* S name = info['countryName'] # d: v, T; u! p' [' w, l9 ~. D+ Z name_id = info['countryId'] 7 S9 u- m& e/ N/ i3 ]8 A' I: b rank = info['rank']9 @2 I; u+ X; I" Y! T
gold = info['goldMedalNum'] 8 u3 j, H- W- I6 v silver = info['silverMedalNum'] I; y2 \" w+ S" j
bronze = info['bronzeMedalNum']' A) t( o4 F- O3 u* t5 {4 e
total = info['totalMedalNum'] / p( D" }% M; W# ]2 Q4 f q) w # 组织数据" V* U0 t% p0 U" M7 `* A
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]] : y' Z1 w) R5 ^2 O0 e2 Y6 I # 然后追加df+ V/ w" n& x4 P$ i K% w
df1 = df1.append(orangized_data)- y3 I, |0 v- I- i5 ^
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数'] + \5 ?6 ]% q$ Jdf1; y1 R+ l- J& x- Z
9 t5 D1 }. ^3 F$ i0 C9 M ; F( s+ j, ~4 L3 k' j- t$ F这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。 ' D( k3 h) w. L# }+ D" S9 Xurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609' & A) R! `5 \5 k- \1 V) Hdata2 = requests.get(url).json()7 |2 D1 {, w& G2 c
#pprint(data2) . a2 h. l3 E1 b) H7 W" U9 z4 n8 ]: K6 b2 y. G* P1 Q! o
df2 = pd.DataFrame()* y' z% z+ p9 r& r) z6 j
for info in data2['body']['medalTableDetail']:0 k& P' r5 X* v1 t6 z( t1 N3 s1 x/ J6 ^- Q
english_name = info['countryName']$ h R4 n: c4 n; b. \
name_id = info['countryId']( W# ^% p! t9 J; M
award_time = info['awardTime']) U! q* F1 L3 u: d. z) I& F1 ]% h
item_name = info['bigItemName'] . t1 g7 z" P2 d& U2 { sports_name = info['sportsName'], T( a2 y8 }! F) p7 D- p% _
medal_type = info['medalType'] : b, t3 G' P$ ~ s6 t' A # 组织数据 ! }7 b5 g9 @7 F6 I# R orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]] & s j2 f6 Y+ Q' r# y # 然后追加df Z0 Z4 _8 }, E/ U! |
df2 = df2.append(orangized_data)& X/ x" u$ M* o9 _; A- g& A1 S' ?
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型'] [4 K+ Y" q/ `df2! s) @5 I+ Q' D& A
% E0 \* l2 G0 I! |7 p- c) J
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 * ?2 [5 }' I! H3 w1 ?1 P2 ^4 l3 K4 m9 S7 m% b% s; w- c
6 r- b$ g3 h$ Y9 r2 I: F4 D二、数据预处理; n N. f% h- u% [1 m
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。- a, G4 a7 s4 Y
\) ? t# G+ `, gwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f: * P! k8 E6 n* U( r; g x = f.read() " N9 X/ ]# L5 y$ E& z/ c5 R' { 7 w1 _: r. f" h6 H) Odf3 = pd.DataFrame() , o* ~, j; w) h" W' }% dfor i in x.split("\n"):& F# s) m- [/ B5 |% T7 `
x = i.split(":")[0].strip() ) ]3 I% Z% e, g y = i.split(":")[1].strip() / u1 }% J; b( A) N; O. ~) m orangined_data = [[x,y]]; z& R+ i, `1 E2 x6 c2 t k
df3 = df3.append(orangined_data). `7 J& |/ w* ~- U0 M
df3.columns = ["名称","英文名称"]% R& Q# Z: f H; ]; l
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)1 n/ ?; ?2 z3 |3 s
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。$ T+ O3 t( j3 u" @/ K/ F$ _' h
, \* O% B) J3 h0 kdf4 = pd.merge(df1,df3,on="名称",how="left") " o, o2 M0 ~: |# Idf4.head(10) / @8 i; |& N4 ?* H" G, `; r/ k$ Y0 z5 G: c3 I # n* d' w3 z2 `- @