- 在线时间
- 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
- 自我介绍
- 数学中国浅夏
 |
目录
/ h' Y7 L2 [# m
, {/ H0 \7 ^+ o# e6 H) ?文章目录
# H. u# {( D C. T/ |; r5 ? g" |2 X6 f& y
前言
1 t& R) D1 }* v2 d- q4 L
1 N2 N3 ]' {; B: W( T/ P一、数据爬取( C! g+ K: N2 J7 ]1 m2 m
- p! C3 W) C1 x" I
二、数据预处理+ \- g9 }6 Q2 K+ B( ?! [ Z' Y
. D) d3 [- ~' g5 V# N
前言' U" w( I$ _6 A' Y$ A
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。5 u! w" j0 z; r% X; ]# k
: C( Q( r4 _1 \8 i* o: {+ E& `+ i0 [' [0 e
一、数据爬取: f$ R/ {# X; ^: [5 K1 H& \
import requests
2 U7 ]& n$ ]+ E/ C2 Q7 c4 jimport pandas as pd: `. x0 X% [/ A" `; e$ x9 N
from pprint import pprint
3 {5 F2 q ~2 a) K9 N! |导入相关库
3 D* P& j9 s3 F0 @' \& q# f9 z7 ~* K: c7 v4 G7 s
requests库用于发起网页请求,获取网页中的源代码;
! _! b4 \$ V; x& e$ U0 B' |$ m# Y7 \4 v' x3 J& I. @& T
pandas库用于存储和读取获取到的信息;- Q9 w5 H, p( k& j2 e6 U0 @
7 }- G$ N& A' Z: v7 n6 F. s
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
5 T1 O+ _. d/ G3 G) l
) M' ~8 G2 Z* ?. \4 Eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'& y: y$ W7 M: w' r
data1 = requests.get(url).json()
1 d, i. W# w- D* g2 y8 q# pprint(data1)
9 L* w. k3 k0 N2 ?1 S
! R% d8 q2 ?/ g( t) P这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
0 k7 x r" i$ P) i9 Ddf1 = pd.DataFrame()
! ?+ ]+ o. k: e$ a4 Dfor info in data1['body']['allMedalData']:3 H; p- D1 e; ]; e3 D4 r
name = info['countryName'], ~/ J0 c! C: o) w
name_id = info['countryId']7 }2 `; t( S8 g
rank = info['rank']6 U( |3 u7 q. ~$ [
gold = info['goldMedalNum']
1 ~6 O2 m4 }4 J: R silver = info['silverMedalNum']6 J* P7 Q1 B' z @
bronze = info['bronzeMedalNum']
. f u# n1 S" N6 h total = info['totalMedalNum']
9 w: s) Z: x+ E" l4 {9 [ # 组织数据/ N5 e9 s5 o. K u* t
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
& t$ `5 p% }4 n' M/ G2 ` {& G) K # 然后追加df
, O {) |' ]/ b' K1 o6 B; z df1 = df1.append(orangized_data)
E9 E! L) [ Hdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
. V- Q8 @: d, ]0 `df1
1 F; \: [3 D/ D$ G0 ~% O4 W; ^3 w/ x, m" r; r
![]()
* R# i6 ^6 h9 |这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。9 Z3 {4 A0 L% x% K. h& ?7 s+ D4 w
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
$ m+ X2 _* x! I( ldata2 = requests.get(url).json()
+ S1 V; U& t$ `- q$ I" ?#pprint(data2)) H8 r9 o$ w1 h3 V% h
0 H+ f. O2 T+ { V) z3 Jdf2 = pd.DataFrame()
$ t8 n. ?8 Y. b. T7 H! e8 lfor info in data2['body']['medalTableDetail']:
7 H, ^* g6 J0 ]. m5 O english_name = info['countryName']
/ [4 C; B- o. U! P7 n) e9 Q8 J name_id = info['countryId']
4 X& I, c" x1 k6 ]" S6 [, ^ award_time = info['awardTime']# z) C3 V8 \2 B7 ~& Y! S g
item_name = info['bigItemName']
3 T7 v: E' v, G4 m! |8 Z7 i! | sports_name = info['sportsName']- \$ N2 ]) e" s4 x# l. f
medal_type = info['medalType'], J( A6 J" J% ?- ~* s
# 组织数据
8 _* E' `% N3 E8 \8 \ orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
, Q1 r3 ` m5 a; L' p" T # 然后追加df
, F7 ]0 B$ o7 B5 {7 z4 W6 l( j df2 = df2.append(orangized_data)& x4 c3 n9 L' h6 [
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']* K3 u$ N0 P2 ?% V$ T
df2 - Z. n! x o7 t: G6 J+ r4 A
/ j& F$ `6 O5 ]6 Y, z对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 4 _5 y: ]8 h Y
7 B1 y( Y3 L$ i, }! G1 |( v+ G; e) |, ~- T) u3 m
二、数据预处理& u: V; l! d) i2 t+ k6 x \7 D
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。5 d5 F6 u' V, C
3 W, G. m3 A- ~! m1 qwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:) _9 Q% e% p+ w, @# B( z
x = f.read()
8 ?+ l4 `1 p) } R- k; }
1 ^# j. C4 c0 x1 ]- \df3 = pd.DataFrame()+ g5 [' J! k" [$ o0 z, @% C
for i in x.split("\n"):9 o/ B! m& R' }8 o2 n& P
x = i.split(":")[0].strip()
1 W- n! G$ A5 ^ y = i.split(":")[1].strip()
, E% [: |9 F6 s orangined_data = [[x,y]]4 e: J4 s# ~5 o$ N: }' U# Y$ ^
df3 = df3.append(orangined_data)
' E+ x u2 Q, x! f8 xdf3.columns = ["名称","英文名称"]/ T' u& q& R, J6 z+ n
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
' ?3 J, n X( C9 m/ e表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
5 q5 _9 w9 z- m o! F1 \% i/ C: L) f5 a" b. p9 O
df4 = pd.merge(df1,df3,on="名称",how="left")) V' x4 i9 u7 }5 N3 _
df4.head(10)3 U7 k+ }1 h2 r6 L
" }" e7 a3 i7 K
" B7 Q1 N' O* q5 v
表格df5表示运动项目获奖详情。
/ {/ M$ V$ X X* f- |1 W; l' T3 N! q9 Z% j$ n5 q; U
- T9 x' ^4 A ?( L m3 r0 k* D6 O& ^
# t& K7 q* m$ }. t2 ? |
zan
|