- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40239 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12783
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
- N* |4 p# p& v3 d
8 M8 L4 G7 p, f' h; Y- S文章目录! J+ ~; i$ X y, r: W9 F3 l6 O
' j) c W/ r( H7 g9 ^* a
前言
( [6 D. t9 B4 j6 A* t" M n0 e# u, H7 \& @4 X8 Q1 o
一、数据爬取7 v& @' }: i+ D, P8 X
) ]) H. k B0 o
二、数据预处理
$ [" {: s( F" u
+ h3 y% s% C, P. [6 m前言
# A$ k- e$ w$ l6 m8 j9 c本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。2 q& }3 w: m8 w; M _+ ]' U5 y
5 `; _, V: P, [+ T, s- N
# \' k0 P7 f( E; U1 ?0 a! x1 P一、数据爬取% X% t& ]: E. Q, A
import requests* ~3 f+ N) d, U0 X6 j+ X3 ?( h; M
import pandas as pd- i6 _0 f" a6 c* l8 U/ B5 |
from pprint import pprint
# H1 m9 {/ `) M3 K& D; W导入相关库: Z; V2 j' a, s# g& X
/ X/ m6 T x# m6 H! B9 trequests库用于发起网页请求,获取网页中的源代码;& D9 E) \$ T) L% d4 ]3 x0 U
, I9 M$ Q* B4 {pandas库用于存储和读取获取到的信息;' c, J2 j; ` j9 X T
& i* b4 F4 r' Y7 Apprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
! q# f9 F% U' ~5 h! d; y% c6 m6 y! \4 p+ S8 }
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
' s) G) S! P9 Odata1 = requests.get(url).json()' y7 Y/ |7 Q1 U, r
# pprint(data1)
. j! I9 s- h. s, l8 h6 }: o# ~7 Y: N7 Y% b
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
+ w% x: E$ k- h. ^df1 = pd.DataFrame()$ O! Z4 T. \+ t/ z
for info in data1['body']['allMedalData']:4 M- r+ X9 X# I' e( k
name = info['countryName']
8 b& D5 ^) @; q$ J name_id = info['countryId']: a# b. h/ Z7 \7 \- I
rank = info['rank']
0 ~1 a" v" a' J7 z3 w) i t* I gold = info['goldMedalNum']
6 ?$ L- v" _' Q: S silver = info['silverMedalNum']
, K9 B7 x* p$ } bronze = info['bronzeMedalNum']9 g Y& ^ f( ]7 q
total = info['totalMedalNum']7 g& T; v, X: T
# 组织数据/ R0 o" u: k5 B+ j% m+ ]7 O# h
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
% M+ m9 l4 U7 `% {+ d: i9 g, J! ] # 然后追加df
0 J. ^( }1 r/ F. N/ j" s6 m G0 n df1 = df1.append(orangized_data)2 a! ^# U$ n( \4 _" G# ?8 u0 a
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
; M/ l3 x( W; Idf1
4 N8 c/ P* @5 ~0 s1 ]( y+ U0 U+ p
& k" o6 I* f( g) e+ \$ L1 K! g![]()
) g' Y3 q. m' t' Z. G; d这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
$ F& I$ a8 J: R2 Y, A: A( N9 Zurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
% h6 o+ n0 V5 h6 Mdata2 = requests.get(url).json()/ C8 R5 B8 Y3 `& Q; X
#pprint(data2)% _' n9 Q- p- A, ~7 m5 _
6 D# {& }$ L% i* `9 h$ t" A
df2 = pd.DataFrame()
: r+ O- N& e. }) _( tfor info in data2['body']['medalTableDetail']:. J* v0 a) o9 a0 ]5 n$ g) _9 c
english_name = info['countryName']
4 D( p7 R& Z! ~% `8 N name_id = info['countryId']
4 [# f0 p# e1 C8 }- [2 ]0 G1 ] award_time = info['awardTime']
' u" v1 O7 `0 D+ N' [ item_name = info['bigItemName']
5 E: Z* q2 ^- W! T) G sports_name = info['sportsName']
. v1 f" i; \* [/ a medal_type = info['medalType']" H4 b9 S, m6 E/ `* y) T v9 O
# 组织数据
, G9 v# Z% d( O+ @8 h; a orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
\. z3 ~! z% h, e7 k1 i) U6 l # 然后追加df. L' j- c! x& ^/ a5 Q i
df2 = df2.append(orangized_data)0 L; P- m8 h0 W, k# b! Q" G8 O' B* {
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']3 c& P! p! E A! g% y% R
df2 * ^7 T8 ^& x& \; o4 N
. O/ a0 @' ?) Q5 A/ s$ t. m- C& K对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 4 u6 O# \6 A: X) H6 `7 J
2 `4 [! I8 \0 V! T/ I7 h7 }( H
/ X I6 Q M* ~2 f* [二、数据预处理
r% Z/ Z7 V; R由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
9 {3 x; @6 a+ M" Z! p% X7 M3 E) I) P% K: T
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:8 N+ n% L' F6 d6 @
x = f.read()4 D2 r b( Q" {* Q: l
* Z# ?- f }( Q1 D6 Z4 L7 u: Y
df3 = pd.DataFrame()
; |" U6 Q x! Q L1 k# o# q2 R Efor i in x.split("\n"):2 v' y( c) P4 {+ {5 g
x = i.split(":")[0].strip()7 w3 @4 B+ x/ G9 a0 t
y = i.split(":")[1].strip()* R5 N$ r4 D, ?* b" ^' }* b5 `
orangined_data = [[x,y]]1 x. `& N& s! z, H3 d
df3 = df3.append(orangined_data)
I; r& n, _; Qdf3.columns = ["名称","英文名称"]; j/ D) B) M8 i/ W* o& M
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None); o/ z2 [$ o Y, p
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。- G. j' X% R# L* _/ ^
! m& p0 T( o2 Y; Sdf4 = pd.merge(df1,df3,on="名称",how="left"), J! O& H& B7 f! I
df4.head(10)* h# N7 T- g6 y8 e
: _& f6 q2 R9 Y6 J
. u3 I- K1 `% k$ ~: f3 ^
表格df5表示运动项目获奖详情。 - ! m4 U5 I8 [- a+ B( Z7 @; B
2 R! s( n" {7 m2 N$ A: X; O, }- W0 S3 u$ g
* v6 x9 P: h) q3 H) R: t/ a* y6 Q
; h' U4 Q w: J$ ?. V2 R
|
zan
|