QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    - C8 g- ?) [: z0 N  I
    ; `! h1 W, c9 s+ P文章目录, [$ o* Q9 y7 q- i
    + G, m% ]9 @( r* S9 M4 C- i9 L! D
    前言
    # ^8 ~5 n& m* |( H
    . p  E6 G; P1 z6 r  P! T! t) T- h一、数据爬取
    / z" J) [& ]4 [2 p+ E/ [, `1 ]. N3 _$ L. \
    二、数据预处理7 _6 x: ?& ^' I9 v6 a4 M) L$ {

    ; c, e" M) c1 {$ y+ i) M​前言
    ( V# i2 G' d2 \8 j9 _9 w, J1 V$ ]$ m; b本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    7 p: O5 f5 V& u/ G& R5 g; ]8 f2 y$ M! F( ], q& O  D4 e8 Y
    5 e: X, @" y$ n) D' K
    一、数据爬取
    : v# H' {* U, k5 ^$ Y0 A/ H1 g5 ?- |import requests1 l# v8 O! D# W8 K
    import pandas as pd. L8 d8 v1 `. G" d8 H
    from pprint import pprint
    9 H* B. l. Z: k导入相关库& t  L! D* _" @2 v+ U

    1 N" Y: G, X" ]: @4 ?requests库用于发起网页请求,获取网页中的源代码;
    8 O) x* f/ e& Y1 w! O& h% o! Q" Q; t0 G4 F4 o) k" S# N7 O* x
    pandas库用于存储和读取获取到的信息;& \, Z5 [( q! O5 E/ S5 d( r

    7 F9 f; i, m1 H' ^2 x8 dpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    - h* |2 _* u. q' o
    1 x8 b* T( {! Y/ `5 |; F9 o3 j- Turl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    9 M9 }! w/ B+ Z: V  edata1 = requests.get(url).json()
    ' w3 Y8 X, F/ o$ q+ E8 _& K6 R# pprint(data1)# f' F# w; G( r5 I7 |; M

    , r+ O$ t. n2 _$ `8 y( R' k: \这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。* I" o" c/ `0 d0 g2 ^
    df1 = pd.DataFrame()
    0 O7 x% M: j1 x/ }7 f, x2 ]for info in data1['body']['allMedalData']:1 d7 T" Z# Z( ~2 }
        name = info['countryName']
    ( I, l% D5 O! m    name_id = info['countryId']! I2 R- @8 p3 [, r
        rank = info['rank']
      j7 x4 R; a% u2 X( Q+ z* k2 F    gold = info['goldMedalNum']) O. `. R/ D+ a- o3 h, p9 k- [
        silver = info['silverMedalNum']
    & Q, B7 h% f9 J    bronze = info['bronzeMedalNum']2 o0 b, ~: Q  d$ _; ~- i0 c4 |
        total = info['totalMedalNum']
    / Z) {, P7 V4 K$ i% M; U    # 组织数据9 V3 z9 D7 `9 T, N# Y+ [
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]5 o2 V/ p$ a' i
        # 然后追加df: G. K; \: x$ }7 b# p
        df1 = df1.append(orangized_data)
    / D# L1 [$ h: ]7 sdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    , @1 ]4 m" O) b& Q  I! Xdf1! C$ x4 D" q8 @* ^) @9 x* w) |$ U

    ' ^% |) ~9 m5 j/ Y% X* q/ u1 }3 N* c. G) G0 [" O1 c
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    5 ]3 q4 C+ q8 S  H$ I9 _url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    " C; ^1 C& W6 x5 Vdata2 = requests.get(url).json()  _3 ?! o- t' E! e7 [8 X
    #pprint(data2)
    ; F9 _; K8 ~) U1 J+ x+ R! {( ]8 a% N9 _# B* N2 b
    df2 = pd.DataFrame()
    : v5 Y$ A5 Y5 ]1 ~for info in data2['body']['medalTableDetail']:
    ( M8 M2 F8 D2 }$ Z' K/ i- v& W# r4 L    english_name = info['countryName']1 ?6 l: p8 B( n) g4 r8 p
        name_id = info['countryId']2 p* w. h  ?/ R( X
        award_time = info['awardTime']6 t' l8 V2 p! _
        item_name = info['bigItemName']
    , ?) H# L! I4 J  B3 t& Z% p! L    sports_name = info['sportsName']
    # a7 ]0 H6 M/ V2 i. B/ f9 U    medal_type = info['medalType']3 f: ?6 `! y3 s
        # 组织数据0 ^+ ]* _2 S( }$ `5 Z
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]) b2 v2 ^4 b" v! I
        # 然后追加df7 ~- \* \; b* a& k$ |* k0 S
        df2 = df2.append(orangized_data); T4 N& D3 a# c# Y
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']& J/ l7 v- X0 r% c# e! k' V5 M& c
    df26 V/ N% n9 |' X0 A2 i

    % \6 a' }( }4 n对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 * F+ O9 O$ w7 G' H" |6 p7 \
    # x1 @) e; O# C3 s+ O9 \
    ( K+ N$ s1 H  \
    二、数据预处理
    % a1 |  U8 ~0 v+ i1 w: Q3 x2 m- Y+ @: ]由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    : J7 E# ?# i& j  F% n/ t  R# B. m% K1 r# e+ E
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ) ^  B8 k* {! [. _& J: _. W( f    x = f.read()
    $ A" d8 U7 _! u, ~" O
    ( v2 P2 M2 t! k  K' j) u8 ddf3 = pd.DataFrame(); X5 N3 U. I1 V2 s. j+ R" r4 X. n
    for i in x.split("\n"):4 q! k' O/ ]; M* u+ i1 A0 G
        x = i.split(":")[0].strip()* J" K1 Q, C! a" |
        y = i.split(":")[1].strip()/ j0 T! t; Z; `: O& [, M
        orangined_data = [[x,y]]0 y: r! e  V' U0 m
        df3 = df3.append(orangined_data)
    $ o  F$ ^3 c+ n+ sdf3.columns = ["名称","英文名称"]
    3 V: L8 D% ^% n- m! ?8 g) Pdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)& K) @1 y: g9 C# p
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    ( v. k) |, x% K+ [3 u9 z  P/ a8 |; ^. P8 U7 p- X% z
    df4 = pd.merge(df1,df3,on="名称",how="left")
    ) x( k3 u% _  a8 @df4.head(10)8 \$ _% I5 L4 A

    ) K8 y" H3 L% F- d: O( w0 t0 E0 O! m7 F

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

    • ' A1 Y) C/ ?. Y
      7 _& e2 A! m4 I8 C% [; L& K: j

      ( P, _0 A! {$ `. i, \

    . D* ~/ k8 l9 ~/ x0 o/ S' s5 h! K6 F$ Q
    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-7-19 09:01 , Processed in 0.689665 second(s), 55 queries .

    回顶部