数学建模社区-数学中国

标题: 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 Qimport pandas as pd6 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% Rrequests库用于发起网页请求,获取网页中的源代码;
3 l( ]) w) p1 @( b, B8 ^3 [0 h+ Q
. Y4 E: a; P3 I3 x" j8 f7 D9 Upandas库用于存储和读取获取到的信息;/ 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 Durl = '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 hdf1 = pd.DataFrame()
- E2 c& n- Q$ W5 Q( ^, vfor 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    # 然后追加df2 T: @1 h" C* |+ |
    df1 = df1.append(orangized_data)
+ x9 B& \5 Y2 sdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
9 g2 E) D/ P& i9 J$ edf1
& 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 hurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
" T; }9 e; T! M6 sdata2 = 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 Lwith 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" zfor 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+ g5 ^& D8 m& J; t; s' Z
df4 = pd.merge(df1,df3,on="名称",how="left")
9 j$ x3 |$ `( e0 |3 Ydf4.head(10)5 W6 z- ~6 a. D" J
4 A2 ~. W5 r* J* I
$ w: A6 v  h) l4 b

表格df5表示运动项目获奖详情。


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