- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40092 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12739
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录" v* B- o7 z" ?1 H' C, B D
) G5 b% E( [0 q文章目录6 V6 e, @# o9 W5 P
2 t' I3 Q* V1 m" {2 J6 K* L
前言
5 `4 y# k2 c) ^
( r7 c0 b6 M4 S! ?5 P- R一、数据爬取- T1 G& W* r) e) ?
) a5 R; x+ b# K. K8 R! P0 f% Q二、数据预处理+ Y1 h+ t% N4 y5 b0 W
6 U7 d; K8 V4 \% o. C
前言
- D. l3 A; k0 j本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
( e/ e w( _& F+ o: N1 S+ }9 G- c. t" i+ E9 e& m6 J# z
; N6 _5 }; E' u一、数据爬取
) [0 ?3 C, u) J: q7 Cimport requests
7 T R+ Y; B- \4 o( Y6 S4 Z, o- A7 r) R5 cimport pandas as pd
% c X6 W5 S+ I) f% P+ Ffrom pprint import pprint; {9 M7 L' l. X
导入相关库9 V* R. d! }3 O; i4 \# Y
2 ~$ Z! i5 k2 d7 }: e
requests库用于发起网页请求,获取网页中的源代码;
# N( k+ V$ y& a9 d( B, a( S: u
. F( T, y7 M: v* y6 \+ C* @! Kpandas库用于存储和读取获取到的信息;
/ x7 T! J g2 E* G( A T1 p( O6 [* Q" m) u( Y5 A7 ]
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
2 A/ [3 h: w6 u
0 E9 A( }! z0 m0 ]% \% V6 r4 Rurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
0 b+ w. [! h2 m+ Idata1 = requests.get(url).json()
7 x1 F/ l, |5 V7 |9 e: N8 j+ [# pprint(data1)6 _# }7 a6 p& C6 _
+ C. f; P% Z) f6 X ^这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。/ z% I; q9 o: p
df1 = pd.DataFrame()8 J5 t/ N8 E: x/ ]: M+ l# L
for info in data1['body']['allMedalData']:- w0 k, A3 ^/ j0 T
name = info['countryName']
1 c. b5 s' i8 x. u5 ~' l8 V- i8 B* E name_id = info['countryId']
9 o& q* Z4 X4 Q9 d6 T rank = info['rank']! i$ P9 H# b, U, O4 o
gold = info['goldMedalNum']
7 a4 ^% u+ a3 r5 P8 x, j- R1 ^ silver = info['silverMedalNum']
' }9 M e: e) J/ W6 I3 |& L5 k R bronze = info['bronzeMedalNum']
, n" d- ^: r: Q3 Q8 J. T- {0 b/ E total = info['totalMedalNum'] E- f7 f7 x4 c: Q. z
# 组织数据
( L; C. E9 |1 } orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
, r! A2 _# f/ k) K # 然后追加df7 u% e, [- o" i! p2 s$ L" ^3 ~
df1 = df1.append(orangized_data)( N5 \) ?4 `1 U/ e& g' U% q$ }
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
8 _7 [" B" x1 G1 Y! h" E9 Q" Ndf1+ I& {$ n7 t4 W/ @
/ F" r" Q1 T* P3 c# H 2 H$ q3 n2 e* T
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。, ]3 r1 x' I6 D+ k7 F/ F& W
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
5 K6 r4 q2 U {! u; U# _data2 = requests.get(url).json()- W- j2 j1 o8 f9 d6 e/ M
#pprint(data2)
S K$ U/ [# t( |" T3 o: J4 q+ ^6 l0 f* \. N
df2 = pd.DataFrame()! [: m* m' R( ^* D8 [% B @
for info in data2['body']['medalTableDetail']:- f2 V( I. q. r9 H
english_name = info['countryName']
6 k2 `& Z" ]. a2 G" y$ ]% \4 @ name_id = info['countryId']% _, G. n K* m5 B0 ?
award_time = info['awardTime']
F3 w: i9 e" I item_name = info['bigItemName']
. z1 ~0 }; ]5 [9 q: i9 B+ y" @, w( j sports_name = info['sportsName']) N2 b! ^- p9 A/ M# @
medal_type = info['medalType'] F0 ^) Q& z9 C! y
# 组织数据
! M; c8 X8 w( O2 m( x' @ orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
2 l, a+ L6 Y6 g # 然后追加df& r+ E- l' u+ `3 r7 d2 P, A
df2 = df2.append(orangized_data)
# r3 \* H/ s W9 N) [df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']: ^' t9 C" S6 ~3 U9 j6 f1 H! f
df2![]()
' L( ]9 R) e. J2 _, R7 E5 u5 d7 q5 V* t% D
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
7 m0 y, K: g$ H1 ?( q6 S) w
/ {$ y, q2 |! q N: Y/ R( W
- d# s/ A9 ^% ~二、数据预处理# N/ a+ c" I$ O. @# U* E
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。. y/ a+ s* g/ m& k! }
4 g! a/ M5 t7 h4 p" ]$ E
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
( }! A4 H2 R8 p- I8 a/ } x = f.read()3 V, {$ Q* j( C* a, R
) t9 k; u' K' |# [) D8 J& t7 Qdf3 = pd.DataFrame()3 U2 X9 A7 D. B5 ?
for i in x.split("\n"):4 M+ k& h5 {% d/ }$ M
x = i.split(":")[0].strip()
2 }, T# l& D0 M% z% p8 _ y = i.split(":")[1].strip()
& _, z/ ^8 @+ z! d2 p orangined_data = [[x,y]]
4 }* D& \, h8 f# c9 o0 i df3 = df3.append(orangined_data)
7 C% S/ ?& m/ G) f! y2 w' \6 Z0 i- Ydf3.columns = ["名称","英文名称"]
" R7 D! z0 V/ g. Mdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)) z: a& p1 Y6 ~) ~4 \% C" H$ a
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
7 Q" d, x* r ~& R9 H4 F
1 B/ G: R. D3 ?8 l: Vdf4 = pd.merge(df1,df3,on="名称",how="left")
1 d- P" v: Y9 g0 r' Ndf4.head(10)
/ F) W6 I+ |2 ?& T r& ]5 W
3 J/ w* q- v7 V @: W4 |![]()
! s6 @% w! A$ t3 b表格df5表示运动项目获奖详情。 - : U6 J9 d7 X5 t: W: K" T
2 v: X5 h& J/ Z+ D
0 U( l' y3 a3 Y$ t: V) [
5 c+ s$ D- i/ r' x( \
l, d2 X. |3 c+ d3 e/ k6 K |
zan
|