- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40289 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12798
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
' O. B6 \3 K+ s: ^& m% `* J* [) \* D0 r! s
文章目录
9 [# U3 U0 P5 S3 n+ `6 S6 e! I* `1 q# N L# a) Y
前言$ R0 n4 C7 R- z( L
- E( f# k+ a y一、数据爬取
" y% L5 H0 p: c& ~% @+ f2 E' I9 T& ^: T& H: j# L
二、数据预处理- h# p& e& `# `$ _& I
' v2 {6 L; |# S
前言 A: k0 F0 f- Y5 M w1 O$ X. A
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
, A g0 C6 J5 l ^+ C- q t4 [7 u
! [7 {7 y3 r/ k0 \' g一、数据爬取. ^+ l1 \ G( p5 S4 m
import requests: M$ s9 G3 z8 V5 p1 e
import pandas as pd6 y8 {1 Y$ ~+ h$ L. T" r
from pprint import pprint
# p6 \6 y- f5 A/ e5 `导入相关库* C. J- F4 E" R8 i0 c6 v; v b
9 t! N3 C1 m7 J; g9 _/ n2 F' I( a
requests库用于发起网页请求,获取网页中的源代码;
, `# S- v/ ]$ m7 B. {: b( G6 k7 _( a) R% x$ W9 ]5 `
pandas库用于存储和读取获取到的信息;
% b _. G7 f5 N) l6 e" n
) G+ Q* o2 [* U, D7 Jpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;$ a! ^, Z9 K; j4 T8 }: i9 e, }% _3 T# C
) F- [& }+ U0 e3 U, @' \4 T" a
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! {! ^* L4 A- ^4 h" j. e
data1 = requests.get(url).json()
2 i/ D4 {6 F4 L& F$ E# pprint(data1)
" P+ I- {% C Z! d V5 C- r( t! O% t1 _% ?5 F* T* a' e
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。, J9 L$ r6 c+ T# H7 J4 J O
df1 = pd.DataFrame() ~2 O* F$ ~( _$ `
for info in data1['body']['allMedalData']:; ^/ j4 {' X3 u' E, i
name = info['countryName']
$ `, g; J! q ]' b. v# ~ S name_id = info['countryId']
1 Y9 Q7 F4 ~1 A2 O rank = info['rank']* V& {9 q# i4 }9 k4 f1 O( l2 K7 A
gold = info['goldMedalNum']1 m* z* L+ o7 x1 v( l T9 d
silver = info['silverMedalNum']$ t& f! P/ b5 l e' w6 M7 s
bronze = info['bronzeMedalNum']* Q1 [. b9 H ~1 e7 q$ l6 e
total = info['totalMedalNum']0 L# @+ L1 a) Y8 i+ u
# 组织数据
4 i Q" v# J) h4 ^' W1 I+ V orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
$ l( c8 _, j- [4 q9 G # 然后追加df
( D. T8 P7 s. b4 O8 L5 F0 A df1 = df1.append(orangized_data)
4 P1 I0 x) P$ [5 t* `. |4 ^df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']& o" l9 W" P$ T1 } f4 O3 H
df1
( r6 o. X: A' p. J; K4 O. G% k' }6 e5 G; W
![]()
) @- h* j; P F! ^这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。1 `" K ?, ]$ ]9 V
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609' y) g! p/ y3 U8 u4 x2 s( r8 D' x
data2 = requests.get(url).json()! k h7 [0 W' E
#pprint(data2)) f) `0 M8 m7 E$ j
+ u9 P. v2 r# @: R( ldf2 = pd.DataFrame()* N$ k8 S8 g7 C9 C6 _
for info in data2['body']['medalTableDetail']:
" [2 K5 y( f" |7 j, V& \ english_name = info['countryName']! Z% i5 v4 a6 `6 A! v- f$ `& _' v
name_id = info['countryId']
- v, n/ I( C9 @$ Q6 m$ m7 x+ _( S award_time = info['awardTime']+ m/ r% _/ D( Z6 |5 S5 h: D
item_name = info['bigItemName']+ j0 M6 F b& q
sports_name = info['sportsName']
3 R# w- {4 ]5 T4 t medal_type = info['medalType']
1 \5 m1 y- x+ {. W0 M/ f8 e # 组织数据
) l' A9 s0 G5 d5 n2 [/ z3 M orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]; \6 i9 M% \! C5 u( x3 Y9 C
# 然后追加df3 g2 j& T& g3 h- u }7 Z7 M6 r$ g
df2 = df2.append(orangized_data)# ~ t% g0 k/ `
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
/ t& R! e/ V/ i3 n5 xdf2![]()
; g* ~& Y' R( L/ I" }3 `
6 v( o" y5 J% V; [5 `8 ?对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 # E+ s6 Z, T; G9 Y. t8 j7 l o
) X/ S _$ O6 s) ]) {# T/ O6 @, q% `
二、数据预处理) @# y9 t) ~1 u$ l* Z; W
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。9 k8 |6 `) h" ?$ N+ M
) C% U8 D) Y. F& Z9 S: U7 ~with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
" F) b' {7 s0 w% B, z6 `3 b4 L, N x = f.read()
( o/ y4 P: F) y* l5 _0 ^# O9 |% D! ]& ^0 s) z7 q
df3 = pd.DataFrame(): K0 j4 k( k8 V
for i in x.split("\n"):
' I) X# X, R; x& m2 D x = i.split(":")[0].strip()
0 l6 E0 I$ t; v+ ] y = i.split(":")[1].strip()
6 ^, ~1 ]( T: R7 o5 m orangined_data = [[x,y]]
+ a4 W) a7 ?. Q' j df3 = df3.append(orangined_data)5 O8 p3 @8 P' T5 x% b
df3.columns = ["名称","英文名称"]9 r9 D# k0 w4 v! ^$ r
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)$ q* j9 b- E0 k/ D1 t* E% ?
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
: I, F7 Y: W+ r# M) a! h
& Z, c9 w' u( d3 u: I# r0 Zdf4 = pd.merge(df1,df3,on="名称",how="left")
3 r/ i1 s9 ]. K" Y" x, I0 \ Y# kdf4.head(10)& f5 ~0 c# { T$ A
7 V( T: k& M. r5 I) j3 @; J. D 1 w5 K5 X7 N$ s; W$ y
表格df5表示运动项目获奖详情。 - 0 m! d$ W( J1 }* Q/ g* L+ Z; t& l" S
8 K- y: `6 `4 O
" K' c/ @: T7 w2 |
- G* P7 c, W; ~4 I/ E- x
9 o2 d; k% i+ I# W1 Q
|
zan
|