- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40207 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12773
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
" Q2 ^: g1 p& w) d
7 R( }" s* G6 m' p6 ?( C5 w文章目录
( n' o( J+ e* a" B% s( s% B0 A# |$ L6 Y- s$ f
前言
$ W: N( I# L7 E& T% k7 _: A
8 h2 }2 F3 S- N: \* h# {一、数据爬取, h5 O/ L# p5 ?& i% G( i6 H
$ h% | ` {6 V二、数据预处理2 B a' x8 B5 D/ e
) @/ [$ _ G R! ?1 O; T
前言
- D; q) O6 A5 a/ V& g$ l本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
, ^( z; z( s* v2 r; V9 w. ? x0 }8 D+ ?) D( e3 S9 n& F. g7 ]
& c8 `% A0 w0 N1 T" X! s
一、数据爬取
3 e4 |* t' {% }3 f. s! `, v) zimport requests
' g1 |/ S4 O2 ?0 T# Rimport pandas as pd
# ?+ T3 E5 D1 G1 |; Ffrom pprint import pprint
( }! @. J2 X, ~导入相关库
. y6 {' y2 Y% `: y4 F% [* F' s& c& u6 @* Q! L- g
requests库用于发起网页请求,获取网页中的源代码;# V& V0 b! @( L% |5 _/ Y4 t
( ^3 m" j& u+ C' [
pandas库用于存储和读取获取到的信息;5 |0 o4 n" f! d& |
1 t" x3 [0 X$ t5 ypprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
" W9 x. j. L1 C
4 T6 @, M. h( ?url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'1 Q2 D* m$ M" N3 v3 _* W8 g
data1 = requests.get(url).json()
: C9 a& c5 W! e* m, I' s) i2 R# pprint(data1) Y4 T9 p6 e# |' M) F
+ S. \1 |! m8 |6 u( P! L8 o$ n
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。3 [* [' _# O K% ?$ U
df1 = pd.DataFrame()8 _1 g: {* ~7 a3 a- w" z# g
for info in data1['body']['allMedalData']:0 ^! Z" W' \- E
name = info['countryName']
6 p9 e" M' k/ W, e) x& [! v6 t* F9 r name_id = info['countryId']. d8 X) b- n- x, [2 j. p
rank = info['rank']
& l/ b Q; \7 ?' G: ]5 `; U7 Q gold = info['goldMedalNum']
( o/ X( C' b3 O' V2 a- G/ S/ `% J silver = info['silverMedalNum']0 L' Z+ l; z/ X# S: v E
bronze = info['bronzeMedalNum']
- e7 P/ c8 Z' h9 O* t; H total = info['totalMedalNum']
3 u! s" a B* J% d" Z2 P& O" U# q9 H" \ # 组织数据' d/ s1 w! S! Z) ]5 H, O2 I3 X. H, @
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]' m- z; q4 C2 z, e+ G
# 然后追加df. S) v# b6 w8 d6 d- R3 w
df1 = df1.append(orangized_data)
) l( ~; o9 ]5 f$ A- ^/ hdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']# G5 ~, l8 o$ E( l F
df12 | l6 x: I) A" B4 Y/ r4 }
, K# d! G3 d1 S1 A
( m# Y! h- s7 |& U
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。& N6 p% \) w3 L' V& p
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
6 a% n& m3 r' v ~data2 = requests.get(url).json()
( c! `/ F9 E/ J8 C#pprint(data2)) Y" j, I, K; K4 N% Z3 o
& ^; h2 o5 C9 e+ d9 B+ F8 p2 adf2 = pd.DataFrame()
* M- z5 }( ~% L/ j& q3 Gfor info in data2['body']['medalTableDetail']:
2 g! v% Q3 q- H& I english_name = info['countryName']
6 D8 ^. B2 q9 S. q; t% q$ { name_id = info['countryId']5 k$ P4 I- b* a' r8 N
award_time = info['awardTime']' A4 F/ r" p! J y: E
item_name = info['bigItemName']1 v" q0 b4 g, g, L- ?3 t
sports_name = info['sportsName']
& J& B6 Z) D( q. K' b medal_type = info['medalType']
a3 Y9 P4 Z, |, o* t # 组织数据" A1 P7 F" k2 o* I7 T% Z
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]: [# O+ Q+ y* R, h$ V
# 然后追加df6 w9 |; Z/ Y/ y* @
df2 = df2.append(orangized_data)
% ^" b) P4 C; Jdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
+ v6 q( e4 |1 t9 q9 N4 `# ^df2 M5 e2 f D% ]$ b
k7 G5 ?0 V/ G u% E对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
3 k$ S% O+ X5 y' W' g4 m* i/ @: A5 W9 s" b! v% s- ~+ H+ ~6 v
+ X4 [1 j3 r9 a
二、数据预处理 h' O l% j/ o9 p
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
0 J6 _! K" o* U9 `9 M- `/ ?/ u
+ H8 S- N9 |+ M3 A. D4 C6 [5 E# Uwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:/ I- s) n# ? w2 E2 K0 u
x = f.read()
1 N! w' Q2 @0 I% [! M1 s) r. P$ j0 ?: G @# L7 K
df3 = pd.DataFrame()
& ?: ?2 o8 F) \$ c. afor i in x.split("\n"):' ]. N& f! v7 M% p
x = i.split(":")[0].strip()
% f, w) \" X O& b, E y = i.split(":")[1].strip()6 F# k, L% C, x/ _7 t9 u! H
orangined_data = [[x,y]]1 W3 ~, T* q- _ B0 m+ w
df3 = df3.append(orangined_data)8 _$ h1 P4 }$ g2 R3 H) ^3 U8 Y
df3.columns = ["名称","英文名称"]3 D% R' H. m. O. B E
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)/ Q# l4 y# L! j$ x [4 n
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。% `3 w2 l6 ^; O! f9 z% A
- |, v5 z9 X0 Z' c3 Edf4 = pd.merge(df1,df3,on="名称",how="left")2 i# g( K& v& x/ P9 Y3 G, t) J- Q
df4.head(10): g a" B" i! d1 W: j. u
7 G1 @- [3 W. z& |) {2 G+ \% } 6 u' g4 m( t+ x; |
表格df5表示运动项目获奖详情。 - . Q7 Y# ^- R2 M1 u7 b2 F) @1 |
+ p! `% ?2 ]2 R! W: K g* K& f$ F( P1 {" M' T z2 u( [
1 s2 D. Q# J8 [
3 u; h; k2 `' e9 r |
zan
|