- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40245 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12785
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
/ O, X# u t y! K7 X9 P9 N# N* E1 Q
3 O3 f% k' ~9 f, x文章目录
3 ?. {8 T1 J5 ~5 }+ T4 z6 C
7 Y& D6 s! T, O1 v. w# ?2 C前言# y7 W: V0 l9 P8 N
( x' c0 b5 u1 ?: @; Z
一、数据爬取6 `* R2 j" }& e8 R9 R. C3 X# V- G0 c
" p8 y" z, O. ]% f5 O5 D二、数据预处理8 b2 G1 T! V, {. ^6 @' |1 E0 ^# a
0 m% K( A% u1 Z, e1 T6 ?6 [, y
前言& D% A1 h+ a, E0 V# M0 h, S
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
" r* R1 T. D' T" }& }
! o6 @ K7 K3 Y8 P4 A. P' Y7 P( x) N& h! o/ j
一、数据爬取
+ J9 l, U4 g9 \9 y- y- cimport requests7 P) p3 j7 {1 L+ L7 \ e
import pandas as pd
( w) i2 V6 i+ d0 v6 M8 rfrom pprint import pprint- a- o, n8 G* \5 Q- \: j8 o
导入相关库, y1 Q5 ~, O3 B2 U @& l0 r9 V
- X" S' H9 v. D8 ` z
requests库用于发起网页请求,获取网页中的源代码;
5 Z/ }5 ]- K: T" p e3 T3 f% g6 ]1 M) l" H+ V M* J) ?
pandas库用于存储和读取获取到的信息;
$ S. }: ]$ J* M+ `$ y
. Y% k6 P5 i) A2 |3 |pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
$ y! S S3 `2 }/ s. G" _# U5 o' u. Q: ]
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'1 t5 i# ^" q1 h5 J5 j/ ]
data1 = requests.get(url).json()' p% P6 p/ |; @) v f
# pprint(data1)7 V6 F/ O& V8 Y- g+ r
4 ^6 p4 e M3 w4 S: k这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
" j: m$ l4 B1 b1 [df1 = pd.DataFrame()
$ ?1 x# t4 Y1 f2 bfor info in data1['body']['allMedalData']:- U( Q8 g. J- \& Y! \5 Z( |, [
name = info['countryName']
# r C9 Q( [9 T8 j; a+ j0 g n% a name_id = info['countryId']
- v e5 M5 c- ], D- ?# N" S5 V/ H3 b* L rank = info['rank']7 \; Y1 S+ M4 J) I& w. A, \. D
gold = info['goldMedalNum'], j8 M' i% N; V- _9 L; L
silver = info['silverMedalNum']# [% M, l: ]- v o- ]! S
bronze = info['bronzeMedalNum']
, L6 u% |8 _ |$ @ total = info['totalMedalNum']9 M4 u% P6 }8 n
# 组织数据0 l9 \. U/ Q! G( e+ b* y' N, y
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
- l6 [% \6 T- w9 {0 a5 F # 然后追加df* I- Z( ~! m- Y8 H r* H& h% N
df1 = df1.append(orangized_data)
- u+ D( u w- X/ N# |2 _df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
i0 g% g/ h' b. i5 `df1
1 I8 K% `& |, k1 H, b3 `. d' D3 Q0 X, Y6 [
; M s: i" a0 o+ W/ s4 L
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。) i7 k! @" }: B; ]& ? s
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
, ]( D% Y, r" M! ~, g- Mdata2 = requests.get(url).json()
, Q3 ]0 Z+ ^% ]- G/ [0 _. f#pprint(data2)3 O/ p1 \' r: y! |
2 j. \; M- A6 p7 |
df2 = pd.DataFrame()( s! Z0 ]1 e( s. E8 {4 w& l
for info in data2['body']['medalTableDetail']:8 ~" A# v% k9 O7 I
english_name = info['countryName']
8 D' z8 g: }% T- Q name_id = info['countryId']
. W5 w$ T2 j( }: C+ J7 ^ award_time = info['awardTime']
) b: |+ t% z6 A/ x6 u8 U7 @ item_name = info['bigItemName']
* M" ]$ o8 t4 ^3 i sports_name = info['sportsName']
+ V- |! T3 S+ g( p& ^6 u medal_type = info['medalType']
0 j4 Y* A+ ^3 u4 F& S # 组织数据
0 Z, F/ N8 M7 ^/ A3 I3 ^7 | orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
9 m: \( d6 V2 ]9 Z7 i # 然后追加df& q; T% ~7 s) N% E. s, e
df2 = df2.append(orangized_data)$ }. m3 A9 w5 h" D
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']5 H$ \! H# m3 N: ?
df2 & }8 U& l9 H( J6 z5 r
5 f& u E+ n/ U5 g! U1 K, @( b( R: S对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
/ o' \8 I+ s; R4 g# [
; j: l! `: \! p& }8 f" L0 L0 r5 \1 G
二、数据预处理6 Z3 n2 j. @! @: w* J+ L4 c% v: m
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。& x) [7 M$ _. E% G+ g
0 e* M5 S4 b9 }3 B9 t
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
9 I; F6 o0 S- s) a x = f.read()8 q2 f7 c, p: }
/ D2 W3 j$ | a+ G; R5 |' h
df3 = pd.DataFrame()/ _- S7 z1 `0 T4 {4 T
for i in x.split("\n"):; n; u; J/ `, ^( X, a
x = i.split(":")[0].strip(); ?/ s% }; }2 J# v
y = i.split(":")[1].strip()! u) R1 p, W8 a4 q
orangined_data = [[x,y]]
; n" j# y9 |/ r+ n7 R5 ^ df3 = df3.append(orangined_data)
0 p* _3 n& G" ?. N( y- W, ^df3.columns = ["名称","英文名称"]
V+ S! t) J+ pdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
- a2 J$ |+ ]1 y: s* U表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。0 J5 A6 n5 u' T: ` S6 A3 i8 K/ }
: w- R; G! r; J2 Idf4 = pd.merge(df1,df3,on="名称",how="left")0 V: ^1 p4 K2 r: Q' J% Z3 h
df4.head(10)
) M" r# {+ I4 z1 m0 }; ]8 L7 R/ |! u `, }- x
7 c6 I. a- k' } ?- A! i+ Z2 s
表格df5表示运动项目获奖详情。
. p/ T" x3 E& m3 z* w7 t1 _! X! j& _4 F7 Q/ Y. t( P
- Y! v& D) p" [" C8 a
7 u4 C" }0 |9 M/ s
5 \' m% \ `8 I* t; @ |
zan
|