- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40255 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12788
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
# y7 b% Z4 u. ]5 i! ~0 B6 x
1 I$ q2 \6 g+ l7 [) e& X文章目录
$ X, d0 V4 z' F* p$ \: \. `" ~& c& ?& p* I9 r
前言' I! X6 A$ K# V/ k
) M) `: c. @! S+ M, I* Q一、数据爬取
, ?4 W- G) [# f' B8 d7 o( w/ Z3 ]
( v$ v/ `0 _! Q: P二、数据预处理7 t2 M. Y- H* l5 D( s7 o, A
3 V5 N8 v0 ~) g, d( p. _5 P前言
. E3 C' X. f% i4 Z5 M) ^本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
5 Z G0 L2 R, L) o" M
/ Y8 ~6 S6 n( w9 a# w
5 c$ _) }; { |* h6 ]8 y/ _9 n一、数据爬取: Y# r8 Q1 X7 P/ ^
import requests
; c$ J* `2 N0 ~* T3 g7 i& bimport pandas as pd
% a4 P. B! l% w& Dfrom pprint import pprint
: m2 o* e/ e% \& c! a( W导入相关库5 y# x$ q7 \5 C" x7 }( z1 }( ]
9 w: F) q. R1 F! ?# zrequests库用于发起网页请求,获取网页中的源代码;
. v9 M2 P( I% `2 w# N0 G
6 K9 o$ ?3 O+ gpandas库用于存储和读取获取到的信息;
+ ~" m" q! J. g. A$ N. k# K9 I, I) p" D0 u; F/ d) K7 g
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
" ?- q( r" {0 a% h2 F9 r/ n
! f; d/ `6 C8 k8 Wurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
. U: s; I" X: v* l f% Hdata1 = requests.get(url).json()3 `5 V0 J# K% z0 A. T
# pprint(data1)' O. g( s) E9 g4 e
; V7 d$ _0 ?( |0 o这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。+ m! e9 F% E2 z( T) v5 y
df1 = pd.DataFrame()
5 h* R) S1 [' a/ w% u4 |1 W. efor info in data1['body']['allMedalData']:
; C6 P- D! @" ]& W" v% J" s5 D1 f! t name = info['countryName']6 l) W" X6 y' y$ Z* Y7 ]% H
name_id = info['countryId']
& c1 |1 S c0 J; ?; y& r/ W rank = info['rank']9 A: B* r: O8 A) z) V# K9 u3 B
gold = info['goldMedalNum']
9 G! \$ S2 e- w# H% { silver = info['silverMedalNum']
9 M+ M% X! t) [% @9 _/ l8 Q bronze = info['bronzeMedalNum']
$ V' G) t5 t3 O total = info['totalMedalNum']8 F# z) b& ^1 l! _
# 组织数据
8 F7 E1 {- w. b- [6 `5 s" O# u orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
: k+ a, o2 U+ l/ z) ^ # 然后追加df
1 x6 s9 U/ V. ]8 P5 G# R) j df1 = df1.append(orangized_data)
6 n7 L/ B. ?* C9 z7 ~df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
2 t7 J2 a1 @, H1 A* \9 S+ Zdf19 j. j- ^( f% `, [8 e! b
3 w9 [' Z* P& L) r6 h' b
![]()
- x/ q" M4 A' Z( k7 [3 b. a( s; D这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
9 }1 D, o. r% Z! q+ m- x5 rurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
) B" ~( u/ C+ ^1 E+ rdata2 = requests.get(url).json()
: P9 }7 `7 R9 e: u- i, k- Y+ |3 o. _#pprint(data2)1 F/ C; D0 J# l. `% V
: s* Y' P; }1 u7 a, s% Q
df2 = pd.DataFrame()
1 }0 j( N0 j8 ?5 `* F2 O6 ^. I rfor info in data2['body']['medalTableDetail']:
. q. O; S, p2 N l# Y english_name = info['countryName']
6 |6 }4 D: n- Y% j/ s& _* `& R& v name_id = info['countryId']6 t. N3 X4 j+ @: f/ U: `; D
award_time = info['awardTime']
/ v6 f7 w) Z0 \ item_name = info['bigItemName']
9 v5 g4 Y7 n" [# ~/ w1 A7 I sports_name = info['sportsName']
" ]7 N' y6 l |' R3 R medal_type = info['medalType']4 f- o* z4 `9 e6 ^' C9 o' h4 W
# 组织数据
! P4 B, |( h, q; Y% l# O orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]9 o9 X; H1 D. V! J- o5 c: W# r4 \) I
# 然后追加df
- g6 c1 a( R& P: i/ x4 ]3 } df2 = df2.append(orangized_data)
y; `2 Q; ^- q. V Y" Odf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']4 m3 p& E6 i. E( O: \
df2 ' m$ X" Y) Z6 l+ ]! z
, c' h8 {0 s ^7 Z4 j! |对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
! d+ d% G* d2 j6 X2 H- x* g& m" b: h
- C; Q7 s+ z1 M" {* x3 N) c7 G( W1 ^; u
二、数据预处理- ^. Q* v& W. D& q- \; y
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
: O, j6 T( R3 L
, v/ E- T( @1 Z3 W# O, Twith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
) c1 p% b0 Z! V8 S x = f.read()% d0 q6 x! s- p, B: A+ Y9 S
. ^% G& x' ^% {, A% e3 Fdf3 = pd.DataFrame()9 Z% z" R/ u( p) J( N/ ~
for i in x.split("\n"):
+ ^; M& l: z% \+ t' A x = i.split(":")[0].strip()0 y, v7 S: j+ t4 g: i2 f7 S
y = i.split(":")[1].strip()' _: n7 L2 Z. m$ @8 m
orangined_data = [[x,y]]/ v% C! V+ R! `
df3 = df3.append(orangined_data)
! R1 E0 v5 M7 y( Z cdf3.columns = ["名称","英文名称"]' W" ?; n" P) W6 U
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
" ^# p" ?# V8 i; d( l @1 N表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。0 z; y [% a, x3 O- O
/ O4 } |& K9 J
df4 = pd.merge(df1,df3,on="名称",how="left")
2 F4 x1 i4 l4 v/ Gdf4.head(10)
- i4 C9 W4 Q& g, W# [: E' W8 {. _6 ^& R& s/ O8 m
![]()
8 x7 K- H. I0 ?) w8 e$ v3 W表格df5表示运动项目获奖详情。
! o8 ~" H6 [# A8 I' ?$ P; `! C$ {; Q: w
7 I. j4 L7 ^6 ]' H 7 D. G$ U: W5 W, s X: R* |
! d, f8 P$ z- b/ P: Y, P |
zan
|