QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录- x4 a( U4 |" P3 P1 N0 G5 e8 w

    9 N5 W% f0 ~" f* `* S8 K: B文章目录0 M7 X& H# D) k) U; K
    ! k3 v+ }4 u: l3 o) n: u5 V: W
    前言
    7 J$ E4 p( h' E# ?# U) N  n, m# P+ K
    一、数据爬取: X" K9 j& T% e) g
    5 ]2 F' l& Q: S' x* s. V
    二、数据预处理, S* y( f. w! ?, ~

    5 n) C* e% |$ G; t​前言4 v5 Q( V+ M7 u: G% S( T6 V
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    4 @+ D5 ~3 P+ e2 l# t( s+ s5 n$ C" w3 q5 h3 a3 Q
      Y. t/ h8 S: w; r, }" i* `
    一、数据爬取
    ! |5 v6 \2 q+ E+ n- `6 Pimport requests- U7 x, |& ^$ p" B' i- B
    import pandas as pd
    7 z$ }1 |( s7 Y/ R* D+ ]from pprint import pprint' y& R% j1 R, s' f7 F( y$ U
    导入相关库' ~( L. X4 a/ p8 v' Z6 s6 ?

    1 W; ]  E: e% M! `& jrequests库用于发起网页请求,获取网页中的源代码;0 N- G7 e& e1 S( J

    + k: I: E! N4 \pandas库用于存储和读取获取到的信息;
    / c( r- y- t6 w6 r  g+ ^/ K- P7 e4 q% o& d) t
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;9 Y7 K2 Q, K' c

    " U" \) S2 v; o1 b. W* lurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    8 Y; \3 i  u/ E$ p% ldata1 = requests.get(url).json(): J& t7 w5 L; }$ ?( p- ^4 I
    # pprint(data1)
    * }0 E3 G( f" X: Q1 n# ]3 M  B1 L. H! S5 D4 Z' a0 |
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。* g5 @9 i0 ~; n& U
    df1 = pd.DataFrame()" b' C- q+ D) Q# r. a0 B5 F
    for info in data1['body']['allMedalData']:  ?- K+ M' I3 d/ Z
        name = info['countryName']1 Z/ V1 j) H' g
        name_id = info['countryId']
    ! o" g% D+ y3 r5 h/ p    rank = info['rank']7 w. q( T% Y* m' s6 B. q6 Z
        gold = info['goldMedalNum']
    1 a; x  A+ V9 z' U& `# b# F    silver = info['silverMedalNum']+ m9 [6 o8 ?% b3 p8 {9 r
        bronze = info['bronzeMedalNum']
    ) u5 T  y+ S* g    total = info['totalMedalNum']- O. _$ s+ }" M* s
        # 组织数据% g' [' d3 [9 ~4 V" ~( }
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    $ ?1 \6 q" T7 E) y$ C2 E& `    # 然后追加df
    - P( Q; z% Y% h) d7 b    df1 = df1.append(orangized_data)
    7 d( f' }  T% n& }- y7 l0 mdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    / |. P! y# v: f, N+ k4 Jdf16 E/ c3 j- {. l4 j0 f
    ! s* b( Z& _! Q9 }

    # b9 k7 t8 h: q这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    / E- w% a/ U$ g; L  @url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'. a3 s1 U3 f6 L% `/ D: N8 J$ D* h% M
    data2 = requests.get(url).json()& d- O! G% m$ A4 J- a. f
    #pprint(data2)
    * X; _; {6 w) C% T7 |* A" n6 E% e9 ~5 H7 x" z! I, j5 y) I7 g
    df2 = pd.DataFrame()
    2 o; M! x1 z# ]; Pfor info in data2['body']['medalTableDetail']:6 y" v" R7 ?$ v: F1 ]3 n( N
        english_name = info['countryName']+ s: z3 k! ^' Q2 F
        name_id = info['countryId']
    3 w* n7 E' T3 t0 J0 g1 [0 a    award_time = info['awardTime']
    / b' M. X: O; Q; g1 a  O    item_name = info['bigItemName']- h6 ^6 D$ k6 R( }: V
        sports_name = info['sportsName']
    / G& ~% b1 {$ U6 t9 e! U    medal_type = info['medalType']8 O, O$ a( a1 R3 m9 a; j. ]
        # 组织数据' O& P: l; g) t0 D
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]7 m. y" ^( J) J2 M/ u3 F: {
        # 然后追加df
    , y- {( c6 v3 M7 L; W$ K  U    df2 = df2.append(orangized_data), }. u9 w6 U! b& t* X- Z( o) U; p
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']- b( `7 t* d# D, Z# E! V" P9 v! {
    df2
    & |4 N# G* _* u9 A
    + x. X  R2 E# f/ l/ D/ |, t' [对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 + _$ n/ r! ?1 Q" W0 i$ N
    8 o% Y  e! I& D3 l
    4 k3 ?# R! Z8 m/ i2 ^2 |4 N
    二、数据预处理1 y! L' T( d  n# j+ k
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    1 \! k" m" T$ ^) g& u, W
    5 I7 n5 }. h% e( {2 g9 e$ N2 X9 K" Kwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ' N& I' C9 K" S/ n- M* w* U    x = f.read()
      L/ R% T" i& Z5 z4 T# h! o& f0 m! S7 m( q5 H0 `2 q
    df3 = pd.DataFrame(); h- I( u5 O7 K7 R* j9 C2 v4 S+ d, R
    for i in x.split("\n"):; E9 z- v7 ~7 J! P. O
        x = i.split(":")[0].strip()
    ! K$ d; U" o! K# R, v( t    y = i.split(":")[1].strip()% B7 _4 L% F7 o/ @4 ?2 W
        orangined_data = [[x,y]]
    , V& c5 i* K: U9 E    df3 = df3.append(orangined_data)
    2 y& ^4 i( V+ Odf3.columns = ["名称","英文名称"]  q5 {) X1 ?, p# ]
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    - Y' \7 J/ e4 T" y8 u1 J表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。& t  r) E7 @; U2 M

    8 s3 g* o4 e# r6 _! [6 l$ rdf4 = pd.merge(df1,df3,on="名称",how="left")" B7 {2 Q5 j- [' Z1 K' \- Z, ^
    df4.head(10)+ J: N6 _4 c/ I& b5 ]) r

    % E$ C7 h- s9 y. c( ]
    ) k5 ~) n& j9 C1 W! s4 k3 I

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


    • # ?6 e2 }' z, _. e0 }9 k
      + e- N7 {) [5 `$ f2 k
      ; ]& w' S. ~0 J
    * G% e3 r3 d. Q. r7 R& n
    : R% U) Q, Y- V4 V  }+ }2 B5 x- 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-6-2 22:36 , Processed in 0.380259 second(s), 56 queries .

    回顶部