- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40307 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12803
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录! q" @4 P& ]. x" _) T- x- U
0 Y% D$ g5 L8 _# Y: M9 \
文章目录' H0 F6 }/ }1 r. U+ a7 `; ^
% e$ X% a* e: M- R8 d
前言9 y. E4 u$ T, W+ h- N# J
$ o& C' ^7 P: l& U一、数据爬取+ c" O4 `. q `- P/ K8 ^
7 l& R6 Z+ H! ]$ W: z% r5 ^$ w; e二、数据预处理
. V# e2 a6 U: _" a& _0 I
: b( K5 l& ~+ K V1 E& J w, t前言2 y; r( p3 U' i9 [# n& n; f, G
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。9 |, d5 Z8 c6 ]) ~8 z/ ^, K
" L8 }+ T. I1 j* m! d8 J7 C6 Z
+ ~$ f% c3 F2 {* `% O8 ]5 D" F一、数据爬取
4 Q# W. Z0 s, P0 eimport requests
2 D) t8 ^9 s4 zimport pandas as pd/ u m0 L5 z8 C5 d; P
from pprint import pprint
; p& C) x+ D! `1 T4 a1 c% Q导入相关库0 t! B" b) d3 y( P4 F
e3 \9 h# M" g9 Krequests库用于发起网页请求,获取网页中的源代码;. w, d/ m# g) u- R# c
$ Y' J( k. y4 C- y6 epandas库用于存储和读取获取到的信息;2 i; x3 ~$ l0 x, S( l* O9 V
8 J. F) x- N( Dpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
- _* U9 z0 p0 E! l, E$ d) k5 O; b( s5 C/ p: F3 h3 F! K
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'% q1 ]* r3 K* A3 I7 c! n
data1 = requests.get(url).json()
& [3 Q& p: ]/ y& E, E/ [' s- s# pprint(data1)0 X/ z5 Q5 n- r2 T- p! C3 A
" a6 W4 S( k/ u8 W1 J这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。: a: T+ y8 B( `7 m/ u) G( ?! K3 o
df1 = pd.DataFrame()& T% `. D C8 M0 X
for info in data1['body']['allMedalData']:7 G/ W$ w6 P3 R4 {. x7 _
name = info['countryName']9 P2 o( k; D/ W6 |0 s) P; {
name_id = info['countryId']
3 t: r* `8 C2 h7 b rank = info['rank']1 T! n$ r/ Z) \# K: H( E, J* Y
gold = info['goldMedalNum']
, O0 W J% F# ~8 T; F6 Y# c silver = info['silverMedalNum']
9 x4 Q# U m/ l: A1 q$ r bronze = info['bronzeMedalNum']0 i: I8 C/ n4 x9 C, A4 d: [
total = info['totalMedalNum'], A5 W+ j1 [3 h) M4 j
# 组织数据3 }" ?9 Z/ I( |9 T
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
/ r! }: H1 }0 p # 然后追加df
$ K4 f( R! B3 p f df1 = df1.append(orangized_data)) H0 x% h' N; T7 s- G4 v4 ?
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
. [ [8 p @3 _7 J: G$ Udf12 S$ n% { L7 u0 i; J
3 H) `, L" v( Z0 [; ~. G* y
![]()
; m8 q+ M2 [& r1 C4 [9 H; J这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。. o! H' a8 o% x1 a' Q! p
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
2 _' p: ^3 R5 |data2 = requests.get(url).json()
( l1 ^, j* N0 V+ d: @3 e#pprint(data2)) x7 K I/ o; C$ O7 t y7 d
8 U) _/ {$ q& A* w: K
df2 = pd.DataFrame(); Y4 x7 O& j5 } k
for info in data2['body']['medalTableDetail']:
- z' o' w+ s+ s english_name = info['countryName']
$ \7 T! A0 r6 P y- l. ` name_id = info['countryId']
4 P* l( \" g7 d award_time = info['awardTime']) t/ B! M# C8 u; r- y
item_name = info['bigItemName']
5 C5 o5 r: }- m+ o' g3 ~ sports_name = info['sportsName']2 G& U3 W. }% B
medal_type = info['medalType']
% J, o% ^) E( m # 组织数据$ R; p% t& m8 m9 n
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]6 U. H/ w7 O; O- Q
# 然后追加df5 o7 K! }5 Q; q* g3 l0 O7 V
df2 = df2.append(orangized_data)/ p4 [; T6 V0 V
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']" p: X) }7 Z4 m; g5 [5 ~
df2![]()
; u B' t, t% P5 j- s6 k' ?+ T( @& b1 G: D: j) P
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 ; j7 i( i) L5 c5 {* [2 L# K
- X, [ r6 Q0 r
$ {+ t7 H3 m. q) \$ `6 H二、数据预处理
5 ]1 G9 z. h( C. U# W4 q) Q由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
" @! e; s3 J0 Y7 S( B1 d
( `# q3 Y1 H: k! ~0 Y% ?9 kwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
( j. x6 z4 G) G4 O; a+ H5 {4 D x = f.read()
2 L! c, B& m c/ U* S) d
+ B8 M/ B8 m1 ]8 r+ H3 Edf3 = pd.DataFrame()
/ D( o0 y; X- {' hfor i in x.split("\n"):
$ x9 h6 x! ~7 V( X. k1 d x = i.split(":")[0].strip()
5 F/ Y! q8 r, j- p! N+ A& }4 x y = i.split(":")[1].strip()
7 E: \* L' V1 M orangined_data = [[x,y]]6 b' u( x, C) r" t# q* _
df3 = df3.append(orangined_data)
2 W g' c2 G3 k& h7 ddf3.columns = ["名称","英文名称"]% }+ I, ~( h+ _% i" l
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)8 X6 h3 U/ c7 G; t7 l0 ~5 f" T
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
& |0 Z. K) ^- K B: n$ e6 s2 T) }, J4 ~& ^8 j. J
df4 = pd.merge(df1,df3,on="名称",how="left")- S9 a" X" }1 R' m; S
df4.head(10) R- `* t+ ~7 [
% W# @/ C, Y4 _4 _( F: X 5 l. d% ]9 U( A* a4 ?0 f
表格df5表示运动项目获奖详情。
$ |. S( L2 Z) ?9 R+ T1 _& C3 e% ?7 q: Q: ]' N- j" |
0 ~0 K1 T& J3 _4 |
8 m! a& j0 Q% a# A, W" ~
3 ?* F- o; W' E2 g- } |
zan
|