QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录. L5 ?4 T: [) [+ _7 C- s. w, R

    2 f% {" U8 r: \9 l- O文章目录7 e6 H, l1 m2 e/ O9 g8 B1 R

    % }0 I+ a- f- _! x前言
    ! H7 {  _- a6 f- [/ p8 p. p: v0 T9 T1 v
    一、数据爬取, ~; W7 w8 F) L! X, _$ x% z2 |
    6 G6 m! }6 y9 ~" L9 ^' f$ c
    二、数据预处理* [) ]  w4 T8 d& |
    # S, y$ J0 [& s; m/ D9 W) [; O
    ​前言
    ; @  }: i( E- E2 T( n本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。) i0 {; z% Y0 c( U
    1 r; c: u( [6 O, W

    6 O5 L% F. B' A4 V4 L; W. r一、数据爬取5 k# M+ H" r' F7 H6 a* @  u4 A
    import requests8 @! Z) @# A  n1 ^, [
    import pandas as pd: G/ S, F" k2 f/ C! L
    from pprint import pprint: ]9 L, b) u% l' _& o/ }8 T. \
    导入相关库! a/ G6 P2 G# `1 a. E
    + ]! d% p) }8 K3 |" I0 ^; g% e, e
    requests库用于发起网页请求,获取网页中的源代码;7 z+ x% O! R- V2 I3 k- X

    0 S' ^  S6 {# y, @  R, o" U9 Z, {& Cpandas库用于存储和读取获取到的信息;: s7 K; S3 m0 ^3 Y; R
    $ G" m. q7 t: [& d0 H7 b  e$ b4 R
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;( h% I8 ?/ ^* Q/ D, @

    " E" b! Z( x. [  ]url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! F) @1 B% w, W" Y/ Y" ~5 \
    data1 = requests.get(url).json()
    $ s5 D" d; B' q: ^# pprint(data1)
    4 G5 ^/ h% r7 u' l7 c
    4 u  f8 F( H4 a4 j& d6 i9 ]6 O8 m这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    + Z4 k7 Y9 I9 {* cdf1 = pd.DataFrame()
    # V! _- h. h+ ?& }. S; Y3 bfor info in data1['body']['allMedalData']:
    ) q% C; ?6 w5 n6 \9 a    name = info['countryName']
    ( E& @' e- m- O; }    name_id = info['countryId']
    / c* i& n/ N/ n! F. }. L6 D+ s    rank = info['rank']  _6 x1 z: W( l) o9 B9 I1 u2 P
        gold = info['goldMedalNum']+ |  w0 N' g* s$ f2 z+ h
        silver = info['silverMedalNum']
    7 M4 L$ l: ]/ Q/ i+ y    bronze = info['bronzeMedalNum']
    * n3 l% n% t2 i* c+ ?    total = info['totalMedalNum']
    ' L' D9 y4 S+ [" C    # 组织数据! G' U6 d+ R0 [0 Y3 B$ ~: x
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
      C! @1 r- l8 P& w    # 然后追加df4 V1 g& g8 Y0 _& v
        df1 = df1.append(orangized_data)3 t8 r3 z+ p% n
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    1 X% a2 k- W) ^7 v1 \# q7 Pdf1! \# ?2 J; S& k3 v/ u
    , Y: D# s0 v$ t, M% g3 n. J
    $ m8 L: \4 V/ r0 D4 @
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    ' p+ D& O5 @0 |: r7 j+ _, O, T/ murl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609', i# ^6 }8 l6 K! E
    data2 = requests.get(url).json()
    . \2 D! k0 U+ T0 O! X7 D4 r8 S#pprint(data2)
    $ d7 g5 {! k2 k- g4 }( ]" J9 j# w7 v8 x
    df2 = pd.DataFrame()
    : f! N& T0 y: \% M# [* G" _1 a, Jfor info in data2['body']['medalTableDetail']:, N3 z# n, U1 r
        english_name = info['countryName']
    6 T- ]/ p- e- {5 M7 @* A/ k  _    name_id = info['countryId']: c" \' T8 R) E
        award_time = info['awardTime']  s/ I4 k; |4 D9 ~8 l0 f
        item_name = info['bigItemName']& d/ {0 u4 g. R" i
        sports_name = info['sportsName']
    ; X) e6 f! S' X' c4 s5 C- q% H    medal_type = info['medalType']  }$ l$ Y4 S/ [/ ?, L8 y
        # 组织数据: p7 G3 t5 W. Y& T# I- \
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]3 `% G5 d5 c  ~0 N
        # 然后追加df) Q8 ^( ^. D, v% F+ y
        df2 = df2.append(orangized_data)" }* N( L0 F+ }9 H) l
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']! D+ A" N% S: C/ q
    df29 x" a: Z, |9 [0 ?: i0 ^0 e, U
    ! h1 S, w7 M7 p+ T) ^9 s* s; W6 {0 D
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    * Q' }- j) E  L$ I# w1 ?
    5 S9 h# ~& @+ R' P+ Z; s
    3 Q8 K' y& g; }二、数据预处理
      V/ g& l* E) p9 m8 e由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。/ ]& x2 {9 z0 i! |
    7 X6 l$ N+ _0 e. C
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
      ^# x) A/ n0 G* W! N" O    x = f.read()' l/ O% ^0 g( \9 Q$ {
    ! J( x  _7 W" u8 d2 @
    df3 = pd.DataFrame()
    ' H* s* s7 m( Y* [* ?7 j& jfor i in x.split("\n"):4 H8 V; G* [' o( C' H7 k
        x = i.split(":")[0].strip()  q, [7 s" V( j9 ~. s
        y = i.split(":")[1].strip()
    4 V2 c: H* g" b2 `: L% ^  b) g    orangined_data = [[x,y]]& i! o5 E* U. Y( _; a
        df3 = df3.append(orangined_data)
    ! D+ I2 U' C* Vdf3.columns = ["名称","英文名称"]7 ~. ^7 I- {1 D
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    & f' ^$ n( F) E表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。. P2 O, d- r& T8 D) B2 G! S/ _
    6 _/ a7 j! X% _4 C- w5 U( S
    df4 = pd.merge(df1,df3,on="名称",how="left")
    % U% j7 J2 ~) Y+ j; Xdf4.head(10); o% {* ]: k1 ~4 b2 ~( W

    ; L) U& E! s0 B+ g4 |& m% Y% _
    * T8 d* k8 f7 H+ i" ~/ X

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

    • % T& o4 U2 w8 J
      % F; Y/ \# x; U  b+ k! \

      : [9 t1 V( i: _- V9 K' t
    5 n" T8 L+ |2 q0 M% ]# Z1 S5 s: \& }
    6 r: b( c7 Q/ {# h  j8 A
    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-26 02:11 , Processed in 0.932222 second(s), 55 queries .

    回顶部