数学建模社区-数学中国
标题:
Python制作可视化大屏(东京奥运会)
[打印本页]
作者:
1047521767
时间:
2021-10-28 22:35
标题:
Python制作可视化大屏(东京奥运会)
目录
! z: I( ?% s5 M" `, \4 X( J
8 R7 W$ p" G6 `( o& l* B' ?4 d7 N/ h* O
文章目录
2 j' G/ w6 C2 U% x
6 h0 C1 J1 `: _$ a- G
前言
6 o/ u! @2 y- ]. H& K( U
# q. ?8 P5 t; B* c C( q
一、数据爬取
; V4 \# P1 U, F* {7 z7 Z' i
; J$ O+ w( _- @) m
二、数据预处理
' q1 j4 \* B0 y- l, f) l
3 q( q* b0 @5 e1 Z4 v
前言
. E" m- u. Q, v% S" Z8 U3 |
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
5 V6 b6 I: j3 l4 S7 _* M J* f7 H$ u
! h* p% | Q+ M' ^! b2 x
# g+ ~: p' n3 }- V# B4 } b
一、数据爬取
# q. ~6 Q2 w: Q6 V
import requests
: }1 J' Q. A2 c- t& N
import pandas as pd
. s) {) O, t2 _# S, O) F4 i: G
from pprint import pprint
! f7 D; V7 X7 \/ s6 e
导入相关库
7 m+ P3 ~7 |- L& l$ V
: t9 A% }( f0 ]* w6 @* w5 J
requests库用于发起网页请求,获取网页中的源代码;
; {8 D) b$ Y6 r( V( ?2 B
4 S/ D1 s5 a- p
pandas库用于存储和读取获取到的信息;
: `! P& g3 y3 G1 N* x! G
9 C) X% R3 X4 I1 J
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
' D. O$ `1 U- N0 P) u7 x8 ?" G
% ?$ q0 {& F" f6 a
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
3 l5 @* q4 |; `2 y1 ~. C
data1 = requests.get(url).json()
( d* v$ b1 A8 o5 `# v
# pprint(data1)
4 _( u# }0 ?8 P
; t2 l7 S, s& N" V
这里利用三行代码就可以获取到网页的源代码,利用
pprint
库,可以清晰的展示json结构,对于我们解析数据很有帮助。
: u4 j$ z1 X0 \4 M
df1 = pd.DataFrame()
& q: m" j0 S$ Y; C8 D2 ~* |+ f/ R
for info in data1['body']['allMedalData']:
) u3 _7 ?- s+ ^
name = info['countryName']
$ ?; p7 z$ n! n) d( w
name_id = info['countryId']
7 N+ a6 `0 m- |; M9 f2 q
rank = info['rank']
& b4 j7 e/ O) P- J V
gold = info['goldMedalNum']
# i3 V7 y6 ~) s9 H8 m+ j
silver = info['silverMedalNum']
, o! r$ b% R8 \8 C1 i6 B& c! L. N w
bronze = info['bronzeMedalNum']
; B, J5 F, z8 ]) `! l9 J
total = info['totalMedalNum']
0 T( X6 V" p6 a; ^3 |' O6 l
# 组织数据
# f) F1 z- F- }( @% L/ ^
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
' T& x* b2 a$ Y! R
# 然后追加df
; n( w* f% o1 }: C9 e5 U& G" d B
df1 = df1.append(orangized_data)
/ z, m! p' V/ a1 y/ l
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
: F, A! k; l3 Q5 D. f
df1
& ^1 E+ e! D1 V$ I1 Z$ U9 Y7 u( s6 F
' V( i% B [( {5 K. t: G- P
% h b7 b. O& s# ]5 v2 N0 w
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
9 D3 J/ O. r& q
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
( G1 \5 F% Q! c8 n/ D' C/ G6 x% I
data2 = requests.get(url).json()
* y6 S, ? H; b$ u1 s8 {% p
#pprint(data2)
( M: z5 _3 w/ [9 T. M; W
9 r3 d. Z- ?/ O7 O) g; d' [
df2 = pd.DataFrame()
# p7 u4 c- B* M+ q' i- ~8 R
for info in data2['body']['medalTableDetail']:
; Z& e$ F+ y% Z: U. r
english_name = info['countryName']
9 I1 M ~. i6 |: b
name_id = info['countryId']
q1 i2 {! u* m
award_time = info['awardTime']
, F. A; f+ @+ ?" D
item_name = info['bigItemName']
+ R! s2 C5 s6 J: q
sports_name = info['sportsName']
( s8 c& e+ _" |0 A$ R9 } Z
medal_type = info['medalType']
m5 |( G: f6 V" j5 Q' O; W
# 组织数据
; {: l$ w3 P% W
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
0 I; u3 {" Y4 t! x1 Y
# 然后追加df
& j4 j! [* p6 m7 t
df2 = df2.append(orangized_data)
3 x- f) c/ k( Q
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
: a8 V& Q- b! ^
df2
: G5 [9 ]& M# D0 A2 C3 l
' t _2 T/ _! C# C% O5 z
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
2 a9 U, f: n2 I8 ?
' j5 B; @ b' ]* F+ ^! K
5 Z* P5 }2 a7 \. R
二、数据预处理
: c" n' H7 v1 F# v' `
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
; |. V& Z, I3 C1 R* Q$ p8 G# |7 p6 z
8 \! i7 P% j D8 ?, f
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
$ w5 R7 X6 J) R& d2 i/ \( n
x = f.read()
; l( S, S9 ]/ _& y
; m2 ?7 i+ T. A0 o4 w
df3 = pd.DataFrame()
9 [6 ?0 d/ u/ F+ U; @4 U7 ?3 R
for i in x.split("\n"):
) d- ^, p* G) N2 D; _
x = i.split(":")[0].strip()
! ?6 C( l* n5 y; F: e ~ ~. ^
y = i.split(":")[1].strip()
, F& q: D" i: \- ~& \9 i6 I
orangined_data = [[x,y]]
; Z! t Q; E: ~9 ]! A
df3 = df3.append(orangined_data)
& y. R* b8 p8 ~6 m+ U8 [
df3.columns = ["名称","英文名称"]
/ a1 e8 l; Z7 @. J2 ?
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
9 E: z- {3 q6 Q) W4 {2 F
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
( h0 C' @4 G: U8 S$ @
3 N2 c# t) v: r& D" H/ u
df4 = pd.merge(df1,df3,on="名称",how="left")
4 }7 O. `2 |/ I: V
df4.head(10)
: E g5 [+ }* f3 I f
# x* p" j) u+ r! R" p
9 s$ s# ^: v8 g' t% F
表格df5表示运动项目获奖详情。
; O D8 e' e& }8 f6 |
1 b* A* k& A9 U2 D; m: j& G* ]: A
+ x4 O! A' X0 |5 C6 K4 R
7 v* J; l, U. k% u
6 T% L; p$ d: B" ~1 ?1 K) o
作者:
iolia008
时间:
2021-10-31 23:17
8 a5 |' B5 |) U. k1 f% A/ v2 U8 \
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5