数学建模社区-数学中国
标题:
Python制作可视化大屏(东京奥运会)
[打印本页]
作者:
1047521767
时间:
2021-10-28 22:35
标题:
Python制作可视化大屏(东京奥运会)
目录
5 K V0 J4 z% d7 s% ~6 m; w B
5 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: S
0 |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 pd
8 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 X
requests库用于发起网页请求,获取网页中的源代码;
1 L8 [7 ]5 c! N5 @: M7 G
3 n( k) C6 o ]9 Y0 b) L; f4 P
pandas库用于存储和读取获取到的信息;
* 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 g
for 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
# 然后追加df
6 X2 G$ g+ }3 q& e
df1 = df1.append(orangized_data)
+ S/ x: e5 _# }( }. a
df1.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 c
6 q& r4 V: b: Q+ ^6 A. Y* [
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
2 @7 e! @0 {! w/ O
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
/ B: J; u/ v7 _+ e9 O2 s) {$ `; Y; r
data2 = 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 E
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
. z7 t* U* {% S- F# z h$ ]
x = f.read()
: L* c8 R) X0 V2 i
1 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* o
df4 = 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表示运动项目获奖详情。
0 x1 R& @+ P: b/ Q
1 R6 O7 e5 T/ [' y7 n2 W
! ^/ c: d1 A0 ^' N
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