数学建模社区-数学中国

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

作者: 1047521767    时间: 2021-10-28 22:35
标题: Python制作可视化大屏(东京奥运会)
目录' [" x2 G* p- @  m9 {
( B# c5 {1 w4 `/ i. F$ d
文章目录3 s! e8 q+ z4 s( M2 H. h: o
5 d' f- s* i& C' A/ V
前言* t0 D2 |6 N; ?" x: t% u: [0 h; J
; Q" D6 X$ U, v$ Z( D" y! P
一、数据爬取
! B7 K& @( I4 v+ t, c+ ^5 \' T$ i  J
二、数据预处理
% w) K% s! d6 |0 q% R3 J& @8 i! @: U/ z# p0 L
​前言
5 \" k7 g* N% [# F- ?" o本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
  w$ V9 Z$ [( V1 e
8 r9 @( R6 Y) Q, G+ Z! `; _, j2 M9 ?' x6 G6 q9 n! v0 X
一、数据爬取
- g" E1 G  H; h  \* p# |import requests! Y7 V, Z2 p6 j# n
import pandas as pd2 z7 e6 e5 N: |7 b% k! e" i
from pprint import pprint7 _, _1 e4 e  I" [3 K: q. ~
导入相关库& J; i- C' S6 s

9 D' L% h& P7 u4 f0 wrequests库用于发起网页请求,获取网页中的源代码;
. A6 i4 v7 G- K, b9 k# X$ @- L; [2 S# L) M! ~9 V) q9 n- F
pandas库用于存储和读取获取到的信息;
0 y: o/ t( T0 D, [# n3 I5 e. u
7 f/ M% i1 o2 X* @: J! W5 Vpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;# B; |1 S" m, t

3 L4 z. B, z9 T* k1 }$ w$ burl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'" }5 E$ e$ F, {$ Z+ Z' F: \
data1 = requests.get(url).json(); g' N' X# Z* ?7 j. ^. }3 G8 ]
# pprint(data1)0 h7 r  c. i: l' A2 g
$ h) p! }  j" w
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。9 g& M( k: g, S2 r' ]7 x
df1 = pd.DataFrame()+ ~$ w: ^  Y+ U$ C. E
for info in data1['body']['allMedalData']:5 O5 P, {, N0 o+ g4 `
    name = info['countryName']
$ I- |3 j9 ]1 q1 C, Q+ ]# o6 N    name_id = info['countryId']
' g6 M6 j5 Q  h, q5 w2 J. R    rank = info['rank']
- L7 n/ ]6 n# f5 ~2 ]+ B* Y    gold = info['goldMedalNum']
/ a' l  p  @9 K( p6 u    silver = info['silverMedalNum']" j: N4 j6 j( x8 B. F
    bronze = info['bronzeMedalNum']
4 ~5 ^& ]4 |3 x0 _- G    total = info['totalMedalNum']
! B$ C4 Z4 G( H3 M    # 组织数据+ ?; q% Y" a9 G% C
    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
& ^: }1 ]4 s8 |0 M$ k7 x7 `/ b    # 然后追加df
4 o8 {" {* G7 v1 K; T: {    df1 = df1.append(orangized_data)
# x4 _9 I5 L; c. U0 rdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
# C2 @- T0 O$ f3 u2 idf1
3 g0 d/ t8 A7 _, n8 d2 \% o& g  p2 b$ k) y% G
, b1 {5 F, P; A3 t  {1 P
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
' m2 p( E! E2 q6 C! x1 b9 e0 ]3 {6 O: |url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
( N/ e6 e- X/ ~5 ndata2 = requests.get(url).json()
/ ~3 F# J5 y% N0 }6 v  Y#pprint(data2)7 U$ B  b3 V0 d. o+ v$ L6 u

. X: r$ J$ o3 ^* W& c, jdf2 = pd.DataFrame()" u8 f6 J0 B# z% r/ p; Y
for info in data2['body']['medalTableDetail']:
4 W7 ~/ r# {; U! P7 n    english_name = info['countryName']2 }1 W- o$ p) k2 B
    name_id = info['countryId']" F3 n* c9 L( Y+ g) U8 Q
    award_time = info['awardTime']
3 _5 X9 o2 [" ~    item_name = info['bigItemName']; B. i# z+ L/ P7 M+ v6 H5 B* ?% M
    sports_name = info['sportsName']0 F1 D/ Z  O' V8 ^8 Y
    medal_type = info['medalType']  D3 z0 u' @4 P/ \+ ?' E
    # 组织数据' n1 Y8 m7 N( F4 b3 X- t8 ?
    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
' N% J" ?5 C3 a    # 然后追加df* h$ P0 I' F2 ]5 i% e  {0 J3 b% `$ }
    df2 = df2.append(orangized_data)
, J$ w# ]5 T6 W1 E/ \; g( hdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
+ n4 v6 K% G  |5 O" z  hdf2
, l5 V. G7 A: s+ H( B3 Z
% N. ?: u0 `9 e) w' I  o) j5 H4 i对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 * e2 B: u6 Y6 e: D' Y' ?$ l$ k

- m& Z6 M* N# u+ e3 _# f  t4 k% i, ~: W6 m/ e) B" C" [. y5 n
二、数据预处理
* F8 G- f( ~- F. c$ _由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
0 E8 g0 ]# `+ s4 m+ i0 s8 O2 \. g! U3 \! e. h
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
6 R! a: a; D+ M* F* g3 K    x = f.read()
. i. c, U2 |( O1 s( I* L; e* g6 X% ^9 O& O3 ~/ _
df3 = pd.DataFrame()
6 Y/ `( }4 }; b% G" Gfor i in x.split("\n"):
& ^! s' O5 B, p. `2 n. v- @, u    x = i.split(":")[0].strip()( r" [4 I. U& e
    y = i.split(":")[1].strip()
1 `, _: D% V: u! ^& s6 Z    orangined_data = [[x,y]]
$ Q2 Y+ _; O0 M! y7 b' g    df3 = df3.append(orangined_data)$ j8 A/ r# j3 n6 ^
df3.columns = ["名称","英文名称"]" `* Y: M8 u% u& _+ s, V
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
( n+ a& y$ a& f/ }( P: I) ~) y表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。8 ]; s# I$ J/ x5 [. P  c% n7 Z
- p* n! d0 T& K3 V5 ^$ J
df4 = pd.merge(df1,df3,on="名称",how="left")
6 y; k2 Y$ j% ?7 `  p6 U$ Zdf4.head(10)
- ]- j1 t$ x. M6 b2 u
) ?, w9 Q* i) m( z5 ]* p, m& {* S# w: B, k  n/ Z9 C( j6 ]

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

* k& y. f1 Y2 O# f) k2 D
3 V3 [2 y2 a; l# |7 b3 d

作者: iolia008    时间: 2021-10-31 23:17

- {( L0 \& N+ j5 @) @( t+ G* x




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