QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    # y7 b% Z4 u. ]5 i! ~0 B6 x
    1 I$ q2 \6 g+ l7 [) e& X文章目录
    $ X, d0 V4 z' F* p$ \: \. `" ~& c& ?& p* I9 r
    前言' I! X6 A$ K# V/ k

    ) M) `: c. @! S+ M, I* Q一、数据爬取
    , ?4 W- G) [# f' B8 d7 o( w/ Z3 ]
    ( v$ v/ `0 _! Q: P二、数据预处理7 t2 M. Y- H* l5 D( s7 o, A

    3 V5 N8 v0 ~) g, d( p. _5 P​前言
    . E3 C' X. f% i4 Z5 M) ^本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    5 Z  G0 L2 R, L) o" M
    / Y8 ~6 S6 n( w9 a# w
    5 c$ _) }; {  |* h6 ]8 y/ _9 n一、数据爬取: Y# r8 Q1 X7 P/ ^
    import requests
    ; c$ J* `2 N0 ~* T3 g7 i& bimport pandas as pd
    % a4 P. B! l% w& Dfrom pprint import pprint
    : m2 o* e/ e% \& c! a( W导入相关库5 y# x$ q7 \5 C" x7 }( z1 }( ]

    9 w: F) q. R1 F! ?# zrequests库用于发起网页请求,获取网页中的源代码;
    . v9 M2 P( I% `2 w# N0 G
    6 K9 o$ ?3 O+ gpandas库用于存储和读取获取到的信息;
    + ~" m" q! J. g. A$ N. k# K9 I, I) p" D0 u; F/ d) K7 g
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    " ?- q( r" {0 a% h2 F9 r/ n
    ! f; d/ `6 C8 k8 Wurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    . U: s; I" X: v* l  f% Hdata1 = requests.get(url).json()3 `5 V0 J# K% z0 A. T
    # pprint(data1)' O. g( s) E9 g4 e

    ; V7 d$ _0 ?( |0 o这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。+ m! e9 F% E2 z( T) v5 y
    df1 = pd.DataFrame()
    5 h* R) S1 [' a/ w% u4 |1 W. efor info in data1['body']['allMedalData']:
    ; C6 P- D! @" ]& W" v% J" s5 D1 f! t    name = info['countryName']6 l) W" X6 y' y$ Z* Y7 ]% H
        name_id = info['countryId']
    & c1 |1 S  c0 J; ?; y& r/ W    rank = info['rank']9 A: B* r: O8 A) z) V# K9 u3 B
        gold = info['goldMedalNum']
    9 G! \$ S2 e- w# H% {    silver = info['silverMedalNum']
    9 M+ M% X! t) [% @9 _/ l8 Q    bronze = info['bronzeMedalNum']
    $ V' G) t5 t3 O    total = info['totalMedalNum']8 F# z) b& ^1 l! _
        # 组织数据
    8 F7 E1 {- w. b- [6 `5 s" O# u    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    : k+ a, o2 U+ l/ z) ^    # 然后追加df
    1 x6 s9 U/ V. ]8 P5 G# R) j    df1 = df1.append(orangized_data)
    6 n7 L/ B. ?* C9 z7 ~df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    2 t7 J2 a1 @, H1 A* \9 S+ Zdf19 j. j- ^( f% `, [8 e! b
    3 w9 [' Z* P& L) r6 h' b

    - x/ q" M4 A' Z( k7 [3 b. a( s; D这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    9 }1 D, o. r% Z! q+ m- x5 rurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    ) B" ~( u/ C+ ^1 E+ rdata2 = requests.get(url).json()
    : P9 }7 `7 R9 e: u- i, k- Y+ |3 o. _#pprint(data2)1 F/ C; D0 J# l. `% V
    : s* Y' P; }1 u7 a, s% Q
    df2 = pd.DataFrame()
    1 }0 j( N0 j8 ?5 `* F2 O6 ^. I  rfor info in data2['body']['medalTableDetail']:
    . q. O; S, p2 N  l# Y    english_name = info['countryName']
    6 |6 }4 D: n- Y% j/ s& _* `& R& v    name_id = info['countryId']6 t. N3 X4 j+ @: f/ U: `; D
        award_time = info['awardTime']
    / v6 f7 w) Z0 \    item_name = info['bigItemName']
    9 v5 g4 Y7 n" [# ~/ w1 A7 I    sports_name = info['sportsName']
    " ]7 N' y6 l  |' R3 R    medal_type = info['medalType']4 f- o* z4 `9 e6 ^' C9 o' h4 W
        # 组织数据
    ! P4 B, |( h, q; Y% l# O    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]9 o9 X; H1 D. V! J- o5 c: W# r4 \) I
        # 然后追加df
    - g6 c1 a( R& P: i/ x4 ]3 }    df2 = df2.append(orangized_data)
      y; `2 Q; ^- q. V  Y" Odf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']4 m3 p& E6 i. E( O: \
    df2' m$ X" Y) Z6 l+ ]! z

    , c' h8 {0 s  ^7 Z4 j! |对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    ! d+ d% G* d2 j6 X2 H- x* g& m" b: h
    - C; Q7 s+ z1 M" {* x3 N) c7 G( W1 ^; u
    二、数据预处理- ^. Q* v& W. D& q- \; y
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    : O, j6 T( R3 L
    , v/ E- T( @1 Z3 W# O, Twith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ) c1 p% b0 Z! V8 S    x = f.read()% d0 q6 x! s- p, B: A+ Y9 S

    . ^% G& x' ^% {, A% e3 Fdf3 = pd.DataFrame()9 Z% z" R/ u( p) J( N/ ~
    for i in x.split("\n"):
    + ^; M& l: z% \+ t' A    x = i.split(":")[0].strip()0 y, v7 S: j+ t4 g: i2 f7 S
        y = i.split(":")[1].strip()' _: n7 L2 Z. m$ @8 m
        orangined_data = [[x,y]]/ v% C! V+ R! `
        df3 = df3.append(orangined_data)
    ! R1 E0 v5 M7 y( Z  cdf3.columns = ["名称","英文名称"]' W" ?; n" P) W6 U
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    " ^# p" ?# V8 i; d( l  @1 N表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。0 z; y  [% a, x3 O- O
    / O4 }  |& K9 J
    df4 = pd.merge(df1,df3,on="名称",how="left")
    2 F4 x1 i4 l4 v/ Gdf4.head(10)
    - i4 C9 W4 Q& g, W# [: E' W8 {. _6 ^& R& s/ O8 m

    8 x7 K- H. I0 ?) w8 e$ v3 W

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


    • ! o8 ~" H6 [# A8 I
      ' ?$ P; `! C$ {; Q: w

      7 I. j4 L7 ^6 ]' H
    7 D. G$ U: W5 W, s  X: R* |

    ! d, f8 P$ z- b/ P: Y, 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-6-12 06:40 , Processed in 0.461487 second(s), 56 queries .

    回顶部