- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40344 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12814
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
+ e' t; U8 D% T; Z3 d. F7 v" D
7 `- z& D) z' C文章目录
4 W6 i- H) s8 U! T' Z. q# B* v j6 A, F' ]1 S
前言
% J- U" l" R+ e' v$ i$ n, f7 Q- P W5 T+ I5 O4 @
一、数据爬取4 `! r6 L! @* s- S
3 T6 U+ Z3 \+ Y
二、数据预处理
! G( |) F( U+ L5 K: s. l- k# C) r! S1 V; h) }
前言
9 W4 w, \ \8 [0 F本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。; ^ Z/ W1 H3 J+ V: \
5 Z+ ]; N$ o7 ~/ L n
" B, j$ X+ S8 P" E6 F% z' H3 _0 d* L一、数据爬取
* q% \$ D* a/ T3 o& {" simport requests
9 L7 r) |+ a" k! a5 cimport pandas as pd7 `/ O. a) Z0 I. @
from pprint import pprint
6 A1 c2 P% c. S. ?# m导入相关库+ m* J- H* m0 O+ G/ H0 F
) ]4 L0 H9 R+ q' ]- Wrequests库用于发起网页请求,获取网页中的源代码;
' g4 I* Q6 A6 R$ h+ F
5 F0 w! |+ Q/ I# A$ hpandas库用于存储和读取获取到的信息;0 J. x9 O. V; g1 ^4 z6 S% f
, i, a' N7 j D H, B
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
' X7 E5 g8 w6 f
: ?3 G% P( s9 K& R/ b4 M9 _, Furl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'8 k+ y( ]; b u6 G3 H- P
data1 = requests.get(url).json()
. {' S- `. d r% C; Q% M- @5 a z7 X# pprint(data1)
+ f4 w6 G' w1 H& ]+ p. B# ]. C
6 [( ^9 R; S8 v4 @3 X这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
) A. K6 ^( D1 c2 w3 \' }df1 = pd.DataFrame()( e+ P2 T! q5 T2 L8 i: D
for info in data1['body']['allMedalData']:+ @& s" v5 O9 t! `/ R* [2 W
name = info['countryName']/ U: | f! e7 C5 A9 b# F W
name_id = info['countryId'] H6 m+ K% q2 s) U$ R, y
rank = info['rank']
$ B) r: d8 Z+ J7 O gold = info['goldMedalNum']
1 Z/ J( F6 H/ B- W( r! h silver = info['silverMedalNum']! u H( i0 }, M; y/ w0 O0 Z
bronze = info['bronzeMedalNum']! m2 B8 X/ R+ I/ S
total = info['totalMedalNum']
/ p0 `6 n( l4 \0 f: d* f: } # 组织数据
0 n2 t8 J: Q! z+ M orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]# V2 x$ L, Z: J# I7 [% k
# 然后追加df6 s: K0 }7 d2 S6 m0 z
df1 = df1.append(orangized_data)+ H; K2 _0 K- [' r, g
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']% W2 e! V8 w4 H' L% G
df15 i( j$ z% ^3 V. w; i% S$ x
. e7 D" J( x4 X8 p7 V
- E# c/ x; h! H7 @8 A. M
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
/ N4 ^* y7 ~& M8 X1 w qurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
, b" ]" {" B8 J' t# j2 H; I( ddata2 = requests.get(url).json()+ B+ ~3 O: k) q. Q2 N( `
#pprint(data2)
& l- n" U. l- P. ?* o
, _( e& k8 ]& [! Ndf2 = pd.DataFrame()" I! _8 @# t; u' X+ N5 @4 c
for info in data2['body']['medalTableDetail']:
/ l, G6 T2 o2 w english_name = info['countryName']
! Q& c% B- ~8 B' L+ A name_id = info['countryId']
0 c+ ^" |$ ^) o0 V award_time = info['awardTime']6 w% K+ t+ _" q6 N5 F' u
item_name = info['bigItemName']# d+ J% _2 u, Z
sports_name = info['sportsName']* y* G! H2 m) d4 Q* L* _: z E
medal_type = info['medalType']5 q" p8 X/ l( ^6 y
# 组织数据
8 e# E/ Q3 R# m6 u$ x orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]- Z* z8 l9 T# J9 u5 ~2 f* A! g
# 然后追加df) @8 H8 E7 s9 U2 _7 `' H* Q
df2 = df2.append(orangized_data)
$ w2 ^! a5 U! e* K4 ?df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']7 s8 E) P7 z/ P |4 X
df2![]()
7 a: ]) l% o9 {) G+ z0 E* o7 |. I1 y5 n& i `" I" k* v& H1 \
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 3 O8 k9 M5 J5 m) U3 R
# l* [# t8 e5 Z4 x: |6 V
' y, z/ K1 R) V6 a; o* f二、数据预处理0 M4 L6 t2 B3 Y0 h; Q
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
% M3 b8 d' m! }; T9 ^: G$ P! [$ w3 Y8 t; _8 P
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f: t Y$ l2 P' c5 N, _
x = f.read()
2 Z3 M8 D% y0 W+ r* ~% }0 n; [( u
, ^! C, B% c$ s0 vdf3 = pd.DataFrame()6 z" w# s3 X& ^2 _% H( ~
for i in x.split("\n"):
7 T6 a% Q' W; }7 @1 M7 Y( I; h- K# m x = i.split(":")[0].strip()- S' \% J4 A4 c) B/ g
y = i.split(":")[1].strip()( [% j/ [% d _/ Z- k
orangined_data = [[x,y]]& h& _" @4 g. w8 ~4 @# j: e6 G
df3 = df3.append(orangined_data)
! y) z5 A2 e4 \# V) d( S4 y' {8 rdf3.columns = ["名称","英文名称"]9 `6 Y- t8 G: R$ [" q6 S
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
; N9 P _: w: P5 n2 T' z表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。3 S2 W& _) R" [: d5 V3 [
% }; x" M' p2 Zdf4 = pd.merge(df1,df3,on="名称",how="left")
" M1 r7 o6 `' sdf4.head(10)2 x5 x$ Q: }' q3 |' @3 ~' C
. S; b1 @% M) `
1 G- x% W1 h9 r3 F( o8 Q
表格df5表示运动项目获奖详情。
0 Y& @+ l( ^& {: h3 g1 n# q
7 K% A1 C' _* w8 L+ u" ?1 q# n7 j, }) b2 }
: }- g% y. P; j1 ?
$ x7 Q4 Y5 C5 y5 m" h0 ]4 Y
|
zan
|