数学建模社区-数学中国
标题:
Python制作可视化大屏(东京奥运会)
[打印本页]
作者:
1047521767
时间:
2021-10-28 22:35
标题:
Python制作可视化大屏(东京奥运会)
目录
9 t; z9 f$ Y4 T4 m
# I) L& L2 _" q2 D5 B# B" |" k
文章目录
: T1 |$ I0 u# N4 K2 v7 d: |+ P- O
6 E' Z( D) X$ \! M
前言
7 G V: g9 C& D; F; F! o2 l
' e4 f: n+ L3 i, E
一、数据爬取
# I' o, h& I. Z1 T
' E- x- H5 r7 X' w2 l9 P+ a
二、数据预处理
: H9 D3 }) h S9 [% y- }* s0 j
: H1 H# m( i" Z [9 ^
前言
! T I6 Z# U6 H7 t) t+ s" x
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
, w: i1 P1 ]; Q9 q* ]7 w' V5 C0 \
' P- x( ?( Q! P* ~4 [2 c& B" T% \
0 H2 p M3 K6 O$ O0 U* R
一、数据爬取
1 S' N& w) A1 t
import requests
) A* |8 C% W9 t$ u, X; @
import pandas as pd
( Q8 Q8 e! _7 n: o* e, G8 ~$ E
from pprint import pprint
+ N s1 s! c0 |" P6 @' R4 k! u
导入相关库
1 d" M: f4 }, G! o! t j" z
% ~& _" R/ X. p7 }) k' Q7 |& v
requests库用于发起网页请求,获取网页中的源代码;
+ M& H0 c `- @' M7 W1 p( {
; t# I. V- K# }3 n% C
pandas库用于存储和读取获取到的信息;
# x8 @ {6 j* T
, n" g4 h1 `8 y8 E# _: Q
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
& t$ Y4 e- \+ L# k7 N2 A
5 V& a4 {, o6 w& Z0 V
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
3 J/ M/ A" X+ U, _! u/ S9 [! m
data1 = requests.get(url).json()
8 Q' n r0 t9 L1 Y" Z
# pprint(data1)
- p) R9 K8 k( N8 F7 q7 \* n# Q5 L
8 U6 A5 B* M; P( Z$ Q
这里利用三行代码就可以获取到网页的源代码,利用
pprint
库,可以清晰的展示json结构,对于我们解析数据很有帮助。
* V! _/ W8 ^4 J
df1 = pd.DataFrame()
) B( p v- L% W! x
for info in data1['body']['allMedalData']:
3 K3 N8 d8 w0 Q9 K( q7 z3 @$ M
name = info['countryName']
7 E0 b9 P+ R6 @! L
name_id = info['countryId']
4 L0 X, W" g) T6 y' H- Q: l$ Z
rank = info['rank']
0 \% z3 f B+ {0 {( `
gold = info['goldMedalNum']
2 e1 _$ |/ N; A% _% l
silver = info['silverMedalNum']
) H$ [9 u0 a, ~# b" r
bronze = info['bronzeMedalNum']
6 m) Y2 F, d" R0 h; Z' L
total = info['totalMedalNum']
: \ E' q( I8 R9 Y1 Z3 y
# 组织数据
. j+ C1 ?5 [8 v7 n. @8 x+ p5 b+ J
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
# K7 {4 v: _4 b2 _$ ] |4 M
# 然后追加df
9 m: u# b9 `( y% A/ b
df1 = df1.append(orangized_data)
! B2 i( s+ C" {& L$ H) f* u
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
1 ~0 O" }& \- c: v# Q) M
df1
) e# D1 d0 P# a; x3 }
& u! ? P9 z7 Q! ^& b4 H' O$ r* b
/ l, \" B5 m0 S$ m- c, }: a$ j
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
6 [2 [; j. ^; H/ u% _
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
- o( U4 p# R8 d& ^) M
data2 = requests.get(url).json()
% F0 N7 |! M+ z# u+ @( K4 A
#pprint(data2)
. C. k$ @% ]$ s7 ?& ~& X" J. L! j
3 w$ U" l, b5 r2 Z
df2 = pd.DataFrame()
' i/ d8 ^# k# q3 s0 e- c% K9 N
for info in data2['body']['medalTableDetail']:
/ i9 D$ x# T1 ~5 T3 i
english_name = info['countryName']
* M, ~; r; O% @/ B8 M
name_id = info['countryId']
# |5 o8 Y; Q* d' g3 y6 \
award_time = info['awardTime']
4 l- v; p2 I F- x
item_name = info['bigItemName']
7 u' t& [ l: n$ r" }( b0 D4 L
sports_name = info['sportsName']
, j5 u0 I- b( ?7 h& ~9 Y# X
medal_type = info['medalType']
5 b: r. T/ B3 z! D3 c
# 组织数据
}/ N! W7 A( _, {
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
- b6 n) a- C& v3 Q- L# r" {6 E
# 然后追加df
( M# t$ C. P& I/ e2 j
df2 = df2.append(orangized_data)
0 G4 J9 I* d* A6 o, T1 ]
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
) W9 G- l! z/ d# ]; f: U
df2
( \! C: e5 i) Q9 [4 u
+ G+ U/ p" ^8 F! V
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
6 J. Z1 T$ C: J3 L1 v( B& j# [
- _% C/ h" K' N1 K/ q# ]
6 p J+ z( T; N& z# G
二、数据预处理
9 t! F; D* J. j+ ]% a
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
* Z& O( R( z9 R. q: ^6 g: x
6 o) `/ S0 a5 v% s
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
% y5 y2 C6 L: L, B
x = f.read()
v: ]# e! D9 H1 {9 A; t$ L
/ o2 J) A% i$ |( a- g
df3 = pd.DataFrame()
* I/ P. a$ ?7 V8 s7 s- o2 D4 m
for i in x.split("\n"):
, R1 B; ]3 I1 e) {$ s3 b
x = i.split(":")[0].strip()
* q. i' W0 m$ ^2 v- r
y = i.split(":")[1].strip()
' ^! p, E9 p2 z% t' F& _0 `" T
orangined_data = [[x,y]]
, w5 W8 v2 j& V3 U7 w2 S. t
df3 = df3.append(orangined_data)
2 W# G( B; V: O% a* P# J8 a" m
df3.columns = ["名称","英文名称"]
0 z7 @. \4 f7 T7 i
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
" p% `+ }4 C8 ?; c
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
: J7 \2 F- I! F+ o
# }# T0 |% D4 [" P3 X" p3 o
df4 = pd.merge(df1,df3,on="名称",how="left")
. f7 P4 m, X) Q
df4.head(10)
2 M9 m9 |1 R+ a
# m" p1 j2 y5 p: L6 ^! d* Y
+ O+ S8 S4 d- [+ `; x& Q1 P- c
表格df5表示运动项目获奖详情。
0 {/ R# I! {" P( G: `
9 u6 l2 G: N! K# f
* o' D5 o: H1 x: ~0 A4 p* U
$ {) g3 e0 ^+ J. \: P
6 l1 J. q: h8 q
作者:
iolia008
时间:
2021-10-31 23:17
# g# j) U% l5 S5 S
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5