QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    " Q2 ^: g1 p& w) d
    7 R( }" s* G6 m' p6 ?( C5 w文章目录
    ( n' o( J+ e* a" B% s( s% B0 A# |$ L6 Y- s$ f
    前言
    $ W: N( I# L7 E& T% k7 _: A
    8 h2 }2 F3 S- N: \* h# {一、数据爬取, h5 O/ L# p5 ?& i% G( i6 H

    $ h% |  `  {6 V二、数据预处理2 B  a' x8 B5 D/ e
    ) @/ [$ _  G  R! ?1 O; T
    ​前言
    - D; q) O6 A5 a/ V& g$ l本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    , ^( z; z( s* v2 r; V9 w. ?  x0 }8 D+ ?) D( e3 S9 n& F. g7 ]
    & c8 `% A0 w0 N1 T" X! s
    一、数据爬取
    3 e4 |* t' {% }3 f. s! `, v) zimport requests
    ' g1 |/ S4 O2 ?0 T# Rimport pandas as pd
    # ?+ T3 E5 D1 G1 |; Ffrom pprint import pprint
    ( }! @. J2 X, ~导入相关库
    . y6 {' y2 Y% `: y4 F% [* F' s& c& u6 @* Q! L- g
    requests库用于发起网页请求,获取网页中的源代码;# V& V0 b! @( L% |5 _/ Y4 t
    ( ^3 m" j& u+ C' [
    pandas库用于存储和读取获取到的信息;5 |0 o4 n" f! d& |

    1 t" x3 [0 X$ t5 ypprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    " W9 x. j. L1 C
    4 T6 @, M. h( ?url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'1 Q2 D* m$ M" N3 v3 _* W8 g
    data1 = requests.get(url).json()
    : C9 a& c5 W! e* m, I' s) i2 R# pprint(data1)  Y4 T9 p6 e# |' M) F
    + S. \1 |! m8 |6 u( P! L8 o$ n
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。3 [* [' _# O  K% ?$ U
    df1 = pd.DataFrame()8 _1 g: {* ~7 a3 a- w" z# g
    for info in data1['body']['allMedalData']:0 ^! Z" W' \- E
        name = info['countryName']
    6 p9 e" M' k/ W, e) x& [! v6 t* F9 r    name_id = info['countryId']. d8 X) b- n- x, [2 j. p
        rank = info['rank']
    & l/ b  Q; \7 ?' G: ]5 `; U7 Q    gold = info['goldMedalNum']
    ( o/ X( C' b3 O' V2 a- G/ S/ `% J    silver = info['silverMedalNum']0 L' Z+ l; z/ X# S: v  E
        bronze = info['bronzeMedalNum']
    - e7 P/ c8 Z' h9 O* t; H    total = info['totalMedalNum']
    3 u! s" a  B* J% d" Z2 P& O" U# q9 H" \    # 组织数据' d/ s1 w! S! Z) ]5 H, O2 I3 X. H, @
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]' m- z; q4 C2 z, e+ G
        # 然后追加df. S) v# b6 w8 d6 d- R3 w
        df1 = df1.append(orangized_data)
    ) l( ~; o9 ]5 f$ A- ^/ hdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']# G5 ~, l8 o$ E( l  F
    df12 |  l6 x: I) A" B4 Y/ r4 }
    , K# d! G3 d1 S1 A
    ( m# Y! h- s7 |& U
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。& N6 p% \) w3 L' V& p
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    6 a% n& m3 r' v  ~data2 = requests.get(url).json()
    ( c! `/ F9 E/ J8 C#pprint(data2)) Y" j, I, K; K4 N% Z3 o

    & ^; h2 o5 C9 e+ d9 B+ F8 p2 adf2 = pd.DataFrame()
    * M- z5 }( ~% L/ j& q3 Gfor info in data2['body']['medalTableDetail']:
    2 g! v% Q3 q- H& I    english_name = info['countryName']
    6 D8 ^. B2 q9 S. q; t% q$ {    name_id = info['countryId']5 k$ P4 I- b* a' r8 N
        award_time = info['awardTime']' A4 F/ r" p! J  y: E
        item_name = info['bigItemName']1 v" q0 b4 g, g, L- ?3 t
        sports_name = info['sportsName']
    & J& B6 Z) D( q. K' b    medal_type = info['medalType']
      a3 Y9 P4 Z, |, o* t    # 组织数据" A1 P7 F" k2 o* I7 T% Z
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]: [# O+ Q+ y* R, h$ V
        # 然后追加df6 w9 |; Z/ Y/ y* @
        df2 = df2.append(orangized_data)
    % ^" b) P4 C; Jdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    + v6 q( e4 |1 t9 q9 N4 `# ^df2  M5 e2 f  D% ]$ b

      k7 G5 ?0 V/ G  u% E对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    3 k$ S% O+ X5 y' W' g4 m* i/ @: A5 W9 s" b! v% s- ~+ H+ ~6 v
    + X4 [1 j3 r9 a
    二、数据预处理  h' O  l% j/ o9 p
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    0 J6 _! K" o* U9 `9 M- `/ ?/ u
    + H8 S- N9 |+ M3 A. D4 C6 [5 E# Uwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:/ I- s) n# ?  w2 E2 K0 u
        x = f.read()
    1 N! w' Q2 @0 I% [! M1 s) r. P$ j0 ?: G  @# L7 K
    df3 = pd.DataFrame()
    & ?: ?2 o8 F) \$ c. afor i in x.split("\n"):' ]. N& f! v7 M% p
        x = i.split(":")[0].strip()
    % f, w) \" X  O& b, E    y = i.split(":")[1].strip()6 F# k, L% C, x/ _7 t9 u! H
        orangined_data = [[x,y]]1 W3 ~, T* q- _  B0 m+ w
        df3 = df3.append(orangined_data)8 _$ h1 P4 }$ g2 R3 H) ^3 U8 Y
    df3.columns = ["名称","英文名称"]3 D% R' H. m. O. B  E
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)/ Q# l4 y# L! j$ x  [4 n
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。% `3 w2 l6 ^; O! f9 z% A

    - |, v5 z9 X0 Z' c3 Edf4 = pd.merge(df1,df3,on="名称",how="left")2 i# g( K& v& x/ P9 Y3 G, t) J- Q
    df4.head(10): g  a" B" i! d1 W: j. u

    7 G1 @- [3 W. z& |) {2 G+ \% }6 u' g4 m( t+ x; |

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

    • . Q7 Y# ^- R2 M1 u7 b2 F) @1 |

      + p! `% ?2 ]2 R! W: K  g* K& f$ F( P1 {" M' T  z2 u( [
    1 s2 D. Q# J8 [

    3 u; h; k2 `' e9 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-1-7 09:36 , Processed in 1.213742 second(s), 55 queries .

    回顶部