QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录4 J2 ^% ^( m+ y

    * @3 v% n, ?) }" x' p/ ?8 u文章目录
    & x7 c6 `5 d$ c4 p" U6 Q
    6 ]4 A) J9 L* P( O' \前言
    3 E3 D' ^4 K/ ^7 l& n# T* H' G
    3 E( `! P) _# z* ?2 a, H7 {一、数据爬取
    0 ]1 k: b) j/ ?. k* Q0 @9 o' o3 |& x8 R- @
    二、数据预处理
    1 J1 @! G4 S7 f* v" Q" I  ?- ?0 b2 ^2 ~. E8 x
    ​前言. V8 W, [- k2 ~5 n
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    : S4 \: h/ k' y: R, ^; m4 @1 V/ `) N" H, }# C
    $ @* ^) M; W' {5 s( V9 X
    一、数据爬取
    % i, s) i8 C5 |: z, pimport requests
    8 w4 U' [0 u8 A  [import pandas as pd( Y% e( ~1 t& X/ l; M: ]
    from pprint import pprint
    4 ^8 p7 Q% Z  R8 C5 H$ {7 L  b. `# Q导入相关库
    # z' d$ `# T1 d+ v/ A, \* h+ c8 s$ M& G, u: b( a5 M# n8 t' N
    requests库用于发起网页请求,获取网页中的源代码;
    $ Q8 S: T; Y8 i6 d
    ( ~; ^' d  {! C, opandas库用于存储和读取获取到的信息;
    . B0 B4 U2 P# l2 w, ?* Y
    ! E9 D- V! m$ p+ z' J! S& t: Fpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;+ B# O( E8 R" U$ K1 A" G1 x

    : O* p' l: \8 T  m+ ^8 F1 R+ j& kurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'1 V1 D/ E" |% W5 A
    data1 = requests.get(url).json()
    $ v- Y. T) o7 {6 \# pprint(data1)
    ( J4 m4 U" F2 _) x, q( o2 @- i1 l' A8 A& N
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。  y0 x4 a9 W4 I# \* p
    df1 = pd.DataFrame()
    2 t- G0 Q1 l  b+ Zfor info in data1['body']['allMedalData']:
    0 Z9 ?; v4 Z5 o! n( r    name = info['countryName']; F' W+ d4 ?1 O6 ^/ j0 _+ j9 y
        name_id = info['countryId']* V7 a* v) ], _  D6 @6 u6 G
        rank = info['rank']- S7 \% B8 y, N2 ^8 h: e5 m
        gold = info['goldMedalNum']8 E$ i* A9 [; O
        silver = info['silverMedalNum']/ R% t2 Y1 V# C3 h* Y
        bronze = info['bronzeMedalNum']
    3 X# t, {# x& N+ E    total = info['totalMedalNum']( k; ?' R5 |, L
        # 组织数据
    8 _' H/ a6 `& c    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]) o3 [4 Z% J+ m- W# [9 R2 X  Q
        # 然后追加df5 ~: R; `# T; z; R+ r9 {( `# L
        df1 = df1.append(orangized_data)
    $ G% t$ p" {. \  f/ F7 t8 k7 X4 |7 xdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    ' d2 P6 R' V6 X+ e: _. _df11 G3 \  ^; N4 T- r) [9 q

    : V# I7 [" z2 X- F' Z4 M* ]% S+ q- a
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。- Z) F( q7 c; I  }+ g
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    . Z0 N8 x0 i/ B* U1 A- ^- x' ]data2 = requests.get(url).json()
    6 x: b9 @# l$ g; G6 B0 d7 u#pprint(data2)  f' }9 i7 s9 E! \
    + z2 A4 a4 O" N( v9 l1 w/ A+ W
    df2 = pd.DataFrame()9 Y# s$ {% d" ]5 P& i) E
    for info in data2['body']['medalTableDetail']:
    & Q7 K3 Z) K" v3 b) z9 b    english_name = info['countryName']
    7 z6 w! ~, Z6 W' A  p    name_id = info['countryId']/ V: H1 W* |' E) d
        award_time = info['awardTime']
    5 O5 L. `2 t! o: z    item_name = info['bigItemName']" L% h, u7 p/ @' f3 ^
        sports_name = info['sportsName']
    ; L, X' U$ {" Y    medal_type = info['medalType']- I  i4 U8 B& [. Z3 [8 ?, B6 D
        # 组织数据% l1 f. v1 }7 h' S' s9 T; {: P
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]3 |6 P' c2 `) X3 X4 p2 O
        # 然后追加df
      Q# X  ~1 j: q$ |1 `    df2 = df2.append(orangized_data)
    / Q! \7 s6 I3 odf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    5 h7 _5 z0 L. c7 P4 V3 o9 edf22 W" E) d' _' A) W! [0 h/ p
    ) n5 Q$ t" a  p6 ?9 L% l
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    2 \6 Q. N2 ~0 c' \
    0 L* }/ [" F9 e5 e. I' `2 v' [* Y! H; j3 l
    二、数据预处理
    3 h* [: O, z+ h由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    1 Q* }% r8 i% n7 D8 l& J) s5 e* y& G& n! h6 y# R' t7 ?
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    9 R0 R) B5 W- u$ ]& c' S    x = f.read()
    $ ~" a9 w+ Q& w
    3 u0 c2 Y1 N% h- M9 i4 R' Xdf3 = pd.DataFrame()+ y& O4 F$ S; `8 @8 ?, d- D& x8 W' \
    for i in x.split("\n"):
    7 p% i( S1 X7 j, Q- O    x = i.split(":")[0].strip()3 S+ u; @' ?/ n( Y; i: z$ m
        y = i.split(":")[1].strip()
    4 H2 u3 h' L& Z: A    orangined_data = [[x,y]]
    ; J+ A+ D. l' }0 h* ^    df3 = df3.append(orangined_data)' f, z6 @% G, H1 R6 z
    df3.columns = ["名称","英文名称"]
    . f' {- k" y! W0 ndf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    ; o2 E4 i2 U# o: C7 i表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    5 j; g' l* B) e% _2 [8 j, P% i& t1 N% L% ~
    df4 = pd.merge(df1,df3,on="名称",how="left")/ p% e) a; ]8 b* u! d4 E8 @
    df4.head(10)
    7 [0 x+ _7 S' F* D* a+ _, f, x; e

    5 a0 `6 ]/ |! D7 u& o

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

    • 5 ]0 H- A+ N) f. i
      & H8 X) H8 [' v) k$ `, ^! a
      4 b8 n4 c5 j4 y" d( l& g

    / p+ l$ a0 S7 ~: c: D, U8 a# s+ T, w1 f3 ?& {: M6 N3 p
    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-1-10 04:46 , Processed in 3.220019 second(s), 56 queries .

    回顶部