- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40290 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12798
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
. E! k7 E- ~, S3 T, R5 f, U
/ ]4 l5 k3 Q9 K/ _; Q! Z文章目录
6 L7 c' x2 F* I% f" R! D, Q6 ?6 o: z
8 g) q* F0 M' Z* E7 D前言; v6 p) f$ F; L5 h! k
) N% D+ V# z& p- Q- B3 y# M
一、数据爬取/ P3 C0 X4 b5 Y* R& T
; V1 }2 z, E9 ]" t' O, z" n; i
二、数据预处理
7 c6 k' ]% l: U! I# N) g$ o! d' g3 \& v
前言
% A4 w) ^7 @, S4 H9 Y2 P/ Q& _本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
9 ^: q2 G( i7 K) P5 @3 U9 g0 U) C4 _! r6 \8 j6 B$ G! z! c
- {0 r! ^: `4 ^; Q9 ]0 m& D" n一、数据爬取
2 q- ?% R+ Z3 C% wimport requests
( t* w8 f9 i7 h9 O# C. I$ s6 i5 C/ I: v/ Iimport pandas as pd7 k9 q" w% y" o3 P* G9 w# U
from pprint import pprint
/ s% W- G, i$ c. D; g; z4 N导入相关库
( ?9 l) y8 w$ G2 a8 b- A& i9 p4 m$ y' `
requests库用于发起网页请求,获取网页中的源代码;% a3 e* m! W; T1 f' K6 D
% K: Y# q$ e7 \* I* ppandas库用于存储和读取获取到的信息;: @" v1 ~' N4 a3 v/ i
: R, o9 S$ p! P& ]
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;& X; u" r( Z) j! @ j
X8 {) Z/ H. Q+ ?' y6 W5 {! I" _
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
/ B0 g2 r1 _4 ldata1 = requests.get(url).json()+ a, R6 a2 ~1 w* ^4 {. q, T
# pprint(data1)0 Z* }8 s% r+ }/ l+ l. H' V2 I- R
. J4 P: A9 E( x3 D9 p6 N这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。& W( Q m t( T
df1 = pd.DataFrame()
& ]+ y) n5 z; ?6 C6 qfor info in data1['body']['allMedalData']: Q" J8 Z5 V [) J2 }6 Q* F
name = info['countryName']+ A$ g3 B, ^9 |. H
name_id = info['countryId']
# ^; j, V3 s5 h9 s/ W7 P! Z rank = info['rank']
: I# G1 Z' U: H2 P. X gold = info['goldMedalNum']
6 V& v p4 f0 v+ t0 \0 i- i) I silver = info['silverMedalNum']: Z9 m$ z. H# Z' I
bronze = info['bronzeMedalNum']
3 j% k' i7 @" W x5 a1 x+ t total = info['totalMedalNum']
0 ?% N' n$ M6 ^) u7 o # 组织数据
: z! S3 @5 [* y orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
0 _" g \& z( k0 D # 然后追加df
/ Z- ?% O+ |$ F2 A8 ], x df1 = df1.append(orangized_data)
( p( F, E% K) P) G3 C6 ^2 M) [df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
2 m- R) y3 \) n+ i3 T2 L+ ]df1& M p- s k! f3 I5 s8 _& t
% D( `9 ]6 {, ]7 a, B% _% q4 f8 @$ m![]()
) f, }- ?5 X1 M& d这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。6 x7 t C# t1 u* g& L
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609': G b; m# `: E: Z& V
data2 = requests.get(url).json()
$ d- p" C; e- K0 v#pprint(data2)
" c( Q8 S6 [3 W/ f$ u4 {9 `4 E& L' W* L- I+ B' g ^
df2 = pd.DataFrame()
1 o j8 L7 V6 i% u& _& Rfor info in data2['body']['medalTableDetail']:) j) W1 ? G( P! ~) h2 m
english_name = info['countryName']
3 b2 {- _9 t( V3 f5 O4 Z: T% h name_id = info['countryId']4 C0 n# B! q& t! y
award_time = info['awardTime']
0 c8 ?4 A$ m5 W5 s1 U item_name = info['bigItemName']; J3 H) \ a, E# B# F$ v( ^& a% o
sports_name = info['sportsName']9 R" ]5 R3 Y' C7 s! W0 X2 ^# k
medal_type = info['medalType']- p" E! L7 x! F
# 组织数据# \/ v9 i1 a# Q3 A( {$ r- i) {
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
+ @. `2 o- k+ W1 u0 u # 然后追加df
/ W$ U7 @$ K6 o4 O2 E/ y2 S df2 = df2.append(orangized_data)" _, \; Y, I. _! L/ c, T
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
$ I# N, e7 {5 n6 e1 ldf2 ' V! c1 F5 W' A
% E* e3 P. G) n$ n对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 : Q# U5 X# L5 R! g" ]; C! [
" a8 v- k- Q% ~/ l
! y7 o2 C' x4 J) P! v9 `二、数据预处理$ t6 p" n$ M1 A |/ J' z
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。$ B1 T6 {/ M- e ~, u
G) I" e. H O. V( ?' h! Qwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:7 v8 }" p. r3 u. D
x = f.read()
. ]2 Q$ G# `& _% O, t/ Q$ l& g! Q
6 c; @& Q$ r# j$ `! R/ Mdf3 = pd.DataFrame()
7 o8 v6 O, E2 @/ yfor i in x.split("\n"):
7 \ Z/ J6 ?* o" l5 P x = i.split(":")[0].strip()1 }# b% ~. i8 v. Q' @
y = i.split(":")[1].strip()& z5 q+ T* _$ |
orangined_data = [[x,y]]
0 R& m+ k9 b, I$ N/ k df3 = df3.append(orangined_data)! Q1 L7 k- ~! J% {# u0 r9 r
df3.columns = ["名称","英文名称"]) B; `* U7 p A5 t& K5 ? c+ n8 X: ~* `
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None), a/ `) \1 u4 w- U/ Z
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。5 Q7 m3 }' f6 x T& C4 R
" g9 e8 V# K, o% m% m4 a2 ?df4 = pd.merge(df1,df3,on="名称",how="left"). e& Q/ w6 e3 D, \
df4.head(10)- u3 K6 ~, k5 ?6 v& u
1 H3 Q" B7 X7 X* m 0 E3 y) O; q, k& N) M2 A
表格df5表示运动项目获奖详情。 - ' B: K+ p! T* V* @: n. I
/ p. P" R9 k" j9 G" p
3 m9 _9 X3 r$ h2 X! e# @
$ s: \3 b; L+ k/ ~
3 Y" t. ?9 z; q; l4 w
|
zan
|