- 在线时间
- 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
- 自我介绍
- 数学中国浅夏
 |
目录
+ c1 U& |4 v {& Y
9 `- f& T, g1 [5 F% q文章目录3 }$ A4 `# D0 a$ i. b" t. x8 ^
8 K' s, A5 n0 o I8 X5 X9 C
前言6 Q/ u! b) k$ _8 O4 W& [& k" B
% }8 c/ x' V2 @0 I& ^: D4 E: M一、数据爬取! T9 n8 @( ~6 B2 F- C; s
) f; L6 p. v7 b) y- Y
二、数据预处理
) l; ?8 p& r2 `8 q$ M9 `
' J4 h/ B, x! K0 W6 [前言4 [1 U0 I: r. ?1 z" k' T
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。+ I0 P9 L$ W1 u0 j. e h, G
1 w' x6 n* e. h7 j, |; E4 e( F# |+ d8 P4 Y2 j0 Q
一、数据爬取; Q+ }- s; p; b. M3 ?7 n) J
import requests3 b. w, y4 o2 _* ]3 |# T) V3 v8 O: e1 E
import pandas as pd
2 o4 _: O: S+ R& }4 O. R W7 e; s4 bfrom pprint import pprint
, q. d+ } j9 l6 j5 Z+ z/ y导入相关库4 \! l9 u4 a5 n A0 q# L r8 v0 [
' p" T" q# z F, j
requests库用于发起网页请求,获取网页中的源代码;
& E2 Y- L. X; c! W, Y2 Y. Q/ F( e7 o4 t6 R$ R' C
pandas库用于存储和读取获取到的信息;+ h1 Q1 ^& M- r. D+ L
' @+ ?% L2 O8 K! `
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;5 I R( ^8 ]* z+ g" {; e# @
* r+ H2 @5 e& e% o+ ~$ ^6 R% D
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
1 g, e1 G: y5 a+ I$ ^data1 = requests.get(url).json()' c1 h% u& N( X3 L7 q3 G
# pprint(data1)
- z: |- l% y2 Q, P9 W. l$ o4 c
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
, y5 h: S, d3 \5 t, M' C3 ddf1 = pd.DataFrame()3 X1 j4 o- }! z* J. f$ D
for info in data1['body']['allMedalData']:
/ r+ n1 \9 Y7 N& j& q name = info['countryName']
- i! h. t8 l: P0 Z name_id = info['countryId']
: _: l w; U. m; r* J2 s! a1 X& r rank = info['rank']
. ^6 H" e& g5 z0 E2 V gold = info['goldMedalNum']
}2 N: Q: D; u* W) F+ m silver = info['silverMedalNum']5 R r& G: u/ `( N2 x, z
bronze = info['bronzeMedalNum']- j1 X0 `1 L4 W. E9 A8 B0 T2 E# g0 V( p
total = info['totalMedalNum']. W7 E( T" o! j2 B4 \) x
# 组织数据* j$ i! p; K7 ?! a; x) _* P
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]. F0 [$ O6 l- s( [3 |
# 然后追加df
' c+ x4 s$ D8 N( v* i df1 = df1.append(orangized_data)4 M, M- Z! l. t- F
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']$ Q5 ?: V Q c
df10 H' |, _' x7 p! Z% ]. M) g' F
1 w7 K8 h/ _" k4 A/ M( B - J& e e9 p( M% G5 ^; @) w
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
) p3 N6 t& H3 \5 Q5 kurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'4 o; l2 v+ k# V* t; |
data2 = requests.get(url).json()7 W2 h% Q2 d8 L2 L0 L
#pprint(data2)
9 ~2 V: s: ^# M0 ~
: ?; F2 S5 q" C7 X5 b0 ~df2 = pd.DataFrame()
$ S% J; k$ S1 G3 n3 G9 H/ ?$ pfor info in data2['body']['medalTableDetail']:
g/ Y8 \5 }& W5 w P' i0 u" d english_name = info['countryName']2 | y8 H% T y( I( G7 |
name_id = info['countryId']
* E' [7 Y6 a/ }8 [0 h/ \ award_time = info['awardTime']* R' t- E' s/ l# k4 B. X, P
item_name = info['bigItemName']. q! p9 N/ m- y% ?0 P. I: o
sports_name = info['sportsName']) ~- d) C+ n) ?" H5 S! K2 s5 x
medal_type = info['medalType']: }) ^6 T6 _" c
# 组织数据
- `* A$ t: b# s% J- c: }, P) ~7 y# h orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]+ W M. f9 c/ h _9 P
# 然后追加df8 s* e/ {2 t; e' ^; x ^" X8 d
df2 = df2.append(orangized_data)
" V, u, O, _% V f idf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
4 x6 r: \( y- ^4 k8 b7 x' Zdf2![]()
& A5 N; m4 P- @" w: G; q; l, x
" V1 k- d5 X+ d对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 0 l2 Z4 Z5 b! e. @* G) P1 \
; H: |3 n* f7 ]" Z8 B3 @6 \, e
9 k6 _! j& m8 h% }% X二、数据预处理
2 { t ]2 Q5 ~% T由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。: t" Q( F9 m# e s
1 p1 l/ q! I' Y8 j; G- O
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
" P7 b9 T/ l/ W5 X6 @9 X1 t x = f.read()
$ O) t: w0 @3 V& N& {# d: z6 K' x. W4 H7 d) S3 x
df3 = pd.DataFrame()% m8 c" H1 y2 G5 ?% g7 P
for i in x.split("\n"):. j0 B. _( k' ?8 X2 A4 f4 {! R' T
x = i.split(":")[0].strip()
8 L6 M% u; z# t( a9 @ y = i.split(":")[1].strip()
, ~, w6 ], y/ q, A+ p: ]* t orangined_data = [[x,y]]
$ h, V, E2 A9 d o df3 = df3.append(orangined_data)6 ~4 ]) w8 d X# w h
df3.columns = ["名称","英文名称"]
; ]3 q# l# Y. A4 Q7 Z5 X2 wdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
" S7 N# @9 F' W/ T表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。% X9 E8 v, } k, e- t
# Q" j, j5 g0 a% `# T j
df4 = pd.merge(df1,df3,on="名称",how="left")
' [- g' _( c+ |/ f: M4 {0 I; {& j' \+ Ndf4.head(10)) v2 Z @$ |2 g5 u
# u- b. r4 c' B% i! I ( W) H5 J' }) V$ s2 B: k3 S& b
表格df5表示运动项目获奖详情。 - + P+ z7 h' D2 f5 c; e
& u9 y u: v4 }2 [
4 Q* _& f! I# z$ R B. }, j8 S1 X, s
" U3 s! F; F" ?$ a# U" O9 a4 H; Q |
zan
|