- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40325 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12809
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录* x/ @- ] h& v* j4 h: t
1 p7 V0 z0 d: y. } b% P4 j: k文章目录9 L% U9 T' G! @- r6 m$ X+ r
6 B I n* s- F4 [; p- B5 Q
前言& v. ^5 [0 @2 E" x3 B7 \7 k6 f& V; A
# f" F0 M; X8 t9 A: u8 |* E6 V
一、数据爬取2 G# M2 G$ x% U
6 g% c4 J9 ]- R- |& l5 c
二、数据预处理& E1 k6 m" f& ]- x. |5 c% @
5 B. }0 ^0 E+ ]! }" n& I, f前言3 o3 Q( r# f, g, {" {, m: H
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
) }7 r, \+ x5 ]1 r2 O. V+ z
% k h' [/ x% l9 w
0 Q9 O* A. f/ Z一、数据爬取. n- M+ J. I7 j2 V! }7 [: g# }1 K
import requests
# K; d, @7 E1 L8 s" G+ h9 L5 Ximport pandas as pd: L+ R: @& o+ ^ S5 t8 A O. P
from pprint import pprint \7 T N1 a8 l9 s+ w
导入相关库
/ P! E0 N5 }7 ?) D* Y4 @" w
+ k) `, W( l+ V' K! Yrequests库用于发起网页请求,获取网页中的源代码;
* S. Y" K! P1 D" o7 F- x
- K- x" w' K9 \2 g. Tpandas库用于存储和读取获取到的信息;
; L _$ L3 Q% d% B/ R: B
7 Q! M y" @* E3 O; |6 Qpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
. r3 o) k$ C2 W
, X" n& W; U5 d& wurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'" p8 a( j! _, T* O+ _
data1 = requests.get(url).json()
' R' G8 Q9 N% F" h y9 ]# pprint(data1)+ |8 [. S( L4 g! W F3 L
2 a4 G. a$ e. {% j0 u, n1 }# I4 T4 P这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
- C0 W1 L. B7 \! c5 R( ?1 edf1 = pd.DataFrame() H: L3 l1 J. m% D+ O' _- F+ \# S
for info in data1['body']['allMedalData']:
; l* K& O2 r3 M& p1 |* H2 } name = info['countryName']
( n" t+ t: Z( q1 X, I& @1 Y' n name_id = info['countryId']/ ^$ p) z( r _; P' z
rank = info['rank']
+ g* O3 b7 T8 w6 n; W' P2 c gold = info['goldMedalNum']
: q$ v1 m7 F8 c; Z9 L. z silver = info['silverMedalNum']# S$ f$ f g+ k+ c" J" v# Q
bronze = info['bronzeMedalNum']/ A4 A+ [ I |5 u* F; d
total = info['totalMedalNum']2 `! M6 b2 ~" g0 V0 o
# 组织数据
4 n0 u- r- N( a5 w% R orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]& u6 B* p- q+ @
# 然后追加df
8 j1 o7 K- u1 Y" F6 y df1 = df1.append(orangized_data), J7 M% C, o; T- N
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
y( ^* D$ @* M! }& E% W! Pdf1! J1 O0 |. v" v9 P' F
6 D# j4 h. e! e4 S& Q1 o" t8 P![]()
7 U; p2 b. k" J9 [- w1 t4 C" g这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。$ ?4 o. T6 m+ k& ]0 C9 B5 a' t5 Z
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
, g& W( `! f, t& [/ Rdata2 = requests.get(url).json()
/ G* P& P* L- b2 Y9 e#pprint(data2)# M$ n/ {$ l6 h2 @4 c' z. i
a$ C+ Y1 l. Q) qdf2 = pd.DataFrame()
, X3 Q' m& r% afor info in data2['body']['medalTableDetail']:! N( S% W# \; B: s" @% u7 o
english_name = info['countryName']
$ X* Z: ]6 h: J& M( V% `: q name_id = info['countryId']7 L1 y6 O" g# ?
award_time = info['awardTime']" D/ R9 A7 y, ~( s1 K
item_name = info['bigItemName']
+ ?- ?0 S4 Z+ a; K+ h3 T sports_name = info['sportsName']$ x4 H" R0 E* m' G3 Z
medal_type = info['medalType']$ a" L) c! s8 U0 \9 v8 d1 l
# 组织数据/ K, ?! v* z$ U# D+ m0 G; `
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
& F; e0 j/ f3 h5 _+ m # 然后追加df
6 s6 o& N7 \5 O+ |" Y0 c( ^ df2 = df2.append(orangized_data); a5 I+ v+ G) n a/ z* k( n
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']. Q# h2 ~; s3 N! \
df2![]()
* [; W4 m% K& p1 f* M2 x" S4 ]$ A- ^( d5 v8 b" ~- u
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
5 g9 P5 M! [( {2 Q- ?* ^+ f+ m8 E- N' T# m5 H
2 F" \6 H9 ]! H/ Z, z0 `: r6 |二、数据预处理
9 y) |7 j/ T: h s# s由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。! K: Q; w+ Z6 h5 e6 ~3 E0 P/ @% \
6 t' W- t% v0 h1 Bwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:9 ^3 ` o* y7 N4 E: C+ m% D
x = f.read()
( W t2 b2 \8 k/ g1 ?% Y
. ~+ }6 ~6 W; t& B6 R1 H) rdf3 = pd.DataFrame()6 N- {* y9 C3 p0 g+ X- ^) k
for i in x.split("\n"):
- X6 x4 v1 e6 r# H! M8 Y& G% l x = i.split(":")[0].strip()
* X* w' q% O( w2 @+ ~! i6 j y = i.split(":")[1].strip()3 k7 \* Y6 e# q0 J0 @6 M
orangined_data = [[x,y]]
! K) K( R; J' ^) H1 E3 K df3 = df3.append(orangined_data)4 z3 q1 G3 J/ w7 k
df3.columns = ["名称","英文名称"]. u1 H+ d: r9 |2 G/ ?9 [2 J
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)' S3 U( I' V2 z: E( |
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。( L+ x5 J% T/ q8 h3 N4 u/ Z) l h7 }1 K
4 Y* M0 J; U" r) E$ j
df4 = pd.merge(df1,df3,on="名称",how="left") z4 G0 g0 Y: _: I8 c
df4.head(10)4 q6 H* j6 r4 j- Q
: k$ l5 N2 x( z" W5 t6 ^6 H
. w5 Y1 U/ X5 B: o6 l) @5 J2 }
表格df5表示运动项目获奖详情。
1 {: g3 y- `- I, Z+ {+ @
( x& j+ [& d2 a% Q8 {" ?. k
3 n, P! i1 U: ]. D1 Q4 K' q h5 A/ _( a+ W5 M' n
7 O, ~5 B% R( U1 G9 l- G( S |
zan
|