- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40325 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12809
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录3 B$ j2 Y1 f t* B0 |2 ^% d
: P8 J% M4 M. a/ p4 G- s) F: P3 w+ j9 w文章目录
3 n E% N* Y* s/ ?2 B
$ _' D$ M1 S" \- ?) D前言
- M6 ] c2 d& n4 U: G; n Y" I( }5 f1 R0 v- B
一、数据爬取
! p" R- c1 Z& I# K& {/ S3 e
: V: A0 d" O7 G& f二、数据预处理
- X2 I# Y" ~: @" |* N$ `% Z5 t. U$ s! Y
前言
0 [: V2 O/ Y& u本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。) B$ o( o7 [9 \! S" ^6 _3 \4 c' ]2 s
' c- o6 R, |" A/ E* y8 I2 e
2 J) \$ Y4 p3 Q, i一、数据爬取
: v2 u( ~' E/ \) M5 B4 Ximport requests
) W2 `* R# L- L! o8 Y0 I2 O3 Nimport pandas as pd
( H% O2 [3 R; i+ I2 G( d$ ~from pprint import pprint
; R4 W5 x+ k! K( Z导入相关库
6 `" C: X+ g' d, q1 `0 ~4 B7 Z! V c. U
requests库用于发起网页请求,获取网页中的源代码;
+ k- t. h: i; R0 k) g2 ]+ k3 s! w. d+ i+ ]0 L; o* ?
pandas库用于存储和读取获取到的信息;
& W- s6 _$ O% }- [' }& x5 ]* q6 }8 F4 \- L; A( _2 ^
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
* p; n+ X- u* \: Y2 z3 R* P+ |$ q# J0 h0 c& ^! v
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
4 p; B+ m! V/ v( o% `% g4 u rdata1 = requests.get(url).json()) n. N' E1 j% C i
# pprint(data1)
$ u/ \* b: N; z$ F( K
. n4 O2 [" M3 H T6 n) Z5 c3 Y这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
7 H2 s3 ?6 d+ Gdf1 = pd.DataFrame()3 j: Y, P. s! P2 p
for info in data1['body']['allMedalData']:) w9 G: A/ f0 U! ]0 p
name = info['countryName']
q; y# f, f& v4 S name_id = info['countryId']
$ t% a) Q {* c$ t rank = info['rank']
7 ^9 G) o' ]+ B& R/ k gold = info['goldMedalNum']" }/ C F: t1 b5 F' R/ r
silver = info['silverMedalNum']* ~: c5 [( a* k: v+ L& C
bronze = info['bronzeMedalNum']6 F6 x% f p% L" y% S% n' K6 |) k- @
total = info['totalMedalNum']; ^7 D- C( P r5 ~" c5 q
# 组织数据; L* ?, z" X& f* L
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
" y, z) j; f- P! b9 O! O: l5 t: H # 然后追加df
4 ^& `! O0 ]3 u( ?$ ? df1 = df1.append(orangized_data)
! H' ^. i4 s& U3 m6 a! x5 S% r1 Edf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']. _/ V; h9 D4 H7 }9 N- Y
df1; K; K7 C( x& L! d) c7 h! ]
! C) ?% P- k3 J$ A, \/ t, X![]()
& f' n2 v. e+ v+ g! A7 D这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
) d. K3 I7 h7 X" s; h, ourl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
h4 v& N) K" F+ _' s1 T3 ddata2 = requests.get(url).json()
' B- D# B3 z- ?3 h6 e#pprint(data2)
2 O5 r- Z1 l$ c$ r; `9 n! U
% i }- c( g* c0 o( Tdf2 = pd.DataFrame()' w4 X# b6 v! u* k C7 c
for info in data2['body']['medalTableDetail']:
5 C4 }! [; j# P8 w english_name = info['countryName']/ B5 A' m# q8 M& a5 ~8 H! ^ t
name_id = info['countryId']
9 x6 D5 M# g. n, I$ ~ award_time = info['awardTime']% K3 t4 T- w7 H5 u: `; O# i0 Y
item_name = info['bigItemName']
& n4 P# y3 F$ P) y5 a3 o sports_name = info['sportsName']
2 C7 R k- _* u% w9 O medal_type = info['medalType']
! c0 h5 T( U# `' k! X/ ^: K # 组织数据1 D8 Z( {) k# C& h( `5 v9 u
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]5 s) f4 G% d& R4 L: U4 w8 F
# 然后追加df/ \6 {0 O8 C9 b# R: s; D" M7 t
df2 = df2.append(orangized_data)
% l c8 c2 k. P# ?# hdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% u: S0 N) V; R! O2 A
df2![]()
, e, g8 Q% w k& i5 T: N/ S$ Q1 b3 V# m [5 Y. c' F. H
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
/ a6 [4 J$ m/ @1 f4 s9 E% X* L# b" x+ g1 d* n" Q
) H1 U Z/ m* K7 z
二、数据预处理
: N# C* J8 C0 a) D0 y由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
: l: ^) |* L1 `, R) H5 |# h, e, ]; ~7 ^2 { G% w. }
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
. r+ l( b5 i6 k& `3 t- s' w x = f.read()
9 M3 c# ^: |+ x, F) ^' F8 G. J/ e8 H+ ]: I
df3 = pd.DataFrame(), i& |0 {" t) I: Q% W
for i in x.split("\n"):/ b5 A- c2 J0 k8 p1 ~% F1 u4 E
x = i.split(":")[0].strip()
' Q8 s* J, h# M) e: ?. ~. n y = i.split(":")[1].strip()
1 G$ Y9 q2 U, Y! } orangined_data = [[x,y]]
' g5 n" o& Z# A J! d: x df3 = df3.append(orangined_data)9 P: C! {9 V8 T4 H* K
df3.columns = ["名称","英文名称"]/ z+ j0 P2 s2 |3 I" N8 M- r( i
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
, H2 `( I+ j6 W2 r- z, _表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。) |5 ~( \1 |/ i9 k; U
+ a. Y, K. R8 n/ Z2 j0 ~( A( d
df4 = pd.merge(df1,df3,on="名称",how="left")
& T7 U6 B+ R3 ~- d) wdf4.head(10)
# I4 ` a9 l8 k( b& [8 M- [) \+ n. i% d y8 i0 p Q! {
4 p. w+ c- U# ]) U, ?6 z
表格df5表示运动项目获奖详情。
% _- @& x2 f* H* K% [' Q5 o/ l; n8 q7 t. h! k7 h+ m) h. S
9 E2 ^: X' @( ~9 l* P {; Y& C# w9 ~! J3 ^; x % V% O2 ~( {" k8 S8 P
8 E7 S7 T# n/ L, k* n5 _- k |
zan
|