- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40292 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12799
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
- C8 g- ?) [: z0 N I
; `! h1 W, c9 s+ P文章目录, [$ o* Q9 y7 q- i
+ G, m% ]9 @( r* S9 M4 C- i9 L! D
前言
# ^8 ~5 n& m* |( H
. p E6 G; P1 z6 r P! T! t) T- h一、数据爬取
/ z" J) [& ]4 [2 p+ E/ [, `1 ]. N3 _$ L. \
二、数据预处理7 _6 x: ?& ^' I9 v6 a4 M) L$ {
; c, e" M) c1 {$ y+ i) M前言
( V# i2 G' d2 \8 j9 _9 w, J1 V$ ]$ m; b本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
7 p: O5 f5 V& u/ G& R5 g; ]8 f2 y$ M! F( ], q& O D4 e8 Y
5 e: X, @" y$ n) D' K
一、数据爬取
: v# H' {* U, k5 ^$ Y0 A/ H1 g5 ?- |import requests1 l# v8 O! D# W8 K
import pandas as pd. L8 d8 v1 `. G" d8 H
from pprint import pprint
9 H* B. l. Z: k导入相关库& t L! D* _" @2 v+ U
1 N" Y: G, X" ]: @4 ?requests库用于发起网页请求,获取网页中的源代码;
8 O) x* f/ e& Y1 w! O& h% o! Q" Q; t0 G4 F4 o) k" S# N7 O* x
pandas库用于存储和读取获取到的信息;& \, Z5 [( q! O5 E/ S5 d( r
7 F9 f; i, m1 H' ^2 x8 dpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
- h* |2 _* u. q' o
1 x8 b* T( {! Y/ `5 |; F9 o3 j- Turl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
9 M9 }! w/ B+ Z: V edata1 = requests.get(url).json()
' w3 Y8 X, F/ o$ q+ E8 _& K6 R# pprint(data1)# f' F# w; G( r5 I7 |; M
, r+ O$ t. n2 _$ `8 y( R' k: \这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。* I" o" c/ `0 d0 g2 ^
df1 = pd.DataFrame()
0 O7 x% M: j1 x/ }7 f, x2 ]for info in data1['body']['allMedalData']:1 d7 T" Z# Z( ~2 }
name = info['countryName']
( I, l% D5 O! m name_id = info['countryId']! I2 R- @8 p3 [, r
rank = info['rank']
j7 x4 R; a% u2 X( Q+ z* k2 F gold = info['goldMedalNum']) O. `. R/ D+ a- o3 h, p9 k- [
silver = info['silverMedalNum']
& Q, B7 h% f9 J bronze = info['bronzeMedalNum']2 o0 b, ~: Q d$ _; ~- i0 c4 |
total = info['totalMedalNum']
/ Z) {, P7 V4 K$ i% M; U # 组织数据9 V3 z9 D7 `9 T, N# Y+ [
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]5 o2 V/ p$ a' i
# 然后追加df: G. K; \: x$ }7 b# p
df1 = df1.append(orangized_data)
/ D# L1 [$ h: ]7 sdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
, @1 ]4 m" O) b& Q I! Xdf1! C$ x4 D" q8 @* ^) @9 x* w) |$ U
' ^% |) ~9 m5 j/ Y% X* q/ u 1 }3 N* c. G) G0 [" O1 c
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
5 ]3 q4 C+ q8 S H$ I9 _url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
" C; ^1 C& W6 x5 Vdata2 = requests.get(url).json() _3 ?! o- t' E! e7 [8 X
#pprint(data2)
; F9 _; K8 ~) U1 J+ x+ R! {( ]8 a% N9 _# B* N2 b
df2 = pd.DataFrame()
: v5 Y$ A5 Y5 ]1 ~for info in data2['body']['medalTableDetail']:
( M8 M2 F8 D2 }$ Z' K/ i- v& W# r4 L english_name = info['countryName']1 ?6 l: p8 B( n) g4 r8 p
name_id = info['countryId']2 p* w. h ?/ R( X
award_time = info['awardTime']6 t' l8 V2 p! _
item_name = info['bigItemName']
, ?) H# L! I4 J B3 t& Z% p! L sports_name = info['sportsName']
# a7 ]0 H6 M/ V2 i. B/ f9 U medal_type = info['medalType']3 f: ?6 `! y3 s
# 组织数据0 ^+ ]* _2 S( }$ `5 Z
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]) b2 v2 ^4 b" v! I
# 然后追加df7 ~- \* \; b* a& k$ |* k0 S
df2 = df2.append(orangized_data); T4 N& D3 a# c# Y
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']& J/ l7 v- X0 r% c# e! k' V5 M& c
df2 6 V/ N% n9 |' X0 A2 i
% \6 a' }( }4 n对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 * F+ O9 O$ w7 G' H" |6 p7 \
# x1 @) e; O# C3 s+ O9 \
( K+ N$ s1 H \
二、数据预处理
% a1 | U8 ~0 v+ i1 w: Q3 x2 m- Y+ @: ]由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
: J7 E# ?# i& j F% n/ t R# B. m% K1 r# e+ E
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
) ^ B8 k* {! [. _& J: _. W( f x = f.read()
$ A" d8 U7 _! u, ~" O
( v2 P2 M2 t! k K' j) u8 ddf3 = pd.DataFrame(); X5 N3 U. I1 V2 s. j+ R" r4 X. n
for i in x.split("\n"):4 q! k' O/ ]; M* u+ i1 A0 G
x = i.split(":")[0].strip()* J" K1 Q, C! a" |
y = i.split(":")[1].strip()/ j0 T! t; Z; `: O& [, M
orangined_data = [[x,y]]0 y: r! e V' U0 m
df3 = df3.append(orangined_data)
$ o F$ ^3 c+ n+ sdf3.columns = ["名称","英文名称"]
3 V: L8 D% ^% n- m! ?8 g) Pdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)& K) @1 y: g9 C# p
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
( v. k) |, x% K+ [3 u9 z P/ a8 |; ^. P8 U7 p- X% z
df4 = pd.merge(df1,df3,on="名称",how="left")
) x( k3 u% _ a8 @df4.head(10)8 \$ _% I5 L4 A
) K8 y" H3 L% F- d: O ( w0 t0 E0 O! m7 F
表格df5表示运动项目获奖详情。 - ' A1 Y) C/ ?. Y
7 _& e2 A! m4 I8 C% [; L& K: j
( P, _0 A! {$ `. i, \
. D* ~/ k8 l9 ~/ x0 o/ S' s5 h! K6 F$ Q
|
zan
|