- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40311 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12804
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
# e% x0 i* @2 Q- l: M& k
% C- q" F# |+ T! O5 b文章目录
5 D8 p/ e% T# T; i( y
) t( }' ]% p/ _ V- t前言7 T% c! M& ]$ R( s, E8 L$ E
% V, J2 @: @% x: U" B9 s4 X一、数据爬取
0 ]4 _7 D) Q& c7 J/ e, g3 O8 n) W1 q' l) Q8 y5 n
二、数据预处理2 E8 Q w% ~, `2 |# S! _
, s8 E, u: O1 c: J; N8 a1 y) }! J前言
; |% ^2 C2 v# \+ d" Q" D0 X8 v* \本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
3 B9 v4 p8 x2 V/ h( ]5 Q' n( w6 ^2 y3 V! ]0 u8 D" U
2 _, L# d$ D+ I8 l
一、数据爬取
! Y' a5 F7 n" X) ]" O5 nimport requests# V2 _) V( Q, n6 o
import pandas as pd
) a) ?' a$ O* h9 c8 q, jfrom pprint import pprint
2 V' O' Z* e4 l6 k* C% P. Y导入相关库: V4 N0 M0 A i( N2 @; a
. h9 V# g6 }6 T8 ?requests库用于发起网页请求,获取网页中的源代码;/ i( c1 A* V8 h' N( U: s$ s8 m
1 c- V% u7 A/ B4 i; f$ I* [9 qpandas库用于存储和读取获取到的信息;# L' c5 Y$ o9 _' h
' w: x2 ~! E* N) u4 cpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
9 U% N" I: _ ?4 }" @! N, h! R' A4 z( v7 Y1 J9 g
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'% j l! B" |) C6 L
data1 = requests.get(url).json()
+ o2 _1 k) c/ F7 V# pprint(data1)
) G+ K/ }8 G- m: R3 L" K
+ s0 \7 b. ?+ V6 G( M, c这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。1 D3 t; K% i) b. m q }+ @- e4 s
df1 = pd.DataFrame()
( i) i2 D D; Y- R. H& X' } p, _8 afor info in data1['body']['allMedalData']:
& v, K1 V# U2 T, e4 o3 P name = info['countryName']" S6 q0 C# K+ }9 s4 _/ ]- d7 r
name_id = info['countryId']! N* @. ]4 ~) H1 s d6 R
rank = info['rank']
5 P9 J* M( h+ }! K/ a gold = info['goldMedalNum']. E3 v5 x) p6 L, ]
silver = info['silverMedalNum']3 z9 |' R8 d6 T
bronze = info['bronzeMedalNum']
0 j; h6 V8 b' E total = info['totalMedalNum']% Y2 U5 x3 ]+ W( y
# 组织数据
+ Z' N1 u1 |4 s& T; V# k3 J, I- ] orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
6 E! Y* \; ]. Y, X5 {" o/ r # 然后追加df
4 z: ~" v8 Z3 _$ l I, u2 V df1 = df1.append(orangized_data)- R+ K( N6 u, z- X& |3 m/ V
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']! I/ q/ H6 w' ~ |
df1
s7 k: h+ S- K4 C- H& O- ?% C# f# V S3 p# D; j( g5 p5 v; [
![]()
4 L( _( l9 n- n2 {+ H4 O" ~这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。5 j+ Z* f$ l! ?
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'! ?. T t7 s- \! e# d( M5 t6 }
data2 = requests.get(url).json()
7 E6 W5 M6 n$ t5 |$ g#pprint(data2)
4 v I% f; y2 A8 ~% a6 h
0 u3 V) O/ f' {! }1 K* I8 Qdf2 = pd.DataFrame()
2 P9 X5 E! y9 e8 A5 dfor info in data2['body']['medalTableDetail']:5 n% ~7 o( ~! [( ]! a( ^& m
english_name = info['countryName']- c! ?$ c7 a+ O! a7 v3 N/ a
name_id = info['countryId']( }( k# ?+ E4 |, \& x
award_time = info['awardTime']. w0 E" U8 l6 p. h; [1 L+ ~
item_name = info['bigItemName']/ }/ e$ T1 F# M, Z( e$ T/ U# f
sports_name = info['sportsName']
% M0 L/ z# e% ] medal_type = info['medalType']8 U7 g" v( P. W& ~9 \- G+ [
# 组织数据
. t+ F: W& v2 _; ?0 Z orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
2 x- Z+ h. \/ P1 G5 T; y # 然后追加df) d% V9 k1 F: q B
df2 = df2.append(orangized_data)
3 @& V }+ W3 m5 B Adf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
# f$ Z2 a5 H/ v: Z0 l! }df2 0 a' W1 p+ g7 B5 \5 o
" Y. Q% a3 a+ j
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
2 R6 Y( D* M/ [& ?) d7 [7 }6 [6 Z
, o# P+ p* \% f
/ ^, Y" p9 n0 F二、数据预处理
w$ M/ W6 G7 T, j) I4 v由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
$ O) {, Q1 f: u* W- I, m- k) w
) N9 R6 C& e8 R h. X, mwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:* r$ l( w, \) Z; u$ f! N
x = f.read()# M7 f Z7 f8 e
$ V+ Z5 F7 Q! S4 |' i0 ndf3 = pd.DataFrame()4 p% E" G3 y, O8 O$ q
for i in x.split("\n"):! ]+ T8 m' W) t3 D" ]
x = i.split(":")[0].strip()* D) o* n/ j; i" S3 s
y = i.split(":")[1].strip()# P. m) y3 j/ M A K3 _" U8 p, @
orangined_data = [[x,y]]
' d& q3 d7 W$ w% i" s+ R$ ] df3 = df3.append(orangined_data)
7 I& m- v0 Q3 o) Ldf3.columns = ["名称","英文名称"]& r" J: G3 r( T( W
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)% ?, D' P- x& I: ?; ~& n, y
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
1 C% A" U" E3 Z3 h6 E
$ P2 F% z1 h" m! Z9 Cdf4 = pd.merge(df1,df3,on="名称",how="left")" m+ |3 n) O3 h% y
df4.head(10)7 }, _( ~, J* D5 I4 b# p
5 e/ |+ i* s) B/ o6 T# Q![]()
0 @) V Z# {, |9 i3 s表格df5表示运动项目获奖详情。 - 5 ?- Q W5 R9 W7 Y. R ^
& }% p$ n, S2 W/ L+ L _
i$ V% t% Y" C( T ' U& b9 Q* `& j' s2 s
& J9 n8 W2 B0 o1 w- @+ Z% R |
zan
|