- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40037 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12722
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
; M" |% i6 g7 } B3 p4 ~# [4 H) \9 t% [3 l n$ l
文章目录
; F6 l& `. ^" n. e: ?% [. y% k8 B2 ~7 t: W
前言$ J7 ^, r' h' I4 ^- n c% l
) \) Q. J O3 \$ _一、数据爬取
# ] M: \4 Q _0 ~. p! L6 R+ l/ S" F" o
二、数据预处理
/ n: y$ l& s% E! p* H0 E v
: R* J( G6 P% @2 F& `5 A前言
5 W( P W. i: O本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
4 I6 p' _- L8 a2 ~: r% H2 Z# F# y
4 K% k, t a' h5 M) S
- O* D; `, F- `4 D1 N5 `8 m一、数据爬取
2 c b/ ]6 x% Q6 u/ f- N: Eimport requests
0 j# e# m; b+ a% k' c3 Q- P, d% dimport pandas as pd! H! B6 K4 F* Z5 R# t8 L/ t
from pprint import pprint
& B) F9 k5 ^1 E! T+ {) \5 n导入相关库
5 C3 v& K" t" S4 q* f( T( [/ m- T: R$ z+ y- G: l
requests库用于发起网页请求,获取网页中的源代码;7 s" O- p* W1 a
3 R1 J2 k. i0 i# ?
pandas库用于存储和读取获取到的信息;" a- x$ v( y' U" e5 @) x
, e9 T- d+ ]% {! M
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;& I, C" B2 n2 ^# Z) D" a. ]* E
+ H0 L: ]9 k+ W2 l4 G
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
" j; v/ {0 x' Udata1 = requests.get(url).json(); O, x1 s7 i) u( N7 L
# pprint(data1)# x6 ]' a, m0 z2 f A
' O+ i! W# x3 w% @' n2 u$ r2 _/ e2 ^
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
v: j2 P' u$ c5 odf1 = pd.DataFrame()
9 H3 C- X$ v, y5 afor info in data1['body']['allMedalData']: r8 |5 x1 K9 b5 R" t0 G+ o' a
name = info['countryName']
4 ]' Q/ a& y' D5 c/ r: z name_id = info['countryId']; Z* s6 `, b6 m
rank = info['rank']
2 Z4 _# d1 A0 I. T gold = info['goldMedalNum']% k" Q4 z; n1 A: N8 p
silver = info['silverMedalNum']
) \! Y% C1 b# u8 u. _ ~3 V$ X bronze = info['bronzeMedalNum']
5 W* Y- R# [) U; L0 l total = info['totalMedalNum']
/ X! J, k# n- l1 f% W0 b* q, @ # 组织数据. V5 a* M% Y9 y6 L3 p
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]/ U3 v: l/ J: E- q1 }
# 然后追加df
! h1 |) J) ~6 r; v0 f' m! o- @ df1 = df1.append(orangized_data)
" Q; D1 E$ T u% O: V$ ldf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数'], [) [9 P7 L8 {1 W& U5 u
df1
0 F8 K1 b3 V" q9 i% q5 _8 ~: ?6 w9 B9 h' Z4 K" {5 J0 N
![]()
' E) H0 a& c0 B* z( M8 ^这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
" F2 T) h' \8 X& B+ Eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'- {- S) F: j; B: f0 z0 e7 j
data2 = requests.get(url).json(). p+ G. q+ q, @4 l# b5 O t5 z
#pprint(data2)" M$ J' h# e1 L5 p# J
: B+ p0 _+ S- f0 K) c: h, E8 u
df2 = pd.DataFrame()$ X |4 S$ N! \3 M" x1 f
for info in data2['body']['medalTableDetail']:+ k( m1 ], `- ?2 L1 b n- s
english_name = info['countryName']+ e r) N+ l' h3 L I$ D3 E9 O- |: a/ e' ~) K
name_id = info['countryId']# d, ^3 `/ I3 F1 e$ \
award_time = info['awardTime']
1 n0 R1 Q g! a! M" p& I item_name = info['bigItemName']
8 ?& H; W. | K* k sports_name = info['sportsName']3 U9 j, F: b9 L3 T
medal_type = info['medalType']
0 w/ g3 C5 H5 V* m # 组织数据
& {/ r& z0 b7 ?& I, U: Z8 A7 Q orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
) P0 v3 A2 L* E; k* u # 然后追加df5 ?' W+ ?" @+ @* z c6 `
df2 = df2.append(orangized_data)9 K, }6 I, `; v5 A" q/ i
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
7 @' J' g: O% x6 O( q& `df2 + n$ O/ [ _0 T' Q, o7 v
, \4 ~4 [2 b4 g7 @! U5 S, [4 k
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
% ^( E! o+ A4 A) i* ~% X3 N* J% |8 w% I
1 V/ y8 B- j' F( l/ X二、数据预处理8 q% I: p+ @! I5 N
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。3 p+ a2 q1 `, I% m1 {
" X3 u' d3 N2 A4 Y. H4 xwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:0 H; f( _: ~- I+ _4 Z6 R) H9 B
x = f.read()
2 n I4 R* J& K1 |# r6 R" F$ v( X% P$ a$ ^1 `& `" R
df3 = pd.DataFrame()- c2 c* n$ Z$ |! q
for i in x.split("\n"):* H7 e! m1 x! V
x = i.split(":")[0].strip()$ Q) c4 K+ M5 A- w7 j
y = i.split(":")[1].strip()7 H) R; T4 c: j' ]3 f3 a, `, y/ w( C
orangined_data = [[x,y]]* ~# s* w I+ ]6 h6 d3 x
df3 = df3.append(orangined_data)
# ]8 W+ u3 y2 \" S* ]df3.columns = ["名称","英文名称"]6 ?: ?. k; e3 s
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)& N/ ]0 c' l. G" C+ C1 ~
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
, ?! K% R- ~: N; K8 y# l* j
$ a8 j; Y, l7 v4 L& tdf4 = pd.merge(df1,df3,on="名称",how="left")
T* i( H) l( p4 ldf4.head(10)
( @; d' t) n) d) A& t1 O
8 Q2 E( d/ N8 P0 t, p/ p( C; J/ y![]()
5 W9 o+ q9 }4 t* a+ G表格df5表示运动项目获奖详情。
9 u8 N6 {8 T$ i( s" e1 e1 v& W/ N/ I7 L; E/ \9 O+ \
; G$ i# y$ ~$ g5 P 9 d, M* a7 |0 @; h. G
4 k. Z3 m* |( e3 b. u: ?9 i& [* z) w
|
zan
|