数学建模社区-数学中国

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

作者: 1047521767    时间: 2021-10-28 22:35
标题: Python制作可视化大屏(东京奥运会)
目录
. S& K0 s, _: ~% g. A/ Q6 x) O4 U( |7 ]
文章目录4 M' g; y9 }) _# a6 N7 P* r

" M; }' c/ s+ [* e$ d+ i前言
  D5 m& Y1 P* ~& w$ h5 H8 M
: @9 Q1 n: H# y; o/ f- `- G一、数据爬取
) j; R' D: |+ o3 j! j" Y
/ ~9 N, X$ Q, P& [二、数据预处理
/ X4 ~( c" w8 C( W9 {
; L7 j: h. o1 K  ~* K+ C​前言/ G+ v. m9 f" c+ }8 r
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
5 [0 b9 t. i7 ]6 q$ O) d" z  ~" \( L6 N

) J) `% m" B% x# @一、数据爬取
! W1 P/ S* P9 limport requests, y( I! k7 Y$ k" X+ J- R1 K
import pandas as pd  o1 I+ |  @6 z. V: e
from pprint import pprint
! U  M- k. [0 m( N! [8 i6 q* C" h  m) ^导入相关库
3 T. ^- g; R( E1 z6 E) y$ ^9 f, A7 Z3 }+ w
requests库用于发起网页请求,获取网页中的源代码;8 i/ K1 Y2 ]) Y. F1 n

7 F# \) q7 [: G. p. Ypandas库用于存储和读取获取到的信息;: B3 z$ m0 w  w- r
+ E3 u& A5 N6 q( z& P; x" e
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;. S- {, ^1 d1 X  I
1 a8 ^$ i) ~/ [; C
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
, F" g- ?0 u  idata1 = requests.get(url).json()9 I/ b! S2 O! R5 x0 r
# pprint(data1)4 G$ p& r$ a9 l% `- b( S2 D

  i5 d$ `& E( A) T- \- x这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
* S+ E+ x; y! o( Ydf1 = pd.DataFrame()
( E9 e2 @: O  E# O( _! L/ K( Hfor info in data1['body']['allMedalData']:9 j  p6 ?* _) n2 P
    name = info['countryName']" J( E' X7 B( K4 F/ {8 ?  W. [2 W1 @* e  w
    name_id = info['countryId']
. \( p! F* p* w    rank = info['rank']/ y6 S  Z8 B+ M+ P. O- h
    gold = info['goldMedalNum']* `4 ~: E( Z: l! ^2 T1 r" L
    silver = info['silverMedalNum']
4 R. g, Q7 f  C# n' Z8 h    bronze = info['bronzeMedalNum']" Q6 P, {4 N* `% t4 B) Y0 ^7 x
    total = info['totalMedalNum']0 s/ f' r8 `+ [6 t" H5 W5 L$ V8 y
    # 组织数据
$ J! \% F  }" j8 H* [0 S  ]    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]! F. {+ _; H$ P. e
    # 然后追加df
3 U! \7 l. @2 i' ?. j5 z; D    df1 = df1.append(orangized_data)4 `) M/ r) s. m
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']/ c' }4 B; @* m. |& o
df1  k2 W& n4 ?0 Z- I* g% S6 @
' z9 i7 u: e% ~: F: C) J% z
  E* Q( ]4 z1 i! T2 D
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。2 J7 L0 S) D! T: G$ k+ _4 N( T
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
& K! p/ d% u# [data2 = requests.get(url).json()9 H. a3 B' Y. D
#pprint(data2)/ k, j7 v8 j( s* ^4 X5 I  z

" o! ?( g5 i( M7 G! tdf2 = pd.DataFrame()
8 E& b6 M. m6 _% e3 bfor info in data2['body']['medalTableDetail']:
$ R# i3 B/ D! L! b; \$ w    english_name = info['countryName']7 Q# k$ ~' l' R& D' |8 i) C/ J  s
    name_id = info['countryId']/ A0 n2 i6 |" `5 D" l! Q
    award_time = info['awardTime'], B$ u7 T1 j( p: p$ p
    item_name = info['bigItemName']
7 y4 v$ X3 R0 l) ~& J- H    sports_name = info['sportsName']' x% _8 |$ U. h& [
    medal_type = info['medalType']( D4 F+ k* d6 x# _# Z
    # 组织数据
6 D+ ~+ l7 t' v    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]- h6 L* D# |8 s
    # 然后追加df
3 O3 _/ a  `. O0 r( v1 ^' u9 g    df2 = df2.append(orangized_data)
4 ?% D6 l5 }" s5 w7 h2 i2 _df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
( x' d3 A) M$ G3 p! u7 ^df22 [) W7 I  _$ k* A& n! I& H

0 h* f3 K4 B( E! o) ]* k- ^对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
  Q3 r* o: C! t) E9 f$ [
" d& ?% I+ n- l8 s6 G
4 v: w' u$ s& a二、数据预处理
" H. V9 n& d8 s* C3 g. H由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。' @! g% r* C' U; [2 ~9 f
/ d3 p3 h2 |- N" |* a
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:0 M# U! S- \+ W! {
    x = f.read()
& w8 R, f+ H! k; I
! ]* D8 U; l5 v4 M; {df3 = pd.DataFrame()
- R" y- }4 X, zfor i in x.split("\n"):
$ j6 W7 K/ e- ^/ ]( R+ I    x = i.split(":")[0].strip()
, q  ~7 L2 K! M9 R; s6 o1 m    y = i.split(":")[1].strip()
+ e+ c7 D0 W3 D0 c5 h( ^7 K    orangined_data = [[x,y]]
4 P; T" b& \" {2 B    df3 = df3.append(orangined_data)# q4 N# R" Y0 ?% D+ p4 Y7 f
df3.columns = ["名称","英文名称"]: e+ @: N1 R) x$ e! b% ~* ?
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None): A9 W' I! ?' |8 M7 d
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
( X0 }  Y0 f" N6 ?
- ^" |1 m' I& L( l7 jdf4 = pd.merge(df1,df3,on="名称",how="left")
* K$ x, `9 Z/ F, l1 sdf4.head(10): N# N* s) @& \" P
' u% z$ Z& l9 E: A% b
1 M- f9 k% U* l1 U

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


/ w7 ]7 K1 e/ }1 D$ e  [# `
, C9 G6 X7 h/ X/ B6 C- E+ {
作者: iolia008    时间: 2021-10-31 23:17

( v1 v$ @4 z3 `4 T% T% q  o( o




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