数学建模社区-数学中国

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

作者: 1047521767    时间: 2021-10-28 22:35
标题: Python制作可视化大屏(东京奥运会)
目录
8 w( W# ?  t" D0 M3 o1 {0 F% q+ N; y8 H% t' |. n  f% a
文章目录: |- r& C! M' C  c$ B3 O6 o
. L* G' ~# O! ~$ N8 N$ t" b) v. A
前言' ]( u# ]5 j) M) }* W" M; ~4 ~- f# A

& h- S5 R/ q* A! S/ d一、数据爬取
' U$ O: I7 K4 T8 Q# C+ u& `
7 m5 U* J1 O. O5 }8 ^: p% ]二、数据预处理% C* u" G; G! z5 O7 n
# q" ^- C; o# C) t& q
​前言& o2 Y- b+ }5 x: I
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。6 M* K( u( u3 x9 u

2 `9 Y4 b0 x; v8 R/ T+ E6 r2 r  e9 @  f8 @: E( C+ t5 R
一、数据爬取8 s( a% ]2 m6 A4 A/ h+ b" a
import requests
1 @! f% r  F1 |, N7 [* Limport pandas as pd
5 H: E) W1 }6 A# ?( ]! {$ C, Ofrom pprint import pprint
- a8 _# a$ s  {, F2 q: F导入相关库$ u1 c! X" Y. p5 g, ]' T- o  ]

5 x  s& ?6 j, j1 o) X1 O8 h6 Irequests库用于发起网页请求,获取网页中的源代码;
2 z' @. _0 F' o! _' g" T
* |) ?. F0 u7 A; Xpandas库用于存储和读取获取到的信息;* D& z0 Y% e3 E. n- v/ u$ P5 h

8 a6 \" e" K* e( U$ }0 fpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;8 R0 \! C* v" G7 H* Y9 `' U) b' D

& _4 A% F+ D& c3 H5 t, X: g$ A  C4 burl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
! `% Z6 {# Z" Y; U: Ndata1 = requests.get(url).json()
4 u( |2 V7 f" H% y: v- z# pprint(data1)5 t9 E: ?0 S; G' r3 d; u3 n/ B

. v$ g) C$ d& i& l* k* Z5 X这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。% p" @8 i; J# k9 w
df1 = pd.DataFrame()
0 e+ C* T/ C) D( rfor info in data1['body']['allMedalData']:
2 g0 Z/ @8 p! K' q2 k    name = info['countryName']) k, l: r' a4 r0 w
    name_id = info['countryId']/ A/ v0 A  I4 j# T* x- ]( u% _
    rank = info['rank'], n5 C# J' D( f7 [* T; m' B( F
    gold = info['goldMedalNum']
6 n4 \' d( Z- S0 X1 t! o# ^    silver = info['silverMedalNum']  E2 [$ ~( A1 u$ l! m
    bronze = info['bronzeMedalNum']
( l3 y% g* z' R, U    total = info['totalMedalNum']" e; d) K9 L+ Q! Y" t4 }5 b$ X, a
    # 组织数据
5 s: U9 T6 r! V; F9 }* T9 `    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
& w3 v7 B. ]  R$ k    # 然后追加df. ?* ]+ z9 L; ^1 O+ N  t
    df1 = df1.append(orangized_data)
0 b0 f  S9 Q% Q9 ndf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']3 q9 j! ^' l' \
df1
1 P1 }5 H! c. \2 i0 i; [  _
' Y# x% H  q- v7 c8 J* O0 Q
% k' ]! ]) I& l$ f7 h. h7 {! }这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
$ p2 _! v$ o8 J* c. p, u6 k+ E" O. Z% z$ Surl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
% X$ p9 i9 q/ Xdata2 = requests.get(url).json()
+ S( W" i7 `4 ]) [#pprint(data2)
- O* v5 ?' X4 K! ^/ V) M2 @% S0 U  ^* {5 u. C
df2 = pd.DataFrame()
! a2 S( \/ X6 Vfor info in data2['body']['medalTableDetail']:3 ^+ o( \* ?4 W' k' X7 _7 l
    english_name = info['countryName']
( Z- _; ^9 @0 F0 E0 K6 B  J    name_id = info['countryId']
. S3 P$ U& n! ~    award_time = info['awardTime']1 @" D) N8 z3 n5 U
    item_name = info['bigItemName']
8 w# n# C3 V: ~0 X- ?2 N    sports_name = info['sportsName']$ q: V3 A0 V6 x2 ?) ]& d, W
    medal_type = info['medalType']
- u* ^3 R* q: _: j. X/ U1 g" K    # 组织数据! w$ z3 f, @$ \% a6 {/ C& U
    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]5 {3 y! R8 G$ i
    # 然后追加df- r5 F# K. j) W1 y6 u/ @1 a* V
    df2 = df2.append(orangized_data)
8 {' f% k( r. E1 [$ _6 Jdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
- a( W' g$ ?$ B+ ^) N/ `df2
) ]$ B9 y( N- _; D$ i2 b1 C/ S# E, {6 a* O. H0 x
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
: m- H2 Y, a% C3 H
0 R. E/ U3 G' \% R$ g; c
9 k% e7 u' \1 ?7 ]" f二、数据预处理) X0 ~) Y0 {  d% j/ |$ o* u
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。& V8 t0 a+ a6 Q* o3 I

1 w' F7 b' R5 V5 n! _) Mwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:& U1 ^) A8 k- o) w/ P! B' t$ V
    x = f.read()( k' |0 ]4 v0 e( ^

' k  A* O& q# S, l% Hdf3 = pd.DataFrame()2 c/ n( A0 w" Z8 m
for i in x.split("\n"):1 `' a, W0 A# Y
    x = i.split(":")[0].strip()) r  ]1 g+ u( u, e" U
    y = i.split(":")[1].strip()
! b' }) B2 W8 L. h    orangined_data = [[x,y]]& }; h7 T( F+ ?- m
    df3 = df3.append(orangined_data)% a5 y( C% y( \4 M0 i
df3.columns = ["名称","英文名称"]
8 S1 u9 }1 \+ @3 e9 v0 Idf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)& N4 e  H, u5 x$ b
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
# k4 l9 J) U  a7 u, C; z0 M' d0 K4 k* y% ]
df4 = pd.merge(df1,df3,on="名称",how="left"), ^0 t  T# ~8 C- u( S2 q, G9 R
df4.head(10)
+ X( e0 `: {% M; W2 i( _3 [# s8 j0 d
6 [6 _( p- _/ J% _* [8 _

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

% I) Z$ r* q' s+ o6 D- l% T

6 f8 [/ U/ ^" C) k
作者: iolia008    时间: 2021-10-31 23:17
* t6 q/ C# E0 V2 D: Z





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