数学建模社区-数学中国
标题:
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 l
import 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. Y
pandas库用于存储和读取获取到的信息;
: 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 i
data1 = 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( Y
df1 = pd.DataFrame()
( E9 e2 @: O E# O( _! L/ K( H
for 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! t
df2 = pd.DataFrame()
8 E& b6 M. m6 _% e3 b
for 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 ^
df2
2 [) 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, z
for 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 j
df4 = pd.merge(df1,df3,on="名称",how="left")
* K$ x, `9 Z/ F, l1 s
df4.head(10)
: N# N* s) @& \" P
' u% z$ Z& l9 E: A% b
1 M- f9 k% U* l1 U
表格df5表示运动项目获奖详情。
/ K& ~9 G/ A; z# X) G R! x3 L* H9 g
9 ?9 S' U6 ^/ ?1 ?
8 x' l6 @7 J1 L
/ 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