QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    目录* x/ @- ]  h& v* j4 h: t

    1 p7 V0 z0 d: y. }  b% P4 j: k文章目录9 L% U9 T' G! @- r6 m$ X+ r
    6 B  I  n* s- F4 [; p- B5 Q
    前言& v. ^5 [0 @2 E" x3 B7 \7 k6 f& V; A
    # f" F0 M; X8 t9 A: u8 |* E6 V
    一、数据爬取2 G# M2 G$ x% U
    6 g% c4 J9 ]- R- |& l5 c
    二、数据预处理& E1 k6 m" f& ]- x. |5 c% @

    5 B. }0 ^0 E+ ]! }" n& I, f​前言3 o3 Q( r# f, g, {" {, m: H
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    ) }7 r, \+ x5 ]1 r2 O. V+ z
    % k  h' [/ x% l9 w
    0 Q9 O* A. f/ Z一、数据爬取. n- M+ J. I7 j2 V! }7 [: g# }1 K
    import requests
    # K; d, @7 E1 L8 s" G+ h9 L5 Ximport pandas as pd: L+ R: @& o+ ^  S5 t8 A  O. P
    from pprint import pprint  \7 T  N1 a8 l9 s+ w
    导入相关库
    / P! E0 N5 }7 ?) D* Y4 @" w
    + k) `, W( l+ V' K! Yrequests库用于发起网页请求,获取网页中的源代码;
    * S. Y" K! P1 D" o7 F- x
    - K- x" w' K9 \2 g. Tpandas库用于存储和读取获取到的信息;
    ; L  _$ L3 Q% d% B/ R: B
    7 Q! M  y" @* E3 O; |6 Qpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    . r3 o) k$ C2 W
    , X" n& W; U5 d& wurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'" p8 a( j! _, T* O+ _
    data1 = requests.get(url).json()
    ' R' G8 Q9 N% F" h  y9 ]# pprint(data1)+ |8 [. S( L4 g! W  F3 L

    2 a4 G. a$ e. {% j0 u, n1 }# I4 T4 P这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    - C0 W1 L. B7 \! c5 R( ?1 edf1 = pd.DataFrame()  H: L3 l1 J. m% D+ O' _- F+ \# S
    for info in data1['body']['allMedalData']:
    ; l* K& O2 r3 M& p1 |* H2 }    name = info['countryName']
    ( n" t+ t: Z( q1 X, I& @1 Y' n    name_id = info['countryId']/ ^$ p) z( r  _; P' z
        rank = info['rank']
    + g* O3 b7 T8 w6 n; W' P2 c    gold = info['goldMedalNum']
    : q$ v1 m7 F8 c; Z9 L. z    silver = info['silverMedalNum']# S$ f$ f  g+ k+ c" J" v# Q
        bronze = info['bronzeMedalNum']/ A4 A+ [  I  |5 u* F; d
        total = info['totalMedalNum']2 `! M6 b2 ~" g0 V0 o
        # 组织数据
    4 n0 u- r- N( a5 w% R    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]& u6 B* p- q+ @
        # 然后追加df
    8 j1 o7 K- u1 Y" F6 y    df1 = df1.append(orangized_data), J7 M% C, o; T- N
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
      y( ^* D$ @* M! }& E% W! Pdf1! J1 O0 |. v" v9 P' F

    6 D# j4 h. e! e4 S& Q1 o" t8 P
    7 U; p2 b. k" J9 [- w1 t4 C" g这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。$ ?4 o. T6 m+ k& ]0 C9 B5 a' t5 Z
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    , g& W( `! f, t& [/ Rdata2 = requests.get(url).json()
    / G* P& P* L- b2 Y9 e#pprint(data2)# M$ n/ {$ l6 h2 @4 c' z. i

      a$ C+ Y1 l. Q) qdf2 = pd.DataFrame()
    , X3 Q' m& r% afor info in data2['body']['medalTableDetail']:! N( S% W# \; B: s" @% u7 o
        english_name = info['countryName']
    $ X* Z: ]6 h: J& M( V% `: q    name_id = info['countryId']7 L1 y6 O" g# ?
        award_time = info['awardTime']" D/ R9 A7 y, ~( s1 K
        item_name = info['bigItemName']
    + ?- ?0 S4 Z+ a; K+ h3 T    sports_name = info['sportsName']$ x4 H" R0 E* m' G3 Z
        medal_type = info['medalType']$ a" L) c! s8 U0 \9 v8 d1 l
        # 组织数据/ K, ?! v* z$ U# D+ m0 G; `
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    & F; e0 j/ f3 h5 _+ m    # 然后追加df
    6 s6 o& N7 \5 O+ |" Y0 c( ^    df2 = df2.append(orangized_data); a5 I+ v+ G) n  a/ z* k( n
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']. Q# h2 ~; s3 N! \
    df2
    * [; W4 m% K& p1 f* M2 x" S4 ]$ A- ^( d5 v8 b" ~- u
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    5 g9 P5 M! [( {2 Q- ?* ^+ f+ m8 E- N' T# m5 H

    2 F" \6 H9 ]! H/ Z, z0 `: r6 |二、数据预处理
    9 y) |7 j/ T: h  s# s由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。! K: Q; w+ Z6 h5 e6 ~3 E0 P/ @% \

    6 t' W- t% v0 h1 Bwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:9 ^3 `  o* y7 N4 E: C+ m% D
        x = f.read()
    ( W  t2 b2 \8 k/ g1 ?% Y
    . ~+ }6 ~6 W; t& B6 R1 H) rdf3 = pd.DataFrame()6 N- {* y9 C3 p0 g+ X- ^) k
    for i in x.split("\n"):
    - X6 x4 v1 e6 r# H! M8 Y& G% l    x = i.split(":")[0].strip()
    * X* w' q% O( w2 @+ ~! i6 j    y = i.split(":")[1].strip()3 k7 \* Y6 e# q0 J0 @6 M
        orangined_data = [[x,y]]
    ! K) K( R; J' ^) H1 E3 K    df3 = df3.append(orangined_data)4 z3 q1 G3 J/ w7 k
    df3.columns = ["名称","英文名称"]. u1 H+ d: r9 |2 G/ ?9 [2 J
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)' S3 U( I' V2 z: E( |
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。( L+ x5 J% T/ q8 h3 N4 u/ Z) l  h7 }1 K
    4 Y* M0 J; U" r) E$ j
    df4 = pd.merge(df1,df3,on="名称",how="left")  z4 G0 g0 Y: _: I8 c
    df4.head(10)4 q6 H* j6 r4 j- Q
    : k$ l5 N2 x( z" W5 t6 ^6 H
    . w5 Y1 U/ X5 B: o6 l) @5 J2 }

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


    • 1 {: g3 y- `- I, Z+ {+ @

      ( x& j+ [& d2 a% Q8 {" ?. k
      3 n, P! i1 U: ]. D1 Q4 K' q
      h5 A/ _( a+ W5 M' n

    7 O, ~5 B% R( U1 G9 l- G( S
    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-9-2 07:43 , Processed in 0.477876 second(s), 56 queries .

    回顶部