- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40203 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12772
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
1 ~) a3 W3 }2 s# j6 e, v
8 C; D4 z/ ^( e- J文章目录
5 u" q9 N' e: B$ ~+ x( K( M+ F: e5 [ F
前言
. R: D$ U4 S; X, f3 B9 f. N3 G8 Q
: N# M/ m! |2 ^) f) C& F一、数据爬取# [# g0 \8 {/ h- b
( U" q8 k- [7 z9 N; {二、数据预处理. J6 k( H- Y) J
`; i) Y( v' r% W
前言
/ a$ T2 n, \" x. {; g) m6 r0 B/ u本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。/ x. ^; M' a! H
/ X+ x7 s& |4 G8 P' M/ e$ p1 }1 P8 D
一、数据爬取# a. Y9 J% U& N9 E7 p: w
import requests* \ b& z! Y) S& E; _ j. t- p
import pandas as pd
8 _: F" l0 G/ ` Q/ p6 U5 I& v; o7 Lfrom pprint import pprint& A9 [ @+ q0 y3 R, }0 I
导入相关库
5 G% d2 Y9 P3 _8 l6 ]4 J% ^( b4 _* s" @, _. C
requests库用于发起网页请求,获取网页中的源代码;; h/ [$ c5 ~9 e0 y! ^
; P. E; p0 S9 N8 `& N5 e' apandas库用于存储和读取获取到的信息;
$ [' G5 @8 W$ X/ k
' T; b" v o! n J' z7 C( Lpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;( l- A7 P) M, J0 _ Q3 Q
' F& {; F9 y% a8 ^, eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
0 R' U% [% Z- Q# N5 a! y! d& I: k- o+ Pdata1 = requests.get(url).json()
. Q9 y& x% z% @+ t2 g# pprint(data1)
- _# v; h- E. h! @. T$ }" b6 Z$ h4 L, G" y1 p
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。' P6 y9 g7 J! o* b# S
df1 = pd.DataFrame()
* g6 }, t. `( \- w, hfor info in data1['body']['allMedalData']:7 M& w6 {& E @2 |# Y0 D
name = info['countryName']
$ D: l) s" c+ Z& A, C name_id = info['countryId']/ s0 {! G7 @) ^( J' h
rank = info['rank']
1 H/ z) G/ Z" L) l4 @& J H4 V# R gold = info['goldMedalNum']
2 `& A( Z: ?# ]7 D) g silver = info['silverMedalNum']
7 D) h' y+ A% z! J9 V bronze = info['bronzeMedalNum']
$ i" m" q; X( H total = info['totalMedalNum']( @% c2 W/ e" _- Y
# 组织数据 ]3 i) C3 ?( I5 x
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]$ ^/ Q9 q8 O9 v
# 然后追加df
3 z* g0 \& ^6 `( G2 |# I0 d df1 = df1.append(orangized_data)
6 L& q3 ^5 d% p- T6 ndf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']) l2 p# t' j; c( j
df12 d2 W9 n9 K" [
" U, m- Y8 `! d; m. M* H% P, q
1 Y" g+ k; A( h9 ^" b2 K
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
9 Q% M7 `7 \" b6 @" O+ Burl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609') v4 r8 w: x1 A- Q- E+ z3 K
data2 = requests.get(url).json()/ N3 X' {6 M5 S7 c8 w% a0 V) A
#pprint(data2)
/ W# |2 a4 q& I0 l! M% U2 N3 N; u/ R; g9 p
df2 = pd.DataFrame(): u& h Q: y/ O* g
for info in data2['body']['medalTableDetail']:6 C( ^6 N3 a6 K6 j5 o2 D
english_name = info['countryName']
- d8 H4 u' n) `; R3 s8 U# ? name_id = info['countryId']
, Q0 O# Q2 i3 P# {2 ?* a- ?: O award_time = info['awardTime']; |8 X s9 \- m7 X6 ~- k$ L7 I
item_name = info['bigItemName']
& ~ K6 ]1 x9 Q5 o sports_name = info['sportsName']9 _$ w% e7 v M4 S _. V6 L& H* G
medal_type = info['medalType']
0 @* N) f6 M, w% y # 组织数据
H7 D9 Y' v5 e x" B* `, D% U& ^ orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
. q' s* D! r! d- M8 a: ~ # 然后追加df9 O3 M) f9 j+ } E- e
df2 = df2.append(orangized_data)
' ]6 Q- @* m. L! Udf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']6 r, \- S h$ {5 K9 Y2 }" u7 c4 O
df2![]()
3 `: F; w6 H5 v- @2 v& Y) j3 G- \1 E+ h# F1 s
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 - B* L8 @2 ?% G* G! F
" g2 k" G0 ?; S# S: E: s1 ]+ G* l7 o7 Z! M1 ~
二、数据预处理
( ^4 ^ q7 r$ `, |4 t8 ^由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
& b! c- X- I. Y7 @8 u7 J' \6 W; h3 g# L" M% F) _" x7 G9 W* r9 Y
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:. _! Q+ j! a* w& v& G+ I
x = f.read()6 E* S0 S* [+ U
0 o9 X- v/ E7 j2 n; ^: q9 N4 qdf3 = pd.DataFrame()
9 e: f+ Z' p' |for i in x.split("\n"):& _) b0 B% v* ?1 g+ n8 B4 V
x = i.split(":")[0].strip()
) D6 X0 e) M# \% b* S y = i.split(":")[1].strip()
, j/ M8 J) D: G! \+ C orangined_data = [[x,y]]
3 V. G7 O0 z- g+ F, ^) j df3 = df3.append(orangined_data)
/ s* s; P: Q5 M+ K4 S* Wdf3.columns = ["名称","英文名称"]
W* v1 d; R j: F& q$ Y+ E r: [- Vdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
* S' [2 z) s- A9 h0 z$ M) i6 W( \- W表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。! J9 S) r0 a% }
/ {8 I5 o: F7 @* F- b5 j
df4 = pd.merge(df1,df3,on="名称",how="left")7 b; f3 N8 h4 {' j
df4.head(10)0 v1 S7 n/ n2 E! _ n$ u0 X% {3 h
. ^+ M9 g8 y- e, s V7 C( s) X
![]()
# G' X) m" h: l+ _2 [表格df5表示运动项目获奖详情。 - 4 R4 v$ l l$ [2 i, F5 s) i# w0 B* l
; A; b+ U8 p# p% R. P- c8 n0 S9 a# }. H5 t
5 M- V/ @; j, i+ s) ^' ?
3 T" Z# c& ]" A2 V; ^ |
zan
|