- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40290 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12798
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录1 f4 ? t( G( o0 _# m. \
9 E5 j4 y" D# s' i
文章目录
' c4 N. x( z: `3 T8 E. T# E
& Q# m" E* F' b" V& i* N% r前言
; r2 m* b# R7 C5 z* s! A4 u5 U! \- E( W/ q2 `& a9 W' \. Y( p
一、数据爬取" J2 o. x- S, M8 y* X" `8 r( S5 Y
8 l- ^! ~8 v0 U7 I5 e" e n e二、数据预处理. r8 j: N0 [' h3 c
4 p/ k5 d2 h x& B前言. L) R, d/ y5 w& U9 c9 @7 {8 t' C
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。( o1 b' q$ H$ P, u
, I! K+ o- o) E( B3 `6 m; e1 A: i# F) m; C' w
一、数据爬取
' U4 R- i1 [% G* y. j5 L$ mimport requests
" t7 d7 f8 j3 Jimport pandas as pd
/ ?- D5 e ~8 r( ]0 F$ {from pprint import pprint: t. j& [: q# h' o9 r( g
导入相关库: J# S( x* k. J' e7 p
/ @: h: ~: J, Q. n$ m7 N& L
requests库用于发起网页请求,获取网页中的源代码;. X9 Y& C' n }+ P A- q# W
- d! z# ]1 _/ }3 u; y4 y
pandas库用于存储和读取获取到的信息;
+ Z- }- I1 N6 H; o& x x' t# i8 p/ u1 i/ H
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
+ b" m' N$ S4 L1 M2 j( G$ ^' q/ N# @+ B [3 [4 f
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609') Q1 @7 h0 f) r
data1 = requests.get(url).json()6 ^# m, ]4 i9 H
# pprint(data1)/ s% u8 |6 U' ^- Q3 J& U) B9 v$ x$ o
$ E* J& z- v$ \9 b. L
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。2 P! U! y- X7 U! G" c, q
df1 = pd.DataFrame()
: B% `0 [8 ?6 {0 _+ ffor info in data1['body']['allMedalData']:
4 l$ }1 i7 i* [, g2 A name = info['countryName']
: |; ]4 x8 d9 [" W8 m: L `5 {# z name_id = info['countryId']0 R: s( J6 a' n9 N# Y
rank = info['rank']1 [9 w0 G3 ^2 X7 Z6 C
gold = info['goldMedalNum']: r( w8 @7 d+ a% Z
silver = info['silverMedalNum']
5 p; y& I) Q' ^% W8 s" _/ W bronze = info['bronzeMedalNum']
* N3 c, {6 w1 ?( V) |0 `) ~ total = info['totalMedalNum']: i) j) N2 ?$ z* W
# 组织数据
' U4 y/ I4 O( O) X' i orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
% x/ ?2 s; i2 e, d9 ] # 然后追加df
' Z- ?: b& ~- M7 E+ Z df1 = df1.append(orangized_data)
& v1 A6 x' `/ M& S4 ydf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']( ^: Q$ W, K: [. _3 ~
df1. I/ ?) {& B1 ^$ u' V8 v$ ?6 e
& \7 S5 F" [2 o$ B7 {& v, G$ z2 x
9 z/ N0 k' F* B/ s B/ C/ W% U, U
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
( t" l. m3 _0 M) Lurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'. }: n7 x' S: u. L
data2 = requests.get(url).json()
7 _/ x* o8 o% O$ P$ ?- x; n) \9 ^, |#pprint(data2)8 {! a+ x; a) j2 F8 a2 E1 D
: g+ k; b! @4 |; g7 N
df2 = pd.DataFrame()
& i8 }/ q% p. H3 T0 S& W# Vfor info in data2['body']['medalTableDetail']:( I" r. i- o( e' U# e' o
english_name = info['countryName']3 }+ |& {; V* \/ S1 H. f8 i. p
name_id = info['countryId'], T# d! y0 i; u5 M* J) k5 E
award_time = info['awardTime']6 X& n7 ?0 e( o8 | Y) g
item_name = info['bigItemName']- ~2 `& B: ~; e4 U0 i
sports_name = info['sportsName']
" Q& l6 y* j) |) b, l% n0 `7 ^" q medal_type = info['medalType']
, t$ k" S) L x" [4 ~9 ` # 组织数据
( P& [* |- D; t7 W0 B) ` orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
6 w7 z/ s: M, ~" I" n8 F D # 然后追加df
) t% {# f$ h' {. A% w df2 = df2.append(orangized_data)
* ^, N( j: N3 `( |3 T" r. j" pdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']2 }8 h* o8 ^( s
df2 ' A) y) k. I9 M& S
- O, Q' h- U# c: n. f; n对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
s7 f& i$ e: @, j9 s0 M2 E$ _7 M, w6 D
& @% d* Z! ~2 W% I; o$ e! [. R二、数据预处理
( \+ J: Y' w+ P& b. R由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
# F) i4 x2 l7 P4 p) D6 S5 k2 j* n6 R7 M0 z* o. G0 Z Q
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:) G( L7 _1 A9 f" m. d6 z' c7 o
x = f.read()
! c# h' {' E3 i7 D+ T+ i7 a9 ?; @+ n. Z% _4 x& c7 \, a
df3 = pd.DataFrame()1 u3 o* s& [8 @: |" p
for i in x.split("\n"):/ u% A9 V& E, Q, f( X! _
x = i.split(":")[0].strip() E8 ^* P0 b' d& @. `2 A
y = i.split(":")[1].strip()$ |. X; _9 h9 S8 `
orangined_data = [[x,y]], V6 x& `9 e8 m/ b$ \* t' \
df3 = df3.append(orangined_data)9 m E; ^) z# ~3 D1 a* p
df3.columns = ["名称","英文名称"]
: ^1 G$ i. q4 u" r) ndf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)7 d# r. Z& I4 s* R6 F
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。* F9 A: S* E3 H. l8 v
9 \( p. J u2 q N( X
df4 = pd.merge(df1,df3,on="名称",how="left")
6 K2 j3 D" c r4 q9 ~ Xdf4.head(10)+ O6 u. D8 t, y. o( l+ [' H8 i
' j$ C% t* K. a0 l
![]()
' Z- h5 \ { y' E2 V表格df5表示运动项目获奖详情。
7 m- Z: \ K2 {$ q
6 b8 L; q' [8 m; ~, ?+ ?, [8 b c% I2 p# o+ j
7 e" b1 W8 u& u3 [2 w# V
* f& D6 \7 q( F5 v" w* n |
zan
|