数学建模社区-数学中国

标题: Python制作可视化大屏(东京奥运会) [打印本页]

作者: 1047521767    时间: 2021-10-28 22:35
标题: Python制作可视化大屏(东京奥运会)
目录$ ^: K, a0 a: D. |9 L9 [6 R

; g- [+ I3 N4 j9 }5 T/ o$ z- D文章目录; {: ?1 e( i! M9 H/ L" n
) @( }! M- V& b' a0 B6 S9 h* d: K
前言% t; e% y  U2 c* }1 W! z0 ^

5 B( N1 r$ j8 m; p& d7 [一、数据爬取
& ]" M7 V  Z) x9 e, O7 y
6 V7 F8 M# v, `& U8 E二、数据预处理
' T2 p+ X$ ]" P! d$ x" a# I
9 _0 c: @; x: w2 B. L) k" B​前言+ o" ]% q. z7 g* }
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。; S2 @/ B0 H* D* x
# U# `( g& I- H0 |5 \

4 U2 \1 a! N5 M  f0 @& G: t/ k( E一、数据爬取9 ~) C0 z4 V# q- b7 t6 q) V
import requests, H, o9 Q5 I4 E1 g
import pandas as pd# D/ e+ k- g: ]4 \1 d7 e0 Z7 d
from pprint import pprint+ c4 k) ]- }" \' m4 H
导入相关库- q6 E6 H# Y% }1 n% X! n/ z# O9 [
8 h5 K+ v4 \/ Z
requests库用于发起网页请求,获取网页中的源代码;
& Z4 C4 ?3 B8 F& r
3 e# z% q- c0 kpandas库用于存储和读取获取到的信息;+ V, U7 v8 r" Y9 s; `

$ b3 j; k; I; [) b. b2 c3 X) Ppprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
! {0 R2 f* d' G, f6 _" p/ j4 M  E6 X+ N$ _
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'' [2 x! J8 \; Z! e
data1 = requests.get(url).json()9 p: B" A" E1 e6 B& a9 h* W
# pprint(data1)1 H- D* ]3 z! f4 X( M

! }  Q0 m7 A- c' |1 |( {这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。) m7 e- g3 Y% z
df1 = pd.DataFrame()( ^6 E2 S: v' s, d, M
for info in data1['body']['allMedalData']:5 {5 Q4 ~( P5 S& \6 z: V
    name = info['countryName']2 O  _" w$ k1 n
    name_id = info['countryId']6 E& u, X$ p- O5 P
    rank = info['rank']; i3 R* x$ P4 Q$ A/ Z) K
    gold = info['goldMedalNum']
& c; a) X# b* S6 S5 Q' m# P    silver = info['silverMedalNum']. P1 \' h+ C  Q; d: T
    bronze = info['bronzeMedalNum']
( g! n  W( i  ]$ Q- B- b3 ~    total = info['totalMedalNum']& Q; k. P: Y( P' M
    # 组织数据' C  a" X: Z) Y. e' o
    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]9 k9 n! g8 U/ m- F( y) G* C
    # 然后追加df) _, @/ v- x" B- E, c) m
    df1 = df1.append(orangized_data)9 \) s5 r8 F8 F7 ?
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']: o& J5 K9 `! c; R, v7 l' G4 J& e4 E
df14 w% n+ e7 B$ d( Y# I* B
9 o2 c$ L' x, v' k
( [  M' H) W$ S# U
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。  p$ j2 J  @, m8 C/ n% G# [# U) U
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'% K5 j5 l; c2 j' h( U/ A. T
data2 = requests.get(url).json()
( X- q& t2 a0 h! j* T#pprint(data2)
+ L/ g7 v$ S+ X* B5 _6 Y. [+ p! A; ]2 I6 c: d$ ~: Q
df2 = pd.DataFrame()
2 X' c; J2 ?! D- l5 i0 n2 ?: ifor info in data2['body']['medalTableDetail']:
( D5 Q8 a. g( k5 f% ^    english_name = info['countryName']
7 g; K, z; w- X3 d- `, X3 a    name_id = info['countryId']
( m  q! C' v' l) R3 E' ~    award_time = info['awardTime']" z9 `" v) K& u9 P
    item_name = info['bigItemName']3 h  C3 }8 M0 r( {; P5 n/ {
    sports_name = info['sportsName']1 t& x4 T( E2 B1 Z
    medal_type = info['medalType']# a9 f0 n% N* @) n# s
    # 组织数据
/ {3 p" |: Q2 ]8 l2 |$ f4 \: J+ u+ x    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]) ?/ \% k3 H8 W1 x# m
    # 然后追加df' A* z- @% z! v2 B( D% f+ \- f# D. m
    df2 = df2.append(orangized_data)! T' T5 V  c0 {( l5 ^, l1 x+ B) A' u
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']  _! ^" c8 P, {4 D1 K1 `
df2! E6 F: L* W0 i7 i9 R
0 X( i: N7 V' M
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 # ]3 A4 g/ w$ H4 n7 Y# Q

1 u) P$ A3 l/ B: z; |  a0 S0 Z" R$ @7 |7 m9 Y
二、数据预处理! H4 e- q& F1 }
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
+ k  ^% G; h7 s) W) p9 t0 m# J3 a6 ~1 x6 A3 |$ H
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
2 K) b( [1 M1 I( S8 ?    x = f.read()
- K5 p$ S* o1 y0 w9 \  k9 z' i! h3 k" ]2 l' t2 k5 N9 ?6 v# V$ o
df3 = pd.DataFrame()1 _' F+ \4 Y" Q5 Y; P
for i in x.split("\n"):  Y; k5 [- g, K5 e' O% @/ g
    x = i.split(":")[0].strip()
* k4 y# ]& T6 q4 a  v& C$ Z) y    y = i.split(":")[1].strip()
0 R0 I: C2 |3 p9 i+ m    orangined_data = [[x,y]]
* D8 B4 }( G7 Y0 y' W    df3 = df3.append(orangined_data)9 S2 ?6 z- f  [  A
df3.columns = ["名称","英文名称"]$ J+ a3 h  C# t& ~
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
- m$ v; k2 @' q' E1 a1 x表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。$ |: d" Y/ o3 o7 R6 P. W. ]) b
8 U& A6 {# z6 j' c  e
df4 = pd.merge(df1,df3,on="名称",how="left")
) [7 Y- V, O) k' h( m6 zdf4.head(10)
! N$ f7 A5 V1 x
/ o1 `9 V) v( ?) v( w; i5 u
  k8 T( ~! k* H# X/ P

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

, j- I. B; Q/ _& ~0 Y( s

: x, ~- h# g0 B$ Y* ^* ?
作者: iolia008    时间: 2021-10-31 23:17

" z: n# v- s" x+ c9 W& W. U7 u& k




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5