数学建模社区-数学中国
标题:
Python制作可视化大屏(东京奥运会)
[打印本页]
作者:
1047521767
时间:
2021-10-28 22:35
标题:
Python制作可视化大屏(东京奥运会)
目录
_1 \0 ^$ N' m1 X) N) W
+ D+ M# J- h0 e$ {! w# E8 p
文章目录
$ w3 ^9 _" x/ E( @' m `
- e: S7 z* L* v0 C0 @3 ^
前言
7 Q o" L# {. q" s
$ \2 N! o. s3 m9 s
一、数据爬取
& U+ E3 i- _! @. k
, V! f" A g2 j' v0 E
二、数据预处理
- Y. }+ _4 B! j/ E- Y$ b
% D; i+ W1 E0 h0 C/ k& a$ ]; L6 E% K
前言
" \$ T5 ~. x5 H4 @' H: W, U w. f
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
! i' {2 P4 k9 Y
0 o# M, h9 H: l' S$ K
Z& {: v& Y: V6 o
一、数据爬取
8 L: N% H9 x$ X- ]5 r8 R6 Q L
import requests
2 M3 T& B$ e$ i2 Q
import pandas as pd
6 T% v5 p. Q4 p' |
from pprint import pprint
/ N# d* N, z, v- ~9 T
导入相关库
5 ~6 V: X4 X4 z! a* w3 z
. Y8 C0 J" q: Q3 k) K% R
requests库用于发起网页请求,获取网页中的源代码;
3 l( ]) w) p1 @( b, B8 ^3 [0 h+ Q
. Y4 E: a; P3 I3 x" j8 f7 D9 U
pandas库用于存储和读取获取到的信息;
/ D& R5 g% x% d4 u `0 `0 m
: w6 ^8 B+ y) z5 N$ U
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
0 L) P6 L b, n& V
6 H9 O; L' F7 |: ~2 _% I7 D
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
' y6 ]" X' N3 M) R7 x. ^
data1 = requests.get(url).json()
( n3 m" }, V* ?: r: p- w
# pprint(data1)
R# \8 l7 y4 G. S% P/ t' r
: l8 z% ?$ f5 ?' b8 F8 O
这里利用三行代码就可以获取到网页的源代码,利用
pprint
库,可以清晰的展示json结构,对于我们解析数据很有帮助。
* J( X- d4 o! S# |& D0 h
df1 = pd.DataFrame()
- E2 c& n- Q$ W5 Q( ^, v
for info in data1['body']['allMedalData']:
2 f1 ?9 u$ y8 L! z! g5 m- j
name = info['countryName']
- K: f- s0 H% \3 Z9 Y
name_id = info['countryId']
8 d9 p( v5 v% H4 L: P$ G0 O# ?; p
rank = info['rank']
. u q1 X3 ?+ e# S9 q$ e
gold = info['goldMedalNum']
( M) ]5 k3 T3 L# |
silver = info['silverMedalNum']
3 R. q* H% c- m( P/ F( j' i
bronze = info['bronzeMedalNum']
" _! S* p+ X W. ?: f5 S
total = info['totalMedalNum']
; s: Y9 ]+ V3 _% y% A k# ]/ A9 h
# 组织数据
$ Y) u- m8 `9 s- j
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
8 `7 C3 v" N& d7 g
# 然后追加df
2 T: @1 h" C* |+ |
df1 = df1.append(orangized_data)
+ x9 B& \5 Y2 s
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
9 g2 E) D/ P& i9 J$ e
df1
& z% _1 x2 v( J3 |
8 [1 I6 N8 w( L9 }
; a D9 E1 i* d' }+ v5 ?
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
4 y" q9 D& H# S- Z3 h
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
" T; }9 e; T! M6 s
data2 = requests.get(url).json()
2 O9 H% z8 U% @7 {* U
#pprint(data2)
4 J9 _9 w4 A9 M! n. e7 Q" I. J
" O/ O0 }2 u3 j$ E+ v' @0 |
df2 = pd.DataFrame()
! W" G3 l1 L6 n! }* v1 U& h: _7 X
for info in data2['body']['medalTableDetail']:
: H! I7 i( `1 t4 }- H
english_name = info['countryName']
9 @$ N9 w& r4 v+ @% e
name_id = info['countryId']
) ?4 }( d4 u$ t
award_time = info['awardTime']
6 x0 Q$ p M6 F7 e0 f m1 T
item_name = info['bigItemName']
5 A1 K# G% z; d3 z5 \$ }) n2 w
sports_name = info['sportsName']
" w3 C' J8 U% M; |2 g+ h
medal_type = info['medalType']
* y) X- b! J, L5 |7 ?4 x3 i) r
# 组织数据
* _! \; L- d& h$ i' a5 T
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
$ Z$ T2 ` [5 T7 L4 X( k
# 然后追加df
* D: m) R6 [1 p1 x6 F) U0 h
df2 = df2.append(orangized_data)
& _/ K0 u6 J3 ?2 \
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
5 @. y6 P; G/ A
df2
+ Z' l. h |: I3 s- Z# D8 O
& Z7 C# o0 s) c9 t4 X9 y
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
' _2 P% i1 T0 P
- x/ K, E4 }+ O7 d: X2 d3 Q. L( z
- o/ w& s; T- s
二、数据预处理
+ V2 k2 e$ n( D8 ^$ L! C
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
- U7 q8 a2 ~; Y y+ ]. Z+ b% ~! S
1 E7 e/ Z4 |8 n9 Z$ x9 L
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
( y% q3 W8 H: K$ p# G7 {' o
x = f.read()
1 d; m- |) G& }! M7 Y
$ ? ^. j' n7 ]4 V! \4 l! \
df3 = pd.DataFrame()
8 C! j3 E5 w5 J) A" z
for i in x.split("\n"):
& N1 E" C; S- |4 L) j
x = i.split(":")[0].strip()
# Y8 D0 E1 `- o, u
y = i.split(":")[1].strip()
; ^5 {* d+ S, ~* `
orangined_data = [[x,y]]
+ R# t- A8 `' Q* ?" c
df3 = df3.append(orangined_data)
( v8 M: p! K$ v$ _% r! R8 F0 w6 \
df3.columns = ["名称","英文名称"]
8 f7 k5 N8 ~5 \
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
; e% B/ A. x7 G. M1 Y' }
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
' j$ O7 b1 l; N+ g
5 ^& D8 m& J; t; s' Z
df4 = pd.merge(df1,df3,on="名称",how="left")
9 j$ x3 |$ `( e0 |3 Y
df4.head(10)
5 W6 z- ~6 a. D" J
4 A2 ~. W5 r* J* I
$ w: A6 v h) l4 b
表格df5表示运动项目获奖详情。
; Y7 O. M; u* d. a5 |
) f( S9 y' D4 F# l; G
$ @1 T ]7 Y. M" Y! U$ U3 p
8 K5 |7 J6 j9 f3 j7 [, e/ l! K
2 E+ h! U# U' D% h2 g& h
作者:
iolia008
时间:
2021-10-31 23:17
' T/ z4 N( N# W; g( c
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5