- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40216 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12776
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
! t, }- p, n" x) g
2 [5 D# v* z/ H* ?0 y2 g) ]文章目录* x6 i: a6 O5 ^ ^2 C$ i+ X4 j
, x* M+ {2 x8 }前言
6 q6 r, A7 Y% c9 L" x% F! x+ y% O- `( A
一、数据爬取
$ P0 O4 r+ F2 P) \5 n) D3 Z
`4 p) c; [. o3 W) w. O二、数据预处理
1 a, J3 y9 W' X$ h
4 v+ I* k/ F8 A" c$ ?# N$ z9 r9 N3 {前言6 x, ^0 u P( Y. l
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。4 ?% n, b3 @4 a! u
4 a+ Y8 M8 b# R I2 g( d* ?
5 ?- |) U( U; W q8 J' k( a一、数据爬取/ m8 X1 B1 j8 _0 Y2 ~( d
import requests
/ ~% l1 n# r, ^& P5 g, H8 himport pandas as pd. x [7 r+ U, L4 @
from pprint import pprint
( D+ T$ `- H, T4 @- V7 ~- K' V导入相关库
. i2 K y& w+ L+ c# e. W' V) ^6 I8 B4 M+ V- n% f
requests库用于发起网页请求,获取网页中的源代码;
! f1 A, r/ Q9 Q
% c L- [+ L: n& Q6 ?" N6 }2 Q/ [/ _6 _pandas库用于存储和读取获取到的信息;+ R9 z \8 y. n& B, f
: t# Z* Z) `- ~! ^5 w* qpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;) V* J1 b: B% V2 K0 a
) m5 e7 [1 h0 R& v, @8 N
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'8 }; J: n; }! i
data1 = requests.get(url).json()
' w" a" q9 O# i. _7 D# t5 d# pprint(data1)4 W6 S" Y) M! ?- W& L" U) p& k
$ u) Q/ c9 i! ]4 O) ^
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。4 e9 J+ n& m7 r$ w8 [0 Z
df1 = pd.DataFrame()3 C/ `5 b: G+ [- |
for info in data1['body']['allMedalData']:; s2 k% ~1 j" X5 R: F- B- h! N
name = info['countryName']
) b0 o R( F4 t8 I# X! u2 [5 F, } name_id = info['countryId']# }! C- J7 i. |7 U, o
rank = info['rank']- v+ G, }: z8 v' W8 R- \( ^. N. D
gold = info['goldMedalNum']
6 v# ]! o1 m8 i silver = info['silverMedalNum']0 W1 l" b1 F4 y) _* W
bronze = info['bronzeMedalNum']
' ]: q$ z" u' i* r total = info['totalMedalNum']
- Q8 M- n7 r* p- f # 组织数据
% W7 A' `6 M/ d* s7 o' \+ \1 G0 J( K orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
; @# a) T6 I i # 然后追加df
3 g& U4 w2 _, m$ l/ l df1 = df1.append(orangized_data)
2 n" d* e3 K9 Hdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']3 S: N* E# {' j
df13 x" b; k4 `/ c
U0 z' D6 c6 x: C
![]()
* q1 o2 ?/ h) h2 n. E6 t9 r f这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。6 K2 E+ L, n$ \, q' O7 m/ Y- m
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
* E6 R7 ]2 j7 f. ~3 x; ?3 gdata2 = requests.get(url).json()
5 L* q( o% v' E- s#pprint(data2)% j0 G7 `# k9 Y: X
' h v9 F7 Q* Sdf2 = pd.DataFrame()7 `+ [! j* S/ [' B$ q" _
for info in data2['body']['medalTableDetail']:9 g+ r' ^1 X- f. k
english_name = info['countryName']7 L; K. h( a( C1 z) F
name_id = info['countryId']! X" {, r& t9 \
award_time = info['awardTime']" p- L; s$ s8 {0 Y" [. g6 @
item_name = info['bigItemName']
$ S9 a. L$ w2 j! l* s7 Y3 ] A! a sports_name = info['sportsName']! u( X1 X. Z9 z6 u4 i1 r( v, V
medal_type = info['medalType']/ y1 O0 J$ ~/ O5 j0 S! U
# 组织数据: S/ M& o: f0 `$ J+ c L
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
0 g: Y+ y! n, H' K # 然后追加df
V8 l- B; C1 Q! x df2 = df2.append(orangized_data); ?( m& Y& d3 }7 s8 g& G* k
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']! L" }+ N* d4 ~' X6 `
df2 + i. i- {- V5 T. }, G8 o5 ]1 u- V
+ K$ i* m* i- D/ X U对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 $ q7 h# e& i" O& v
4 q& u" [2 x2 N( m' n0 P# c# ?/ V
1 S) b0 Z& d/ d0 \
二、数据预处理
3 E7 y, |% `0 \& R Z' O由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
* O' ~6 j# j. c0 [! y# {6 Z' R3 ?, f& o- q6 z% E! C
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:# p) C6 N+ O" d% W+ y7 n
x = f.read() M& V% T0 n" a: a2 [; V7 i
6 d' z' ^: N9 Ndf3 = pd.DataFrame() @- v9 |/ `! V
for i in x.split("\n"):
" O* G+ W. `$ q x = i.split(":")[0].strip()
' d, r( C( d1 D8 d y = i.split(":")[1].strip()$ `- B. `3 G9 U3 {/ @- k
orangined_data = [[x,y]]
}- S0 r) F" H1 ?+ R% M df3 = df3.append(orangined_data)
8 ]2 Z* e" _! c% {& @+ a4 ndf3.columns = ["名称","英文名称"]
& z, d' ] U, a& T2 a3 s* h8 T8 Qdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None) R& n2 F2 b9 J0 P: T& w8 `
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。/ a$ f0 [- `1 r0 i! b
, d- y+ b E6 p$ M5 K
df4 = pd.merge(df1,df3,on="名称",how="left")6 a4 v! w P+ s) ]4 ?- R. q8 `
df4.head(10)
$ |* X- u2 \8 A/ g8 j
, W& S1 W" \0 x$ S& r% s$ G+ ?; Q![]()
4 W' N0 j' i% k' z8 y表格df5表示运动项目获奖详情。
5 ~# x8 ^/ K! g6 e6 w0 B
. F- t7 e3 s, I# g8 Q8 ^% g1 r, S2 h5 \( B, J a
1 A9 F4 G! t9 ]" x6 h' J
. e4 H& i$ Q1 ?( w6 L |
zan
|