- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 39378 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12509
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1388
- 主题
- 1158
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
|
目录+ w$ B, F8 p5 {+ W2 D+ c
7 O' e; M2 \1 a7 S3 g' S
文章目录
0 _% l+ r. P7 ]* I1 \% K9 \* {0 E- s8 I: Q" r
前言3 S! z* M* @1 U0 D( p
; g! u' G- a- N6 |" d% {: y' j一、数据爬取
& x% R, p, G [/ t/ R9 L- K$ T: k$ M- r
二、数据预处理$ q2 v5 c& e1 u* O1 b* `% m
: _" l: }/ |) {) v( B% P% M7 B6 x前言7 }3 c/ V+ Q8 U/ n0 M- i
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
* Q4 D1 q" `) ?$ O0 U6 x5 S) O4 x4 L( [' y
' U, N+ D2 {- J I
一、数据爬取
E/ m5 t1 ^6 e1 D8 M6 Jimport requests0 |8 S8 I, {% \2 {# Q1 K
import pandas as pd
9 V/ p' C: c& {9 t F1 Ffrom pprint import pprint
7 r8 N3 |) l" Z7 e, R导入相关库: w; q8 m; p! h1 j/ f/ i, r/ z
" c. K6 b0 N; F F* ]. I; srequests库用于发起网页请求,获取网页中的源代码;
& H8 I; B' e `* A. ]% m0 D% H9 C2 i
pandas库用于存储和读取获取到的信息;
! k/ d5 H/ u; z3 ^, m- A4 e. C- w! q5 R" D7 j
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;+ r1 n, G" @( T% ]5 `2 W! k
; t4 O9 h' C& R6 { d: H9 H7 hurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
& s' m; w, u$ g4 {4 g; k5 g: kdata1 = requests.get(url).json()
7 P8 a5 r. e1 I' b( B2 c# pprint(data1)
5 y$ Q' W5 E. |/ D+ E
: v) C1 `& p5 e, v; g3 x这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
2 L; \1 z4 O1 l7 O2 ^df1 = pd.DataFrame()
5 T. z* @+ R1 r7 Q8 _/ g/ Z% D' B) Ofor info in data1['body']['allMedalData']:+ r6 Z5 I1 N7 g- U# U' u) U
name = info['countryName']6 D. j7 V' m! B3 G9 ^1 o
name_id = info['countryId']$ W' w% O! K) Z4 Y8 A, T
rank = info['rank']
, q$ r& c5 c4 _+ G# s gold = info['goldMedalNum']# @. K. v% @" G8 h' n
silver = info['silverMedalNum']" {4 y5 h% C1 y' v7 B
bronze = info['bronzeMedalNum']6 {7 S2 s+ [+ }, r7 D
total = info['totalMedalNum']
. g9 X: N. M6 Z' ? # 组织数据
1 }5 I& c% r- z" @# j5 D0 E5 m orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]6 o* e; a" L4 }: ?
# 然后追加df
A/ \" ~/ R; A6 d: b+ G6 d df1 = df1.append(orangized_data)
# }( S9 w9 F8 ddf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数'] v. R. g- V& x4 l
df1
( c2 V; w9 e. g/ h$ |( z" R! ~ X$ P, i9 c- O7 q
5 i6 O" P1 P0 [0 ^1 i3 n* s
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。2 L' |7 ]: @7 c6 h. J% N
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
* j& Q [( E5 ?) A5 Z- @% q5 ^data2 = requests.get(url).json()
0 B6 m; c- [7 r, B. L9 z; }. v#pprint(data2)
6 ]' R2 J6 E! t0 z" q$ T: w3 y' \
2 M) E" i* \! g' U5 }df2 = pd.DataFrame()
[0 u# h& w+ z* ~4 Pfor info in data2['body']['medalTableDetail']:5 C3 X" F" O' k$ a* a
english_name = info['countryName'] v; {& k) z9 [+ B; R( T: q0 p; B
name_id = info['countryId']
; v5 D5 K$ e' m8 A7 B# g award_time = info['awardTime']5 X: ` R% Y8 { y3 h
item_name = info['bigItemName']
( y. M9 B" |; z3 |9 A& T# g sports_name = info['sportsName']5 [; B* \- ]" y( B/ y3 U
medal_type = info['medalType']2 |* H) a5 H3 c. W
# 组织数据
4 p% m' a: Z/ H0 O& z orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
3 D- L4 I4 |6 s5 q+ Z* @5 n! ? # 然后追加df
, Q9 h) g4 S9 V* N( k9 n5 I df2 = df2.append(orangized_data)! e* Q2 n3 ]7 z% `# [+ J2 T# g
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']) E& U; D3 o0 e# a, @5 y1 N1 e+ R
df2
' H8 f' h7 p3 i |
+ u) x# m" {, D对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 8 l; E# H; x! t
9 A# a6 w8 |/ M& g7 G
1 ], G' D+ o+ M! R, F v二、数据预处理
: G/ s( k5 [+ a5 j/ I( ]0 ^由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。& r& A& R: k9 ^( J. a
( I: s8 I: ]' |$ f |
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
+ i8 i9 G! C% e2 m3 Z x = f.read()0 }) f! ^8 \8 O# V q
4 o9 T4 u n. Q [8 t7 vdf3 = pd.DataFrame()6 v0 ^" o4 e" K0 a- q; N
for i in x.split("\n"):6 z% z) k- P& W
x = i.split(":")[0].strip()8 u' g4 p9 M) U" w8 L( a
y = i.split(":")[1].strip()
/ v( p9 V1 C% k$ h orangined_data = [[x,y]]
- `$ ~9 U3 x0 ^4 x6 c9 [ df3 = df3.append(orangined_data)
. d% m2 p! Z- w. v" o) {df3.columns = ["名称","英文名称"]. H6 l% w9 y* B
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)! K) B$ `, ~' {. P# V N y' O6 B
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
2 L. L; V' I/ Z; a" h* z! G9 \2 \# e2 r8 y
df4 = pd.merge(df1,df3,on="名称",how="left")$ U3 [# m1 E2 E8 f
df4.head(10)1 V! J' o8 Q) W( D1 c6 `+ T
/ ?7 @# Q7 N$ v, X! {6 g7 {' e, c' J' @0 k! ?6 h
表格df5表示运动项目获奖详情。
# C: j" h! N- S( G6 m) x9 D- {( p0 s! v5 o3 y/ Y
9 ^. |3 A$ N' \" e$ e 9 P+ q' \- h" z0 Z+ h5 N3 B* d/ n
8 R% a" W- J. z7 B) S
|
zan
|