QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6231|回复: 1
打印 上一主题 下一主题

Python制作可视化大屏(东京奥运会)

[复制链接]
字体大小: 正常 放大

1178

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    # e% x0 i* @2 Q- l: M& k
    % C- q" F# |+ T! O5 b文章目录
    5 D8 p/ e% T# T; i( y
    ) t( }' ]% p/ _  V- t前言7 T% c! M& ]$ R( s, E8 L$ E

    % V, J2 @: @% x: U" B9 s4 X一、数据爬取
    0 ]4 _7 D) Q& c7 J/ e, g3 O8 n) W1 q' l) Q8 y5 n
    二、数据预处理2 E8 Q  w% ~, `2 |# S! _

    , s8 E, u: O1 c: J; N8 a1 y) }! J​前言
    ; |% ^2 C2 v# \+ d" Q" D0 X8 v* \本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    3 B9 v4 p8 x2 V/ h( ]5 Q' n( w6 ^2 y3 V! ]0 u8 D" U
    2 _, L# d$ D+ I8 l
    一、数据爬取
    ! Y' a5 F7 n" X) ]" O5 nimport requests# V2 _) V( Q, n6 o
    import pandas as pd
    ) a) ?' a$ O* h9 c8 q, jfrom pprint import pprint
    2 V' O' Z* e4 l6 k* C% P. Y导入相关库: V4 N0 M0 A  i( N2 @; a

    . h9 V# g6 }6 T8 ?requests库用于发起网页请求,获取网页中的源代码;/ i( c1 A* V8 h' N( U: s$ s8 m

    1 c- V% u7 A/ B4 i; f$ I* [9 qpandas库用于存储和读取获取到的信息;# L' c5 Y$ o9 _' h

    ' w: x2 ~! E* N) u4 cpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    9 U% N" I: _  ?4 }" @! N, h! R' A4 z( v7 Y1 J9 g
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'% j  l! B" |) C6 L
    data1 = requests.get(url).json()
    + o2 _1 k) c/ F7 V# pprint(data1)
    ) G+ K/ }8 G- m: R3 L" K
    + s0 \7 b. ?+ V6 G( M, c这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。1 D3 t; K% i) b. m  q  }+ @- e4 s
    df1 = pd.DataFrame()
    ( i) i2 D  D; Y- R. H& X' }  p, _8 afor info in data1['body']['allMedalData']:
    & v, K1 V# U2 T, e4 o3 P    name = info['countryName']" S6 q0 C# K+ }9 s4 _/ ]- d7 r
        name_id = info['countryId']! N* @. ]4 ~) H1 s  d6 R
        rank = info['rank']
    5 P9 J* M( h+ }! K/ a    gold = info['goldMedalNum']. E3 v5 x) p6 L, ]
        silver = info['silverMedalNum']3 z9 |' R8 d6 T
        bronze = info['bronzeMedalNum']
    0 j; h6 V8 b' E    total = info['totalMedalNum']% Y2 U5 x3 ]+ W( y
        # 组织数据
    + Z' N1 u1 |4 s& T; V# k3 J, I- ]    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    6 E! Y* \; ]. Y, X5 {" o/ r    # 然后追加df
    4 z: ~" v8 Z3 _$ l  I, u2 V    df1 = df1.append(orangized_data)- R+ K( N6 u, z- X& |3 m/ V
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']! I/ q/ H6 w' ~  |
    df1
      s7 k: h+ S- K4 C- H& O- ?% C# f# V  S3 p# D; j( g5 p5 v; [

    4 L( _( l9 n- n2 {+ H4 O" ~这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。5 j+ Z* f$ l! ?
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'! ?. T  t7 s- \! e# d( M5 t6 }
    data2 = requests.get(url).json()
    7 E6 W5 M6 n$ t5 |$ g#pprint(data2)
    4 v  I% f; y2 A8 ~% a6 h
    0 u3 V) O/ f' {! }1 K* I8 Qdf2 = pd.DataFrame()
    2 P9 X5 E! y9 e8 A5 dfor info in data2['body']['medalTableDetail']:5 n% ~7 o( ~! [( ]! a( ^& m
        english_name = info['countryName']- c! ?$ c7 a+ O! a7 v3 N/ a
        name_id = info['countryId']( }( k# ?+ E4 |, \& x
        award_time = info['awardTime']. w0 E" U8 l6 p. h; [1 L+ ~
        item_name = info['bigItemName']/ }/ e$ T1 F# M, Z( e$ T/ U# f
        sports_name = info['sportsName']
    % M0 L/ z# e% ]    medal_type = info['medalType']8 U7 g" v( P. W& ~9 \- G+ [
        # 组织数据
    . t+ F: W& v2 _; ?0 Z    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    2 x- Z+ h. \/ P1 G5 T; y    # 然后追加df) d% V9 k1 F: q  B
        df2 = df2.append(orangized_data)
    3 @& V  }+ W3 m5 B  Adf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    # f$ Z2 a5 H/ v: Z0 l! }df20 a' W1 p+ g7 B5 \5 o
    " Y. Q% a3 a+ j
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    2 R6 Y( D* M/ [& ?) d7 [7 }6 [6 Z
    , o# P+ p* \% f
    / ^, Y" p9 n0 F二、数据预处理
      w$ M/ W6 G7 T, j) I4 v由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    $ O) {, Q1 f: u* W- I, m- k) w
    ) N9 R6 C& e8 R  h. X, mwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:* r$ l( w, \) Z; u$ f! N
        x = f.read()# M7 f  Z7 f8 e

    $ V+ Z5 F7 Q! S4 |' i0 ndf3 = pd.DataFrame()4 p% E" G3 y, O8 O$ q
    for i in x.split("\n"):! ]+ T8 m' W) t3 D" ]
        x = i.split(":")[0].strip()* D) o* n/ j; i" S3 s
        y = i.split(":")[1].strip()# P. m) y3 j/ M  A  K3 _" U8 p, @
        orangined_data = [[x,y]]
    ' d& q3 d7 W$ w% i" s+ R$ ]    df3 = df3.append(orangined_data)
    7 I& m- v0 Q3 o) Ldf3.columns = ["名称","英文名称"]& r" J: G3 r( T( W
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)% ?, D' P- x& I: ?; ~& n, y
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    1 C% A" U" E3 Z3 h6 E
    $ P2 F% z1 h" m! Z9 Cdf4 = pd.merge(df1,df3,on="名称",how="left")" m+ |3 n) O3 h% y
    df4.head(10)7 }, _( ~, J* D5 I4 b# p

    5 e/ |+ i* s) B/ o6 T# Q
    0 @) V  Z# {, |9 i3 s

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

    • 5 ?- Q  W5 R9 W7 Y. R  ^
      & }% p$ n, S2 W/ L+ L  _

        i$ V% t% Y" C( T
    ' U& b9 Q* `& j' s2 s

    & J9 n8 W2 B0 o1 w- @+ Z% R
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    iolia008        

    0

    主题

    6

    听众

    44

    积分

    升级  41.05%

    该用户从未签到

    自我介绍
    好好学习
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-21 19:53 , Processed in 0.415077 second(s), 55 queries .

    回顶部