QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

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

    7 q. H9 T) M: g) S文章目录
    ! f9 E1 ]6 a0 c  i
    ( V* `7 z( L! G* _' N5 o- N前言
    7 ?% \8 S' k- y! b( \8 V- z+ b
    9 `4 D; |$ F  Z4 s6 G: x+ I1 j' J一、数据爬取3 J- T$ h: G) ], `; ~  G6 o

    % O( c9 N# d5 }3 ^7 R5 Z7 w  v" ^二、数据预处理- C4 c5 S2 @6 o5 b0 x& t
    $ o  c4 Y1 p; v+ g0 z
    ​前言
    / H2 h3 @: Y- }. o# z' X2 C9 g本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    / `$ Z- c& }4 K  ?
    8 C/ O  j3 J1 F# S* X0 a
    7 N' |) L, K. m) `一、数据爬取3 c4 i) I, E5 Z7 l; R# D5 `
    import requests
    # s3 v9 f4 ], Z5 L! }import pandas as pd
    6 y+ j7 L+ R: G. ufrom pprint import pprint& V/ N# ^( m% p. F9 a2 c! [! _* c
    导入相关库- g4 p; i' i2 K0 {
    & Q) u+ h5 ?. @* J: s# M
    requests库用于发起网页请求,获取网页中的源代码;8 I9 i/ ?3 u, u) ]7 Y/ _

    ; U1 F. @. n  c. [5 U6 m  X! d3 n* bpandas库用于存储和读取获取到的信息;
    $ h' C1 a+ L0 \/ C1 h( J6 Z% ?, _
    1 t3 F& v2 |' g4 @& S8 Vpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;0 x3 I. w  h. T* C9 t, i

    & m; f  E9 {. |& q5 D) R4 `1 i9 Durl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    " y, E  v5 `, \0 \data1 = requests.get(url).json()
    - J3 l6 t! M3 i+ |0 A, e  D6 l' Q# pprint(data1)8 z: P* E* X, s- i" G
    " Q7 S2 n1 }) m7 d: ]
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    % g3 y$ \' N. j) I  X5 X9 ~7 hdf1 = pd.DataFrame()
    / N- }0 k4 m  f$ F9 x3 kfor info in data1['body']['allMedalData']:2 m' T( `1 h) Q
        name = info['countryName']% _7 q/ w" r4 l: j
        name_id = info['countryId']
    $ _& D) e' [( v1 \1 ~    rank = info['rank']
    / @- ~2 g  X' p- h. o/ E    gold = info['goldMedalNum']
    , V; h9 i0 F8 s2 i    silver = info['silverMedalNum']
    ) S( K+ r" n0 T# b    bronze = info['bronzeMedalNum']
    & w/ m% z- \% _% \  v# P    total = info['totalMedalNum']# d( Z: j' N4 Z0 X( @+ b- x0 O1 W9 ~' ]% y
        # 组织数据
    : F9 Z" A* H' F+ A+ |4 n2 C    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]; Z% ~  V( E' L# @% ~6 r
        # 然后追加df
    ; u2 V& L- O& z    df1 = df1.append(orangized_data)
    / G8 s' S2 Q4 I3 W, D8 h2 r, |4 wdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']! |0 z$ Z2 V/ g$ J8 R
    df1& Q4 b- `" o  K" T1 R
    6 Y% L/ t: \& {8 L  m

    ( s6 [) Q3 A( O! F6 p这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。8 a# c7 r2 V- k$ A/ H% N
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    . I! ~- `9 x, [; J$ f9 ?" Odata2 = requests.get(url).json()+ V5 z' o* d4 ~6 O3 ]
    #pprint(data2)
    " L$ M% i$ |. F: F& c6 Z: f. K. C8 |
    df2 = pd.DataFrame()& a6 L$ v) I* S; L1 r% X  ?/ L
    for info in data2['body']['medalTableDetail']:( K' s' U; v; u
        english_name = info['countryName']; t' I+ ?& L/ |' r8 W+ v+ j
        name_id = info['countryId']: G7 E* Y- z6 R8 f0 i. l+ C
        award_time = info['awardTime']
    , u1 s; ^+ f  @6 ^5 }& {    item_name = info['bigItemName']
      j. p' `# T8 l* l# e# k    sports_name = info['sportsName']% {( P! K# D8 C6 E' A0 n0 d
        medal_type = info['medalType']
    7 a# ]; p4 Z3 k    # 组织数据" v: ^* K' l- o
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]0 V1 J; E# F4 e
        # 然后追加df3 M3 O, k  B5 `; ?- I9 e9 I
        df2 = df2.append(orangized_data)7 _! y0 A: |' t1 p: {: W1 c
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']+ b3 Q) d  U4 Q9 ]$ h( L- k
    df2( o% L+ `- e7 _

    9 a/ H) O3 d2 z! @/ @对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 * {. `# {% k% c' c" v

    ; u% \+ h% l& B: L' V# q! K# i" W9 o+ m, ~
    二、数据预处理" i$ h5 A9 j# T6 r$ q0 K
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    % O. |( {- r+ u" N5 K# d$ l! }
    - V( U0 R$ {9 D8 `& _: [with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:+ m% n5 @0 ^. o
        x = f.read()
    3 L6 W  _: ^: x0 Y( R
    8 {6 _7 ?+ z! |df3 = pd.DataFrame()
    , u" k* r3 l8 a" gfor i in x.split("\n"):
    & Y: }. R4 o5 j, O& D* \. n$ j" f    x = i.split(":")[0].strip()
    8 r. ~( `+ f: `% ^/ s    y = i.split(":")[1].strip()
    , p& z/ r0 \4 z" T0 _, G) v    orangined_data = [[x,y]]- s$ l- ?2 O+ m& \+ F! f1 s
        df3 = df3.append(orangined_data)$ [* j6 A2 h! e4 j* w: h) u
    df3.columns = ["名称","英文名称"]/ _+ W/ n8 a# I7 s
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)' S. V: q% x" I/ w1 _" r
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。# W$ L$ L$ ~  [6 C0 ]) O5 ?

    * _& m% l# O# a" H- Ddf4 = pd.merge(df1,df3,on="名称",how="left")/ I: `1 }6 z1 y
    df4.head(10)% z: {* k8 M' f/ v/ p- W

    & y; O' f. e' [9 o% L/ i) B# i6 Z) @% ^# h+ D: e( ?9 n

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


    • # M9 u6 e2 d$ k$ q5 o$ v, l

      2 u: h& c9 m! f* ]* I5 ~
      & h7 Y1 g0 F' d* A5 o; t8 d, u
    2 H* _1 J( U0 M

    9 O! y7 u( d" E8 @$ c) ]+ V
    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-5-29 05:34 , Processed in 0.437722 second(s), 56 queries .

    回顶部