- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40021 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12717
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录2 e/ P7 O) S1 N, ^/ } D! L. I) Z! N
9 d; m9 |# x7 z a# B$ M. h文章目录
/ K6 r5 K8 \/ q* Z
" p% A8 f1 t9 o; n+ N- y% x! ^前言
0 Z) ?2 ]7 F$ V/ w) ^& g; |* t0 z' i9 v+ G* ^: s; q) P. F ^+ f+ u
一、数据爬取
& b& v$ m# `; M
+ A) g* u' h" j. d二、数据预处理0 }: v- K0 v8 i3 [5 J9 z! n
* d3 U6 \6 s$ X( K# t
前言+ J* ^6 Y1 U, n) E4 K/ Q
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。4 H, X9 M2 h3 v. A8 y2 b
V d& u: ~. p& Q8 l) w
# [ H6 M$ x; e4 ^: U) U一、数据爬取% _9 [ B+ ?% H9 D
import requests6 ~& N' R" I/ b( \1 h
import pandas as pd
# D* s" t% J' y0 F. T5 Pfrom pprint import pprint# C V4 I8 }+ d5 @; s8 Q) S
导入相关库
, M& M- p! r$ x! f) N. _3 h! O! x s- \+ r: X( [
requests库用于发起网页请求,获取网页中的源代码;0 O; A' J/ m5 q8 Y; s* `$ g
' D) T1 A! L! d0 c, y( c+ p* epandas库用于存储和读取获取到的信息;
" }! Z+ b0 _: f) D8 c; d; e) l6 r @: F; M# h( p7 O' C
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;/ K* J( _& U k$ ]
2 \9 c, @ B$ M- u7 u
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609') ~7 X- \8 A* c
data1 = requests.get(url).json()8 W5 x- p: P. l9 B2 a+ _, B: S
# pprint(data1)
! o& {1 ]) A0 }9 k6 G1 v2 \+ p2 Y+ n7 l
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。7 d6 Y g0 u/ {/ r/ B, U8 T
df1 = pd.DataFrame()) X) C: Y7 A# Z# c& _+ h
for info in data1['body']['allMedalData']:
9 D2 g9 t& X! y name = info['countryName']1 M# `- v) d/ G/ r L
name_id = info['countryId']
/ E+ t0 _ B6 x# x: R* U2 M rank = info['rank']1 B/ {0 @; Q0 ?* B
gold = info['goldMedalNum']
. ^4 p6 J1 E; H" Y+ G) f$ L" R5 \$ [6 Y silver = info['silverMedalNum']
) @! _2 O5 z( M P- u bronze = info['bronzeMedalNum']' n7 r7 Q# G5 G3 ^
total = info['totalMedalNum'] I2 @, ?5 J7 r" Q( y% D
# 组织数据7 A5 l4 \ H: {& z9 s
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
$ x* Q+ D0 h: C' Y # 然后追加df2 Z6 D( J% v1 [/ C' K8 K5 a
df1 = df1.append(orangized_data)) i4 p; ?, ~9 R9 B( `' r8 T
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
" Z9 V& ]' u U, Z8 f, Gdf1
; [7 N% @: j) k' c7 s' U% j. ^) O: k7 @) C
, ]3 z! z" M- r" r
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。5 ]4 f; b1 `8 b4 k% A2 \5 |9 [
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'( C4 z1 k+ W# m0 ^7 c
data2 = requests.get(url).json()
7 O6 Q3 w7 Q7 w3 b8 t#pprint(data2)& D6 Q7 k) d0 w3 e; J
5 u; {; v0 S; O* i4 E3 B6 udf2 = pd.DataFrame()2 }& }2 E2 u" [5 Z
for info in data2['body']['medalTableDetail']:! t' D) N, ^$ ]9 r; o' A$ M; v
english_name = info['countryName']
) A* M+ q e l2 @ name_id = info['countryId']! b& l8 W/ I. b/ @8 h
award_time = info['awardTime']$ U# m- t! ~+ ~. a+ B( f' X( z
item_name = info['bigItemName']+ R# e) B1 V* Q0 y' K
sports_name = info['sportsName']
; n; z, Y4 S$ v: x: g; F; G medal_type = info['medalType']1 Q" m/ \" a+ _+ F! u( N
# 组织数据7 g* F! d# x# S, j" J6 Q
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]( x* Q. J2 E. F. f+ h5 `) n( Y
# 然后追加df
% q0 l. F/ _: s: q& u# D df2 = df2.append(orangized_data)
' L6 q$ ?9 N" V2 R& X ]1 e4 Q; Rdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
3 _0 H7 T1 \0 l' @df2 j3 { r+ Z% m/ c: v. a9 L
/ S; d0 d* Y! C. s2 g对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
" b9 B- ]5 T9 L& j' L
+ _+ f: c. m6 @) j, d9 T8 r$ I3 [, i, Z; S T! h$ Q+ F
二、数据预处理$ v3 R" x/ X& m% a$ @
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。$ y6 ]$ Y. W( L5 o5 |
7 `* i3 v+ M5 ?5 y7 k p
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:8 j2 A7 i/ C. K( h6 Z( z6 @ O
x = f.read(); T: I3 z/ ]$ F- b4 x
1 s! D& O( T2 c: K& ndf3 = pd.DataFrame()3 q0 w+ M$ c, t4 B
for i in x.split("\n"):0 i1 Z B) N; a/ h% B# d( i' |% u
x = i.split(":")[0].strip()% f2 z' w0 ^ I" H
y = i.split(":")[1].strip()
3 C' Q$ [: ~- d) M/ L+ n6 k' _ orangined_data = [[x,y]]
* o# u8 m/ I$ ^+ S df3 = df3.append(orangined_data)
2 k# u, _5 Y2 ]' c: z2 pdf3.columns = ["名称","英文名称"]
' W# r, R# G% k4 \4 {6 Y- Q7 fdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)& J: N3 F7 T6 y1 r$ A
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。* G3 D( e0 M* R3 |' y) ]
! W% J+ O- y/ _9 I5 n
df4 = pd.merge(df1,df3,on="名称",how="left")
8 @* T3 Z; \- q; Hdf4.head(10)
! @- h0 D, {! ^! f( V
) r1 R! P) p' c $ k+ Z5 H5 h9 c% j1 B A
表格df5表示运动项目获奖详情。
2 t- @+ K- _2 S" p" |7 X4 ^
6 d3 S% g G, C9 o9 s( Z* r: h# g2 ^: H( j0 t* c7 t, K' G
: Q! a! V; M, ^. e A6 c- e
3 A7 D% ^5 N$ Q4 k |
zan
|