数学建模社区-数学中国

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

作者: 1047521767    时间: 2021-10-28 22:35
标题: Python制作可视化大屏(东京奥运会)
目录
9 t; z9 f$ Y4 T4 m
# I) L& L2 _" q2 D5 B# B" |" k文章目录
: T1 |$ I0 u# N4 K2 v7 d: |+ P- O
6 E' Z( D) X$ \! M前言
7 G  V: g9 C& D; F; F! o2 l' e4 f: n+ L3 i, E
一、数据爬取# I' o, h& I. Z1 T

' E- x- H5 r7 X' w2 l9 P+ a二、数据预处理: H9 D3 }) h  S9 [% y- }* s0 j
: H1 H# m( i" Z  [9 ^
​前言! T  I6 Z# U6 H7 t) t+ s" x
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。, w: i1 P1 ]; Q9 q* ]7 w' V5 C0 \

' P- x( ?( Q! P* ~4 [2 c& B" T% \0 H2 p  M3 K6 O$ O0 U* R
一、数据爬取
1 S' N& w) A1 timport requests
) A* |8 C% W9 t$ u, X; @import pandas as pd
( Q8 Q8 e! _7 n: o* e, G8 ~$ Efrom pprint import pprint
+ N  s1 s! c0 |" P6 @' R4 k! u导入相关库
1 d" M: f4 }, G! o! t  j" z
% ~& _" R/ X. p7 }) k' Q7 |& vrequests库用于发起网页请求,获取网页中的源代码;
+ M& H0 c  `- @' M7 W1 p( {
; t# I. V- K# }3 n% Cpandas库用于存储和读取获取到的信息;
# x8 @  {6 j* T
, n" g4 h1 `8 y8 E# _: Qpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
& t$ Y4 e- \+ L# k7 N2 A5 V& a4 {, o6 w& Z0 V
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
3 J/ M/ A" X+ U, _! u/ S9 [! mdata1 = requests.get(url).json()8 Q' n  r0 t9 L1 Y" Z
# pprint(data1)
- p) R9 K8 k( N8 F7 q7 \* n# Q5 L
8 U6 A5 B* M; P( Z$ Q这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
* V! _/ W8 ^4 Jdf1 = pd.DataFrame()
) B( p  v- L% W! xfor info in data1['body']['allMedalData']:
3 K3 N8 d8 w0 Q9 K( q7 z3 @$ M    name = info['countryName']7 E0 b9 P+ R6 @! L
    name_id = info['countryId']
4 L0 X, W" g) T6 y' H- Q: l$ Z    rank = info['rank']
0 \% z3 f  B+ {0 {( `    gold = info['goldMedalNum']2 e1 _$ |/ N; A% _% l
    silver = info['silverMedalNum']) H$ [9 u0 a, ~# b" r
    bronze = info['bronzeMedalNum']6 m) Y2 F, d" R0 h; Z' L
    total = info['totalMedalNum']: \  E' q( I8 R9 Y1 Z3 y
    # 组织数据. j+ C1 ?5 [8 v7 n. @8 x+ p5 b+ J
    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
# K7 {4 v: _4 b2 _$ ]  |4 M    # 然后追加df9 m: u# b9 `( y% A/ b
    df1 = df1.append(orangized_data)
! B2 i( s+ C" {& L$ H) f* udf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
1 ~0 O" }& \- c: v# Q) Mdf1) e# D1 d0 P# a; x3 }
& u! ?  P9 z7 Q! ^& b4 H' O$ r* b
/ l, \" B5 m0 S$ m- c, }: a$ j
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。6 [2 [; j. ^; H/ u% _
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'- o( U4 p# R8 d& ^) M
data2 = requests.get(url).json()% F0 N7 |! M+ z# u+ @( K4 A
#pprint(data2)
. C. k$ @% ]$ s7 ?& ~& X" J. L! j3 w$ U" l, b5 r2 Z
df2 = pd.DataFrame()
' i/ d8 ^# k# q3 s0 e- c% K9 Nfor info in data2['body']['medalTableDetail']:/ i9 D$ x# T1 ~5 T3 i
    english_name = info['countryName']
* M, ~; r; O% @/ B8 M    name_id = info['countryId']
# |5 o8 Y; Q* d' g3 y6 \    award_time = info['awardTime']4 l- v; p2 I  F- x
    item_name = info['bigItemName']7 u' t& [  l: n$ r" }( b0 D4 L
    sports_name = info['sportsName'], j5 u0 I- b( ?7 h& ~9 Y# X
    medal_type = info['medalType']
5 b: r. T/ B3 z! D3 c    # 组织数据
  }/ N! W7 A( _, {    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
- b6 n) a- C& v3 Q- L# r" {6 E    # 然后追加df( M# t$ C. P& I/ e2 j
    df2 = df2.append(orangized_data)0 G4 J9 I* d* A6 o, T1 ]
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']) W9 G- l! z/ d# ]; f: U
df2
( \! C: e5 i) Q9 [4 u+ G+ U/ p" ^8 F! V
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
6 J. Z1 T$ C: J3 L1 v( B& j# [- _% C/ h" K' N1 K/ q# ]

6 p  J+ z( T; N& z# G二、数据预处理9 t! F; D* J. j+ ]% a
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
* Z& O( R( z9 R. q: ^6 g: x6 o) `/ S0 a5 v% s
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:% y5 y2 C6 L: L, B
    x = f.read()  v: ]# e! D9 H1 {9 A; t$ L

/ o2 J) A% i$ |( a- gdf3 = pd.DataFrame()
* I/ P. a$ ?7 V8 s7 s- o2 D4 mfor i in x.split("\n"):, R1 B; ]3 I1 e) {$ s3 b
    x = i.split(":")[0].strip()* q. i' W0 m$ ^2 v- r
    y = i.split(":")[1].strip()' ^! p, E9 p2 z% t' F& _0 `" T
    orangined_data = [[x,y]], w5 W8 v2 j& V3 U7 w2 S. t
    df3 = df3.append(orangined_data)
2 W# G( B; V: O% a* P# J8 a" mdf3.columns = ["名称","英文名称"]0 z7 @. \4 f7 T7 i
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)" p% `+ }4 C8 ?; c
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
: J7 \2 F- I! F+ o
# }# T0 |% D4 [" P3 X" p3 odf4 = pd.merge(df1,df3,on="名称",how="left")
. f7 P4 m, X) Qdf4.head(10)2 M9 m9 |1 R+ a

# m" p1 j2 y5 p: L6 ^! d* Y
+ O+ S8 S4 d- [+ `; x& Q1 P- c

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


$ {) g3 e0 ^+ J. \: P
6 l1 J. q: h8 q
作者: iolia008    时间: 2021-10-31 23:17

# g# j) U% l5 S5 S




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