数学建模社区-数学中国

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

作者: 1047521767    时间: 2021-10-28 22:35
标题: Python制作可视化大屏(东京奥运会)
目录
5 K  V0 J4 z% d7 s% ~6 m; w  B5 d1 t% p  ]( ?$ W1 u$ ^
文章目录, L4 C8 @6 e( k. X; r

( r3 z6 D2 m1 }前言& h+ b) D- }8 e5 q
7 H. o; ~* [6 G! r1 g7 {
一、数据爬取; R% x8 |' O" z7 D- `
1 L8 R5 I/ u% `; G- A
二、数据预处理. h$ x( i9 P9 r$ Z9 ~! v
( f% i& m- i/ `. h
​前言
6 n% ^8 Z0 P: U4 @3 Y本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
% O9 O4 {# v- n4 L# ^3 q: S0 |2 J' ^% t# y
- Q  Q& A! X' T: h, F* h
一、数据爬取* v8 i; T" z! J4 w" W; f
import requests% J, h2 s  d* C! o" t7 F
import pandas as pd8 K* @: ]. {- ^& {
from pprint import pprint
! A4 l- g% D. X' k6 ?% z6 m: h导入相关库1 P& @  O4 U% P( z

6 j9 E. }- V. g4 Xrequests库用于发起网页请求,获取网页中的源代码;1 L8 [7 ]5 c! N5 @: M7 G

3 n( k) C6 o  ]9 Y0 b) L; f4 Ppandas库用于存储和读取获取到的信息;
* c# X5 [; @4 n" u8 w3 p4 ~
9 [6 Y9 X' v6 }0 ~pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
! Z4 q7 d  h  |4 X# R7 o0 p6 K" d- y' C) \3 F. I
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'# f! C+ N! i  q' I; C1 e0 j% D
data1 = requests.get(url).json()
! h- O: e1 Q. g# pprint(data1)
" C5 C6 B0 @5 ~* O3 F0 E$ n" _& T3 r" z3 J7 `6 P6 i: Q
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。/ x" Z* B3 t7 a0 I, h" Q1 n; M: ~
df1 = pd.DataFrame()
( b  O9 A1 `" ]7 p" x& F  gfor info in data1['body']['allMedalData']:5 e9 |% x6 ~% |" {9 {& i
    name = info['countryName']( `+ S& r2 |: |3 X: O
    name_id = info['countryId']4 g) d3 V2 J" d( \2 N2 Z, N) {, Y
    rank = info['rank']9 e  o  m. y8 p; x: C
    gold = info['goldMedalNum']$ [+ K' d5 G* u! T+ M! ^0 z6 C3 d
    silver = info['silverMedalNum']" Q. o: H, ]/ g" f
    bronze = info['bronzeMedalNum']
/ v2 @! t* E' i" U- H" f    total = info['totalMedalNum']0 I1 Q% a0 Z( \- G
    # 组织数据
$ H% q& k  ^" [    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]; t- g2 X* q( h& x
    # 然后追加df6 X2 G$ g+ }3 q& e
    df1 = df1.append(orangized_data)
+ S/ x: e5 _# }( }. adf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']9 U! X" S7 H$ _& L1 j" K+ G
df1& N: o7 U0 p$ x0 v/ I5 d

  y7 `4 y+ U2 g3 e& [. V  c6 q& r4 V: b: Q+ ^6 A. Y* [
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
2 @7 e! @0 {! w/ Ourl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
/ B: J; u/ v7 _+ e9 O2 s) {$ `; Y; rdata2 = requests.get(url).json()! F# O# J* \7 d* s" x7 d6 P
#pprint(data2)
* p, F# ~6 W2 S; m# N' O& `9 C
) \& n  M7 _- P4 J1 |! M: h2 h3 ^df2 = pd.DataFrame()4 [/ I/ I; H6 c
for info in data2['body']['medalTableDetail']:
3 y% D6 I! S* s( e" s    english_name = info['countryName']* V* D. L$ @, o* Q- G& v- G+ e3 W( O
    name_id = info['countryId'], O+ a1 z: H& B
    award_time = info['awardTime'], {- A3 |. z6 b2 `
    item_name = info['bigItemName']' v. o5 ]3 X( W, D/ |: f% i
    sports_name = info['sportsName']! _+ y. q1 `* G9 A1 \) t( x
    medal_type = info['medalType']9 C8 @7 U' Q- _0 j" }0 B. O
    # 组织数据. X! D+ X  h7 J. _! E! V( _5 r
    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]# |! Y& E5 |1 ~# e- k4 y0 u0 O, O
    # 然后追加df
, Y$ |- {+ B! C9 n" Y9 T- C, X    df2 = df2.append(orangized_data): @" S( ~0 G$ s0 g: {* p! Z% M
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']; _4 i  l1 }7 M6 ]0 R( g3 _" v
df2
6 h( b( O$ c4 T% v
% k5 u! A: f) ]# h. }* w* I对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 : z5 U; r4 I3 @4 Y% Z% u% e
3 d; [/ V6 g- M: E0 d" c7 X8 |

, ?; |. u5 b! ~3 H- X二、数据预处理1 j* }/ {$ x$ m+ W; e
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
9 W: H3 s9 H# j; ~
  d. ?& S7 K( e1 v2 Ewith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
. z7 t* U* {% S- F# z  h$ ]    x = f.read()
: L* c8 R) X0 V2 i1 d9 E7 {1 _: K  e; l4 M/ D+ }
df3 = pd.DataFrame()
# l( C5 O# M3 }6 l8 ~for i in x.split("\n"):% s" s* j0 P6 I. h
    x = i.split(":")[0].strip()
. @' c, n- z: {3 B' M+ |$ c4 }    y = i.split(":")[1].strip()
; a& b+ ]% ]0 z8 m    orangined_data = [[x,y]]5 b* G* V0 N% i! E
    df3 = df3.append(orangined_data); f- S- e1 E6 ~( e$ ^
df3.columns = ["名称","英文名称"]0 e* [2 C) m6 v
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)8 s( e  D- k, C. r' C9 T) R
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。! t( V" F; H! t9 ^- q+ `

* U/ Q; i4 S* odf4 = pd.merge(df1,df3,on="名称",how="left")
* q2 y% [% t" s/ s6 |df4.head(10)/ ?5 h  g: C/ [- T" z- e
; f: _# h7 d. }

3 P9 d0 T' A+ R3 Y7 s' p& @

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


2 O; h8 \( A* [2 _5 E- h
( N2 a/ j0 ?( A# N% {
作者: iolia008    时间: 2021-10-31 23:17

+ u" l: y3 R+ q3 W' m




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