QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    - U5 g' U" j. d* W
    4 {' w' Y' @$ q. R8 A' c: h% u文章目录. e' C! E) u8 \1 q) f6 V
    0 t+ a9 v0 a) H6 L
    前言
    5 X/ `9 v# c; E' o% _- Z( F2 x, N" l  |* J- I3 s8 L: p  r
    一、数据爬取
    # F4 {) t, Q7 G* g
    : e' q. V* a( U二、数据预处理
    0 M9 l, u. b) y
    , D9 J0 S3 V6 X: g7 V​前言
    8 X8 l4 s% W; M2 f  `本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。, E* z/ x0 B' u! j, j  R

    - ~: }; y9 `% m$ Z  S- H2 Z" ]3 I- L) v$ ^8 K# W) c
    一、数据爬取
    + e; }0 y) X0 J! \import requests
    ! x( C( @# K3 d- \: O/ V, @$ limport pandas as pd8 c1 C# z/ j: Y# a4 k& g' a$ y
    from pprint import pprint3 Y7 m/ N; ]7 d+ Y9 f
    导入相关库3 ~; W2 b; B; V- p" S* ~6 N
    % P" U+ }9 u) d, W. r/ y
    requests库用于发起网页请求,获取网页中的源代码;
      b. m4 }& J- G; p- C$ ^* P, }# s8 w. N) ?6 p# l
    pandas库用于存储和读取获取到的信息;0 D/ o2 q) c' U# I
    2 ~1 C3 x! `2 [* Q4 y* _
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    2 ^4 p# j! |) K% w. ]( z; \; ]  a2 M/ Q! ]; M
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    2 O& Y) j% r8 zdata1 = requests.get(url).json()
    " `& o$ f( T% l% F8 ?* I! b# pprint(data1)
    8 m- R7 ^! U4 }! H/ A0 g& n8 a$ x
    0 P9 }& ~: q+ I$ s这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。+ _9 Z6 ^5 [+ Z, I1 [
    df1 = pd.DataFrame()" i4 ]+ L7 \8 f( i# ?% \
    for info in data1['body']['allMedalData']:; g2 N1 S2 `7 X/ ?2 j; F) B  e
        name = info['countryName']
    : q$ S- z/ M3 h+ E& L    name_id = info['countryId']4 |0 r1 X0 V+ e3 E' ]  k! O. e
        rank = info['rank']
    ) a( r1 T& ]* W6 v3 r, t8 ~1 t5 |    gold = info['goldMedalNum']
    # `" @* O5 {, H. ^    silver = info['silverMedalNum']
    . w6 H) K8 W: Z4 `9 c    bronze = info['bronzeMedalNum']
    8 @* Y% r3 o' E7 B1 I- l' F$ ?    total = info['totalMedalNum']" L# G2 u* n3 r* F0 s  [3 a
        # 组织数据
    2 c/ _" b/ M+ K2 R    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]: x9 `% a$ n' D' T' d0 L0 @" b
        # 然后追加df; a% y" ]- m, x, J( G
        df1 = df1.append(orangized_data)
    $ n" o# w# I: C8 x" Kdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    : y! Z0 ~- t5 \/ B0 ydf1
    ; ^1 z; X0 ?5 U5 c$ V
    " h' _+ u# {' x0 t7 @7 ^
    7 N' H7 x& ^1 [* z# b4 n这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    0 I9 t. R) |  c0 D) Eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'" a6 t' o2 K7 V
    data2 = requests.get(url).json()# L( N1 `/ Z9 h2 g
    #pprint(data2)
    - j% B8 G. i/ i, J  |9 w, S' R
    # h% a$ d  h+ y, {$ }& \df2 = pd.DataFrame()+ w% S" o6 |' A- J. Z: W% ^" z
    for info in data2['body']['medalTableDetail']:
    / {$ q9 ]; w# K3 i/ t    english_name = info['countryName']
    * }2 n: W$ \* m9 k: F$ J    name_id = info['countryId']
    0 Z+ y% a2 m% d8 q5 g+ T. q    award_time = info['awardTime']4 M: t) s* y% \4 c6 {
        item_name = info['bigItemName']. I1 l8 l$ T. N' k
        sports_name = info['sportsName']
    8 }9 _; n) ~+ x* X" Q( V    medal_type = info['medalType']$ M1 N9 f# n5 L
        # 组织数据
    $ u% |8 r% o4 ~! P    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]0 {, D( n3 ^6 p  Y( k* B) n8 F. a7 Z% k' c
        # 然后追加df
    ; M) O5 l$ ~9 e) |: O9 ]1 W    df2 = df2.append(orangized_data)
    6 n2 H$ p: T1 s4 q: vdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    6 j4 a* |  N8 T4 g; kdf2
    + E# t" o, A  c# C
    8 D9 a8 k9 u9 }/ u7 H8 B对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 - O; G" ~  |3 A! z& a: v
    ' [; R5 A- ^8 {( H) l4 R

    ' T1 a6 D8 ^& c9 {+ d6 ~% @. ?) h二、数据预处理
    3 \: Z: t9 T. Y' [" U7 e/ e* b  G由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。3 I$ Q6 N+ `; C' w

    - l7 n' R# ~# V' R5 B; _; k) qwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    6 r6 ~* g" w( T. I+ }. g" u    x = f.read()
    , h; S" M) w, {" r, K$ O, {4 l( ^8 b
    df3 = pd.DataFrame()" a0 r, p. Y( g: e9 f$ e6 u
    for i in x.split("\n"):
    6 K* [; T9 u: D    x = i.split(":")[0].strip()3 }& l  a+ X) N; Q3 P% k
        y = i.split(":")[1].strip()- h' j3 L  ]6 P9 z8 S! I" x
        orangined_data = [[x,y]]" M; F+ W. f# O$ k  C$ Q6 C9 W
        df3 = df3.append(orangined_data)
    : [! W( {0 @& k% s6 fdf3.columns = ["名称","英文名称"]
    " _$ N* M1 T# kdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    - I% P( e' _9 U" }* O' g表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    9 V! w0 n' B, s
    ; r) W! O  g  hdf4 = pd.merge(df1,df3,on="名称",how="left")" `2 ^% [6 U4 t& a' w  z7 V
    df4.head(10)
    0 O) n, @: t7 p
    / d& Q5 b3 d$ b. O; T" L- D  e+ c# x5 l1 H5 y7 A6 \% a

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

    • # X/ x* f3 [: K! m! K

      ( E9 S$ a! c4 j9 u$ f4 U
        F& {* b; t9 }$ D$ {, m
    ' ^, n2 y. y9 i$ c1 \

    4 t6 Z1 }" ?0 N0 i/ I1 j/ H* H
    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, 2025-11-4 20:12 , Processed in 0.382854 second(s), 55 queries .

    回顶部