请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3513|回复: 1

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

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

1158

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    发表于 2021-10-28 22:35 |显示全部楼层
    |招呼Ta 关注Ta
    目录2 `/ q, E( d1 q8 k$ m

    8 }8 e+ M. L* o- A5 S( [文章目录
    " t: `, ?/ |2 R. ]' d4 f& q# c/ \5 w
    前言# E  M: Z' M" A3 h+ K  Z/ @+ V
      ?- b, f8 l) j" q
    一、数据爬取: h! _( Z$ i: z( p& _
    0 w$ |4 _9 J$ P; S0 i( S/ \# s
    二、数据预处理
    ! v. U  ]7 b% i$ J* o) `# m9 ?' Z3 j* q1 D
    ​前言
      Q9 M$ t4 n, s# i! o% J9 |本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。' ^" R# C7 X% b4 y$ q. c( a! h

      {$ }& S1 h- V6 s3 K3 v* H
    6 J3 U0 R9 J2 j: c3 M$ M; j, P7 Y一、数据爬取, ]: V+ \3 k8 t, z9 D* m$ b: U* {
    import requests5 b, h2 O( D  }0 ^. m
    import pandas as pd
    $ S" l. Z/ b$ ]' jfrom pprint import pprint
    ! ~/ W0 |0 D; t( Q; S& u导入相关库/ \" R. \4 d  q5 }% Q) o

    1 B* x" r1 Y/ m+ I& Grequests库用于发起网页请求,获取网页中的源代码;
    # c8 V% o4 J3 c: b9 J9 j0 P! V, `: j
    pandas库用于存储和读取获取到的信息;' B  j# K. a) o3 H; T
    5 g+ m- r4 [; f5 O
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;0 |! }9 \1 d* P' Z( ]5 w1 T
    : l3 O/ a/ U3 T. ]. \: N
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    9 f8 k; o! Q9 M7 S3 ^  C8 pdata1 = requests.get(url).json(). `& B5 ^* t' K. M8 ?# f
    # pprint(data1)0 n4 P# |  y' `+ [  s  {

    & i: x& U$ }* L6 v这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    - ^) V! C- M. Z5 I* n- ldf1 = pd.DataFrame()- G8 e7 O9 h* i, F+ C' J
    for info in data1['body']['allMedalData']:
    ; C, u1 _1 G4 _' F9 I    name = info['countryName']
    ! |9 ]6 u% s, _, Q2 r    name_id = info['countryId']' w) V; q6 W4 }2 E7 y* L
        rank = info['rank']
    0 D1 ~+ Y$ W: w, t; D2 v    gold = info['goldMedalNum']0 f) @) _' T+ ~& d
        silver = info['silverMedalNum']
    / s. b) N# L; q    bronze = info['bronzeMedalNum']2 W1 X; e) Z2 K4 P4 b$ g. m
        total = info['totalMedalNum']
    / R- p4 u, B, ^1 _6 e/ e& f3 s    # 组织数据
    . h4 C" O: l1 Z    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    2 d0 H$ x5 B% ^! l' o" l# ?    # 然后追加df0 w: G/ ?5 o1 [, P5 K& _$ U
        df1 = df1.append(orangized_data)/ {8 |+ R& G' }: q' B0 H) k
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']* d4 E3 m5 q  Y+ b2 W
    df1
    1 L& r, l' Z6 O, s' a+ `5 \$ D  S; v
    6 r0 L6 l- P, c) {- B0 P
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。9 T1 D7 K4 n, y" j# J$ ^: b4 s# ~. m
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'8 j, ~0 z; s9 Q( E) ^, S+ D/ B5 R! f# U
    data2 = requests.get(url).json()
    , B: e9 A# @* J& O- V8 T4 a#pprint(data2)0 y; H9 F- b% V/ L

    4 N1 f& {+ G2 h, Rdf2 = pd.DataFrame()
    " L6 I5 j/ `' v& ]5 v$ W1 T9 Kfor info in data2['body']['medalTableDetail']:2 o- P" q/ d8 r# x
        english_name = info['countryName']# M# \+ U% y/ \
        name_id = info['countryId']
    ' @# k6 q# y9 @" n5 t    award_time = info['awardTime']' e3 n/ |' C5 J: a9 `  g
        item_name = info['bigItemName']
    6 _' `4 ~6 i+ k    sports_name = info['sportsName']- f( _- @( O5 L! x- \
        medal_type = info['medalType']
      E$ y% i3 X# l! n. i1 P5 Q    # 组织数据5 |# X1 x# D2 x. j% P2 C) T3 C9 B* {
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    + s5 a6 n) X% Z- |" s    # 然后追加df# a5 K1 P3 g* E: W
        df2 = df2.append(orangized_data)
    - H+ ^3 i& _& b4 Jdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']4 K4 F  _3 p% J/ u
    df2
    , X3 m, H2 D4 {$ ?  l' A, h
    7 c3 ?* ]- h/ J2 Y- z! d% l$ Q对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 + N6 Q0 W  _( A

    ; s' a/ S" r/ `8 l, b% a- N1 F
    3 `0 y2 i& Z: v: q5 e二、数据预处理1 @. k8 Y# r# L5 `. M& m( ]  a
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    " Y' |2 f5 a* @
    , b$ P+ Q1 C, \# f+ r  H1 g) M! G0 bwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    * Q* \3 ?. O/ e7 ^5 q1 x2 I8 `2 K    x = f.read()* w  `& z6 C6 q5 g( a0 s

    5 q1 P: X+ N* l. M* I% T1 I: i4 Ndf3 = pd.DataFrame()8 K0 v4 [% t. y
    for i in x.split("\n"):" a3 I) d' g! H: V  d4 J' g
        x = i.split(":")[0].strip()
    . O! h. P3 B# w! ~0 F8 `    y = i.split(":")[1].strip()
    % l, V" z5 T' |/ o4 _    orangined_data = [[x,y]]* C+ c, E! `* I! I6 @
        df3 = df3.append(orangined_data)
    : D2 I. Z1 t) c) Kdf3.columns = ["名称","英文名称"], _, H  D- R0 h, e. [6 c
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)% Q; b1 w3 H5 x; N, |* m4 P
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。7 |4 p- z. M( \
    $ W4 \% I- M3 z0 D* ]; t
    df4 = pd.merge(df1,df3,on="名称",how="left"). _: P  C# I) T
    df4.head(10)
    ; y' A5 }% y, _  q: S( F/ s/ J
    / \, _4 k0 Z7 q+ t4 g1 f* ?) v# [6 t5 p

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

    • # x7 s; E1 u2 ]3 K" v( {
      - Q8 g' v4 [% v  `

      # s( O$ @0 Y( G; {1 g

    2 m) N% e' }- N% d
    5 d6 E" D8 A9 e) b3 y
    zan
    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, 2024-4-19 05:42 , Processed in 0.300827 second(s), 56 queries .

    回顶部