- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 39377 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12509
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1388
- 主题
- 1158
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
|
发表于 2021-10-28 22:35
|显示全部楼层
|
目录2 `/ q, E( d1 q8 k$ m
8 }8 e+ M. L* o- A5 S( [文章目录
" t: `, ?/ |2 R. ]' d4 f& q# c/ \5 w
前言# E M: Z' M" A3 h+ K Z/ @+ V
?- b, f8 l) j" q
一、数据爬取: h! _( Z$ i: z( p& _
0 w$ |4 _9 J$ P; S0 i( S/ \# s
二、数据预处理
! v. U ]7 b% i$ J* o) `# m9 ?' Z3 j* q1 D
前言
Q9 M$ t4 n, s# i! o% J9 |本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。' ^" R# C7 X% b4 y$ q. c( a! h
{$ }& S1 h- V6 s3 K3 v* H
6 J3 U0 R9 J2 j: c3 M$ M; j, P7 Y一、数据爬取, ]: V+ \3 k8 t, z9 D* m$ b: U* {
import requests5 b, h2 O( D }0 ^. m
import pandas as pd
$ S" l. Z/ b$ ]' jfrom pprint import pprint
! ~/ W0 |0 D; t( Q; S& u导入相关库/ \" R. \4 d q5 }% Q) o
1 B* x" r1 Y/ m+ I& Grequests库用于发起网页请求,获取网页中的源代码;
# c8 V% o4 J3 c: b9 J9 j0 P! V, `: j
pandas库用于存储和读取获取到的信息;' B j# K. a) o3 H; T
5 g+ m- r4 [; f5 O
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;0 |! }9 \1 d* P' Z( ]5 w1 T
: l3 O/ a/ U3 T. ]. \: N
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
9 f8 k; o! Q9 M7 S3 ^ C8 pdata1 = requests.get(url).json(). `& B5 ^* t' K. M8 ?# f
# pprint(data1)0 n4 P# | y' `+ [ s {
& i: x& U$ }* L6 v这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
- ^) V! C- M. Z5 I* n- ldf1 = pd.DataFrame()- G8 e7 O9 h* i, F+ C' J
for info in data1['body']['allMedalData']:
; C, u1 _1 G4 _' F9 I name = info['countryName']
! |9 ]6 u% s, _, Q2 r name_id = info['countryId']' w) V; q6 W4 }2 E7 y* L
rank = info['rank']
0 D1 ~+ Y$ W: w, t; D2 v gold = info['goldMedalNum']0 f) @) _' T+ ~& d
silver = info['silverMedalNum']
/ s. b) N# L; q bronze = info['bronzeMedalNum']2 W1 X; e) Z2 K4 P4 b$ g. m
total = info['totalMedalNum']
/ R- p4 u, B, ^1 _6 e/ e& f3 s # 组织数据
. h4 C" O: l1 Z orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
2 d0 H$ x5 B% ^! l' o" l# ? # 然后追加df0 w: G/ ?5 o1 [, P5 K& _$ U
df1 = df1.append(orangized_data)/ {8 |+ R& G' }: q' B0 H) k
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']* d4 E3 m5 q Y+ b2 W
df1
1 L& r, l' Z6 O, s' a+ `5 \$ D S; v
6 r0 L6 l- P, c) {- B0 P
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。9 T1 D7 K4 n, y" j# J$ ^: b4 s# ~. m
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'8 j, ~0 z; s9 Q( E) ^, S+ D/ B5 R! f# U
data2 = requests.get(url).json()
, B: e9 A# @* J& O- V8 T4 a#pprint(data2)0 y; H9 F- b% V/ L
4 N1 f& {+ G2 h, Rdf2 = pd.DataFrame()
" L6 I5 j/ `' v& ]5 v$ W1 T9 Kfor info in data2['body']['medalTableDetail']:2 o- P" q/ d8 r# x
english_name = info['countryName']# M# \+ U% y/ \
name_id = info['countryId']
' @# k6 q# y9 @" n5 t award_time = info['awardTime']' e3 n/ |' C5 J: a9 ` g
item_name = info['bigItemName']
6 _' `4 ~6 i+ k sports_name = info['sportsName']- f( _- @( O5 L! x- \
medal_type = info['medalType']
E$ y% i3 X# l! n. i1 P5 Q # 组织数据5 |# X1 x# D2 x. j% P2 C) T3 C9 B* {
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
+ s5 a6 n) X% Z- |" s # 然后追加df# a5 K1 P3 g* E: W
df2 = df2.append(orangized_data)
- H+ ^3 i& _& b4 Jdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']4 K4 F _3 p% J/ u
df2
, X3 m, H2 D4 {$ ? l' A, h
7 c3 ?* ]- h/ J2 Y- z! d% l$ Q对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 + N6 Q0 W _( A
; s' a/ S" r/ `8 l, b% a- N1 F
3 `0 y2 i& Z: v: q5 e二、数据预处理1 @. k8 Y# r# L5 `. M& m( ] a
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
" Y' |2 f5 a* @
, b$ P+ Q1 C, \# f+ r H1 g) M! G0 bwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
* Q* \3 ?. O/ e7 ^5 q1 x2 I8 `2 K x = f.read()* w `& z6 C6 q5 g( a0 s
5 q1 P: X+ N* l. M* I% T1 I: i4 Ndf3 = pd.DataFrame()8 K0 v4 [% t. y
for i in x.split("\n"):" a3 I) d' g! H: V d4 J' g
x = i.split(":")[0].strip()
. O! h. P3 B# w! ~0 F8 ` y = i.split(":")[1].strip()
% l, V" z5 T' |/ o4 _ orangined_data = [[x,y]]* C+ c, E! `* I! I6 @
df3 = df3.append(orangined_data)
: D2 I. Z1 t) c) Kdf3.columns = ["名称","英文名称"], _, H D- R0 h, e. [6 c
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)% Q; b1 w3 H5 x; N, |* m4 P
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。7 |4 p- z. M( \
$ W4 \% I- M3 z0 D* ]; t
df4 = pd.merge(df1,df3,on="名称",how="left"). _: P C# I) T
df4.head(10)
; y' A5 }% y, _ q: S( F/ s/ J
/ \, _4 k0 Z7 q+ t4 g1 f* ?) v# [6 t5 p
表格df5表示运动项目获奖详情。 - # x7 s; E1 u2 ]3 K" v( {
- Q8 g' v4 [% v `
# s( O$ @0 Y( G; {1 g
2 m) N% e' }- N% d
5 d6 E" D8 A9 e) b3 y |
zan
|