- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40341 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12813
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
+ O; x3 x- }* ?2 ]
3 k2 v6 H- S- L! H( a1 `, A+ i文章目录
( q* x, }( t9 C. M" q- M/ r
+ |1 Z& P6 o5 w6 ?7 S' ^2 \前言
& F% u4 V1 t# y1 j N) i% n% n# \- \" @
一、数据爬取8 u/ V4 S3 f9 {. y- j
+ @0 T9 f& s) T B- c8 S
二、数据预处理; I) q2 D+ u+ Z8 m& e8 q
# f* Z% W8 |& ~* ?前言
8 c- E* G" e) D本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。* J3 a- J8 f0 x: I/ j Y: y
; [; O/ [: O2 G0 ^# N7 G
* `& B" p ^3 J1 J
一、数据爬取
5 J% W$ S3 ?* {- A/ Ximport requests1 L" F. l: p0 b5 T8 r# S
import pandas as pd
2 _6 C% L/ ]( C+ Hfrom pprint import pprint$ H* S2 |, r! m' {0 P- l
导入相关库
; `6 V. r7 Q& q( H2 P0 z$ i6 a' I8 S' p n
requests库用于发起网页请求,获取网页中的源代码;8 S$ a- d+ F6 ? [) G# R* y* s4 J( F
# m9 O7 Z9 z& M& Z: Vpandas库用于存储和读取获取到的信息;
T5 }! b- d% ]+ I N9 D
( O( a+ R! w: o9 u) R) [pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;/ U! Q/ }, t! q) ~3 g/ D% Y
* \0 d O. L8 d* e2 n; U/ C O0 l! i! K
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! W8 \& G6 L. e) O* i/ `/ x! {( l
data1 = requests.get(url).json()
+ x& i7 I3 J% P |- Q# pprint(data1)0 w4 G! A E8 R
$ X) i: R* J5 _
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
$ b/ n% ?3 @; p/ I. [df1 = pd.DataFrame()4 |, A. k; U+ D( K# E
for info in data1['body']['allMedalData']:
0 j/ e: ^4 `7 G8 x name = info['countryName']% J. m( Q! m% I
name_id = info['countryId']
3 m4 P$ j \( D rank = info['rank']
5 ~5 i+ `" {/ C gold = info['goldMedalNum']
7 J/ v* \- r# \8 ^$ z& w7 i/ C silver = info['silverMedalNum']1 P4 _7 \0 X Z
bronze = info['bronzeMedalNum']+ j. {3 O4 W3 i9 L% r
total = info['totalMedalNum']
" L+ ^5 @" Z& Y # 组织数据- n+ s; F+ R' x8 i5 |
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]9 S9 B8 i. k! H6 I3 r* A
# 然后追加df# K0 k0 s% B( l4 Z( M6 d9 R$ y
df1 = df1.append(orangized_data)
, t" V* p w$ c5 e- Tdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
5 s1 B/ \! A! |# ^! M \df15 I6 F( l$ _. D
{( n) u# y( [% N$ r7 Q) Q
6 K% J3 n, A X' C4 e$ f% e
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
5 {* A4 X# [* x0 D) Burl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'7 `' n# v7 g" M+ L3 T' @+ F
data2 = requests.get(url).json()3 ?+ g/ I9 ]/ x2 f: p d! y
#pprint(data2)% C/ R+ X3 s9 I# Q
( m# B. I+ f4 l6 J) }df2 = pd.DataFrame(), I- {, d" \) Q! b" J: j3 w- v- [
for info in data2['body']['medalTableDetail']:
) [2 \* i/ m ^5 q english_name = info['countryName']
2 @& j* {6 l1 b7 M name_id = info['countryId']
3 V* F" F8 l' |/ | X" u6 E# Q award_time = info['awardTime']* o/ ?2 _/ Q* ~" W1 z7 {
item_name = info['bigItemName']
4 n, q4 ]) w D3 o$ z' u sports_name = info['sportsName']
, c; B7 }' L4 e& g6 X9 ~ medal_type = info['medalType']9 K" m- M" S% d, C
# 组织数据
/ P, f2 I1 E* H5 z j$ M7 U orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
' T- e/ W. C ~! {6 m- W # 然后追加df
5 S: J" R# c4 ~5 b3 M( D% B0 `9 E df2 = df2.append(orangized_data)* f3 U9 @/ s9 L
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% [2 P K/ `; v: V& {. w9 g! o
df2![]()
9 M9 f+ n: {$ m9 R( }9 _) m8 Z/ ]: g
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 , t! p0 d3 _4 u! i+ w. K
5 G% L& t+ `1 k: x
v9 r9 M3 ^: s, |' v2 P R
二、数据预处理
* h i8 k+ }: S' o$ _2 ~由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
/ q; f5 l* ]" d0 R+ s" o) c5 U' ~6 b8 O7 E! C
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
0 e( U2 h# t- S5 {. ]6 | x = f.read()
9 q) N- p. ?$ y$ n6 }/ a; c
& a8 j- l# e+ M2 Gdf3 = pd.DataFrame(), k( f; a1 S6 H+ H& A: `4 Z
for i in x.split("\n"):
9 G) Q' m' z+ `) J+ b/ b% t* q x = i.split(":")[0].strip()
6 {" h7 l+ m5 ^- x y = i.split(":")[1].strip()
# ?. C1 {9 {& d$ ?, @ orangined_data = [[x,y]]
9 l0 q! V: u4 X* l# o1 J) K df3 = df3.append(orangined_data)3 m- g& w2 g$ D& S' t& ?; T' \
df3.columns = ["名称","英文名称"]
$ \7 z. O* O1 F- Q5 q: |df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)0 p! ?3 V- ~) X
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
, @/ z. G! N! c+ f5 t* i! Z
. s+ y2 V( I3 p; A7 P. Cdf4 = pd.merge(df1,df3,on="名称",how="left")" K3 t% A, @4 k1 Q
df4.head(10)2 \4 B+ x8 c0 F: Z
1 @4 [8 J% C; @& O9 X# D9 r
![]()
, X' [& q5 R; ]+ _表格df5表示运动项目获奖详情。 - & n, R: M. h b! U: D
4 ~ C# J2 y w7 z7 `
9 A- ]0 R$ r) |0 t 5 I! ?6 s3 t/ U4 e5 ?
1 E( N. q5 h1 b1 J7 O
|
zan
|