QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    ( y4 f( {% j: Y) d1 N$ ]' ]$ J. `5 l: K
    文章目录2 B' J  z: _  }2 @! V% X8 V

    , |' U$ m6 q8 x- n+ M/ j; I前言
      ]) r3 t8 h6 j2 }+ I+ Q$ x5 S% m1 e( O1 M) _& _% x
    一、数据爬取
    # ~" d, Z! u5 u; G( A4 k9 ?& [6 P( L' N7 f- e9 p
    二、数据预处理
    # t- N1 t. {+ }- v' Q7 V6 K/ h0 n$ X* z  i% u0 A
    ​前言
    3 j2 D# c6 a) _" ?. J3 w/ {- n  @本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
      N6 a  u; j  p4 t& ]
    5 c3 L6 A% X/ A& m( x4 |
    " H2 X7 @3 p! w+ n. P一、数据爬取. X6 e  w# K! q# p5 z7 d! h3 l
    import requests
    8 S7 S2 N! O$ h; d& b+ Zimport pandas as pd  S' C; C! E7 q9 N" i
    from pprint import pprint. d; _+ D  [2 s8 f
    导入相关库7 A4 I# H; u. ^# p- j% Y% B, b

    ! @; v1 Q/ d5 U, S& i* ^requests库用于发起网页请求,获取网页中的源代码;
    ) R7 I9 T7 j% C2 g6 y3 {; ?
    6 g5 m9 Q3 Q- u" P% W+ u" _pandas库用于存储和读取获取到的信息;
    : L. q4 f7 a9 F1 B% p% q6 Q2 L  ^. V1 K" F! |
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;2 B0 I6 l* n: W7 U, A7 w" }( T

    4 I8 x0 j* S( D6 durl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'& T5 O4 L* [5 F& i
    data1 = requests.get(url).json()8 k2 b9 W  z" h* C5 e6 M9 [- H
    # pprint(data1)
    9 ?' D" o7 g! `( [& {. R) I* {
    6 _: S1 C! B7 k- ]4 U8 o这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。, q" X6 L* i% S) i' ]4 T. B/ s; t
    df1 = pd.DataFrame()( c8 _# Q$ p" C( x5 x# j
    for info in data1['body']['allMedalData']:7 L( l! |; S! U2 {$ J; m
        name = info['countryName']  q# ]; J3 h1 L) A1 E
        name_id = info['countryId'], _: o$ j% r) x* v9 X: O
        rank = info['rank']
      X! P! s9 s! R3 ?; V5 X8 y4 p    gold = info['goldMedalNum']& e/ K4 `9 Q& n* ~" p' s% {
        silver = info['silverMedalNum']
    * x% q/ C  h% ?, V0 w- w% Z    bronze = info['bronzeMedalNum']
    - T! @: f. R& A( M    total = info['totalMedalNum']
    6 h* Z: M- ?5 A; s' y+ W3 E    # 组织数据$ @2 p1 N" x0 E% q. \' ^
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    - @7 V- x5 y- J8 o    # 然后追加df
    0 l# d: ^, w3 N0 w+ s    df1 = df1.append(orangized_data)
    # @2 Y) C6 s, S3 @  Wdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    4 n: N7 i  i. ]0 h: w/ _df1
    ) t$ o, {: G8 v8 P- w( a, ]5 z; `/ A8 a

    / E/ y. I# ~: m6 W这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。% Y: K1 T9 p  _! S
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'$ w4 N' x* G- {1 A* u" }' X
    data2 = requests.get(url).json()9 _1 c# w: ?4 q( h5 ]
    #pprint(data2)
    - d- W  l; K' ?7 y6 a" b$ t# [7 E% I' @
    df2 = pd.DataFrame()) r2 C% |, y& j3 j9 y' q5 e# M
    for info in data2['body']['medalTableDetail']:
    # {: S+ c& {4 P' k3 o; j: j  k4 P    english_name = info['countryName']
    - }2 e# k3 E4 I& t3 x' d    name_id = info['countryId']
    # v7 n- u/ O) T, }    award_time = info['awardTime']
    7 ]# e% _( I: q% {  ?" C    item_name = info['bigItemName']* `0 l* o" q% J
        sports_name = info['sportsName']& a5 ^; K3 t5 P9 O3 w0 b$ L+ _
        medal_type = info['medalType']
    0 B# O% @, u: b* b2 @    # 组织数据
    $ H# r' z+ @4 \* ?    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]' X3 t- Z7 `" Y4 H' H# Q
        # 然后追加df
    1 D6 A; t0 \! v7 d, A    df2 = df2.append(orangized_data)
    : h+ Z6 O2 B! |' tdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']# x, Y0 f7 w5 V7 [$ I4 J
    df2
    7 U- R* ^/ L: m# h# M4 o, p  L1 G  |3 }8 h! h0 i. d1 G; f! V5 J
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 9 \: l* `1 x6 D: v: b
    / N" l9 y. y" w9 ]
    & y5 v1 L/ ?* o! F
    二、数据预处理
    8 T# v8 o' k6 i6 F$ i; B由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。: Z  B% A! F1 z
    - e1 |$ X) j2 |. t4 \: q4 @. D, `
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:1 o! K. ]# i+ O/ d1 ]+ o% q+ s
        x = f.read()" |' x5 y, \9 V$ j: \
    + t' ^. k' u& E5 Q, d8 o
    df3 = pd.DataFrame(). f8 a; Q( ~4 N  x0 Z
    for i in x.split("\n"):& V! F! Q9 M: L6 ]  j" L) @1 A9 ^' F
        x = i.split(":")[0].strip()
    / U& T# g2 j: P0 Z* [# N! y. F    y = i.split(":")[1].strip()/ Y8 O- Y- I& y2 B! V' j
        orangined_data = [[x,y]]6 ~1 V1 g) G' w
        df3 = df3.append(orangined_data); R& ^2 W6 h! Z. n$ ]0 V7 J6 F
    df3.columns = ["名称","英文名称"]
    0 }+ A: r2 U: _" Q- C3 ~; C- Sdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)6 B- k+ [7 _8 O6 w5 V7 L
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。. [! y& X3 W! ?: t: j

    % B; B$ Y, p4 u& pdf4 = pd.merge(df1,df3,on="名称",how="left")
    , |! g1 b* t9 W$ w3 a' `df4.head(10)- w, ]  G7 I  w

    " E# [, ?) I/ e- v$ }6 M' n0 ^. c& A8 ?& `. z9 m* H

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

    • 7 m) b' {1 n1 E  ~% t
      : o% J% S' _( x
      4 o( d- H( x1 v1 B
    & R/ ~+ Z/ R! \
    % `9 w" A7 m% A8 O6 E- }
    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-8-7 19:49 , Processed in 0.747439 second(s), 55 queries .

    回顶部