数学建模社区-数学中国
标题:
Python制作可视化大屏(东京奥运会)
[打印本页]
作者:
1047521767
时间:
2021-10-28 22:35
标题:
Python制作可视化大屏(东京奥运会)
目录
8 w( W# ? t" D0 M3 o1 {0 F
% q+ N; y8 H% t' |. n f% a
文章目录
: |- r& C! M' C c$ B3 O6 o
. L* G' ~# O! ~$ N8 N$ t" b) v. A
前言
' ]( u# ]5 j) M) }* W" M; ~4 ~- f# A
& h- S5 R/ q* A! S/ d
一、数据爬取
' U$ O: I7 K4 T8 Q# C+ u& `
7 m5 U* J1 O. O5 }8 ^: p% ]
二、数据预处理
% C* u" G; G! z5 O7 n
# q" ^- C; o# C) t& q
前言
& o2 Y- b+ }5 x: I
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
6 M* K( u( u3 x9 u
2 `9 Y4 b0 x; v8 R/ T+ E
6 r2 r e9 @ f8 @: E( C+ t5 R
一、数据爬取
8 s( a% ]2 m6 A4 A/ h+ b" a
import requests
1 @! f% r F1 |, N7 [* L
import pandas as pd
5 H: E) W1 }6 A# ?( ]! {$ C, O
from pprint import pprint
- a8 _# a$ s {, F2 q: F
导入相关库
$ u1 c! X" Y. p5 g, ]' T- o ]
5 x s& ?6 j, j1 o) X1 O8 h6 I
requests库用于发起网页请求,获取网页中的源代码;
2 z' @. _0 F' o! _' g" T
* |) ?. F0 u7 A; X
pandas库用于存储和读取获取到的信息;
* D& z0 Y% e3 E. n- v/ u$ P5 h
8 a6 \" e" K* e( U$ }0 f
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
8 R0 \! C* v" G7 H* Y9 `' U) b' D
& _4 A% F+ D& c3 H5 t, X: g$ A C4 b
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
! `% Z6 {# Z" Y; U: N
data1 = requests.get(url).json()
4 u( |2 V7 f" H% y: v- z
# pprint(data1)
5 t9 E: ?0 S; G' r3 d; u3 n/ B
. v$ g) C$ d& i& l* k* Z5 X
这里利用三行代码就可以获取到网页的源代码,利用
pprint
库,可以清晰的展示json结构,对于我们解析数据很有帮助。
% p" @8 i; J# k9 w
df1 = pd.DataFrame()
0 e+ C* T/ C) D( r
for info in data1['body']['allMedalData']:
2 g0 Z/ @8 p! K' q2 k
name = info['countryName']
) k, l: r' a4 r0 w
name_id = info['countryId']
/ A/ v0 A I4 j# T* x- ]( u% _
rank = info['rank']
, n5 C# J' D( f7 [* T; m' B( F
gold = info['goldMedalNum']
6 n4 \' d( Z- S0 X1 t! o# ^
silver = info['silverMedalNum']
E2 [$ ~( A1 u$ l! m
bronze = info['bronzeMedalNum']
( l3 y% g* z' R, U
total = info['totalMedalNum']
" e; d) K9 L+ Q! Y" t4 }5 b$ X, a
# 组织数据
5 s: U9 T6 r! V; F9 }* T9 `
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
& w3 v7 B. ] R$ k
# 然后追加df
. ?* ]+ z9 L; ^1 O+ N t
df1 = df1.append(orangized_data)
0 b0 f S9 Q% Q9 n
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
3 q9 j! ^' l' \
df1
1 P1 }5 H! c. \2 i0 i; [ _
' Y# x% H q- v7 c8 J* O0 Q
% k' ]! ]) I& l$ f7 h. h7 {! }
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
$ p2 _! v$ o8 J* c. p, u6 k+ E" O. Z% z$ S
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
% X$ p9 i9 q/ X
data2 = requests.get(url).json()
+ S( W" i7 `4 ]) [
#pprint(data2)
- O* v5 ?' X4 K
! ^/ V) M2 @% S0 U ^* {5 u. C
df2 = pd.DataFrame()
! a2 S( \/ X6 V
for info in data2['body']['medalTableDetail']:
3 ^+ o( \* ?4 W' k' X7 _7 l
english_name = info['countryName']
( Z- _; ^9 @0 F0 E0 K6 B J
name_id = info['countryId']
. S3 P$ U& n! ~
award_time = info['awardTime']
1 @" D) N8 z3 n5 U
item_name = info['bigItemName']
8 w# n# C3 V: ~0 X- ?2 N
sports_name = info['sportsName']
$ q: V3 A0 V6 x2 ?) ]& d, W
medal_type = info['medalType']
- u* ^3 R* q: _: j. X/ U1 g" K
# 组织数据
! w$ z3 f, @$ \% a6 {/ C& U
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
5 {3 y! R8 G$ i
# 然后追加df
- r5 F# K. j) W1 y6 u/ @1 a* V
df2 = df2.append(orangized_data)
8 {' f% k( r. E1 [$ _6 J
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
- a( W' g$ ?$ B+ ^) N/ `
df2
) ]$ B9 y( N- _; D$ i2 b
1 C/ S# E, {6 a* O. H0 x
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
: m- H2 Y, a% C3 H
0 R. E/ U3 G' \% R$ g; c
9 k% e7 u' \1 ?7 ]" f
二、数据预处理
) X0 ~) Y0 { d% j/ |$ o* u
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
& V8 t0 a+ a6 Q* o3 I
1 w' F7 b' R5 V5 n! _) M
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
& U1 ^) A8 k- o) w/ P! B' t$ V
x = f.read()
( k' |0 ]4 v0 e( ^
' k A* O& q# S, l% H
df3 = pd.DataFrame()
2 c/ n( A0 w" Z8 m
for i in x.split("\n"):
1 `' a, W0 A# Y
x = i.split(":")[0].strip()
) r ]1 g+ u( u, e" U
y = i.split(":")[1].strip()
! b' }) B2 W8 L. h
orangined_data = [[x,y]]
& }; h7 T( F+ ?- m
df3 = df3.append(orangined_data)
% a5 y( C% y( \4 M0 i
df3.columns = ["名称","英文名称"]
8 S1 u9 }1 \+ @3 e9 v0 I
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
& N4 e H, u5 x$ b
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
# k4 l9 J) U a7 u, C
; z0 M' d0 K4 k* y% ]
df4 = pd.merge(df1,df3,on="名称",how="left")
, ^0 t T# ~8 C- u( S2 q, G9 R
df4.head(10)
+ X( e0 `: {% M
; W2 i( _3 [# s8 j0 d
6 [6 _( p- _/ J% _* [8 _
表格df5表示运动项目获奖详情。
( K; \6 o/ `! ^) l
/ @+ T7 r* R% b- W& ]2 z$ Z
) p* |, c' J3 x8 ?6 y0 e
% I) Z$ r* q' s+ o6 D- l% T
6 f8 [/ U/ ^" C) k
作者:
iolia008
时间:
2021-10-31 23:17
* t6 q/ C# E0 V2 D: Z
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5