数学建模社区-数学中国

标题: 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 Vimport requests
: }1 J' Q. A2 c- t& Nimport pandas as pd
. s) {) O, t2 _# S, O) F4 i: Gfrom pprint import pprint! f7 D; V7 X7 \/ s6 e
导入相关库7 m+ P3 ~7 |- L& l$ V

: t9 A% }( f0 ]* w6 @* w5 Jrequests库用于发起网页请求,获取网页中的源代码;; {8 D) b$ Y6 r( V( ?2 B

4 S/ D1 s5 a- ppandas库用于存储和读取获取到的信息;
: `! P& g3 y3 G1 N* x! G9 C) X% R3 X4 I1 J
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
' D. O$ `1 U- N0 P) u7 x8 ?" G
% ?$ q0 {& F" f6 aurl = '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% Idata2 = 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 ?, fwith 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 wdf3 = 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/ udf4 = pd.merge(df1,df3,on="名称",how="left")
4 }7 O. `2 |/ I: Vdf4.head(10)
: E  g5 [+ }* f3 I  f
# x* p" j) u+ r! R" p
9 s$ s# ^: v8 g' t% F

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


7 v* J; l, U. k% u6 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