QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    - N* |4 p# p& v3 d
    8 M8 L4 G7 p, f' h; Y- S文章目录! J+ ~; i$ X  y, r: W9 F3 l6 O
    ' j) c  W/ r( H7 g9 ^* a
    前言
    ( [6 D. t9 B4 j6 A* t" M  n0 e# u, H7 \& @4 X8 Q1 o
    一、数据爬取7 v& @' }: i+ D, P8 X
    ) ]) H. k  B0 o
    二、数据预处理
    $ [" {: s( F" u
    + h3 y% s% C, P. [6 m​前言
    # A$ k- e$ w$ l6 m8 j9 c本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。2 q& }3 w: m8 w; M  _+ ]' U5 y
    5 `; _, V: P, [+ T, s- N

    # \' k0 P7 f( E; U1 ?0 a! x1 P一、数据爬取% X% t& ]: E. Q, A
    import requests* ~3 f+ N) d, U0 X6 j+ X3 ?( h; M
    import pandas as pd- i6 _0 f" a6 c* l8 U/ B5 |
    from pprint import pprint
    # H1 m9 {/ `) M3 K& D; W导入相关库: Z; V2 j' a, s# g& X

    / X/ m6 T  x# m6 H! B9 trequests库用于发起网页请求,获取网页中的源代码;& D9 E) \$ T) L% d4 ]3 x0 U

    , I9 M$ Q* B4 {pandas库用于存储和读取获取到的信息;' c, J2 j; `  j9 X  T

    & i* b4 F4 r' Y7 Apprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    ! q# f9 F% U' ~5 h! d; y% c6 m6 y! \4 p+ S8 }
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    ' s) G) S! P9 Odata1 = requests.get(url).json()' y7 Y/ |7 Q1 U, r
    # pprint(data1)
    . j! I9 s- h. s, l8 h6 }: o# ~7 Y: N7 Y% b
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    + w% x: E$ k- h. ^df1 = pd.DataFrame()$ O! Z4 T. \+ t/ z
    for info in data1['body']['allMedalData']:4 M- r+ X9 X# I' e( k
        name = info['countryName']
    8 b& D5 ^) @; q$ J    name_id = info['countryId']: a# b. h/ Z7 \7 \- I
        rank = info['rank']
    0 ~1 a" v" a' J7 z3 w) i  t* I    gold = info['goldMedalNum']
    6 ?$ L- v" _' Q: S    silver = info['silverMedalNum']
    , K9 B7 x* p$ }    bronze = info['bronzeMedalNum']9 g  Y& ^  f( ]7 q
        total = info['totalMedalNum']7 g& T; v, X: T
        # 组织数据/ R0 o" u: k5 B+ j% m+ ]7 O# h
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    % M+ m9 l4 U7 `% {+ d: i9 g, J! ]    # 然后追加df
    0 J. ^( }1 r/ F. N/ j" s6 m  G0 n    df1 = df1.append(orangized_data)2 a! ^# U$ n( \4 _" G# ?8 u0 a
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    ; M/ l3 x( W; Idf1
    4 N8 c/ P* @5 ~0 s1 ]( y+ U0 U+ p
    & k" o6 I* f( g) e+ \$ L1 K! g
    ) g' Y3 q. m' t' Z. G; d这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    $ F& I$ a8 J: R2 Y, A: A( N9 Zurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    % h6 o+ n0 V5 h6 Mdata2 = requests.get(url).json()/ C8 R5 B8 Y3 `& Q; X
    #pprint(data2)% _' n9 Q- p- A, ~7 m5 _
    6 D# {& }$ L% i* `9 h$ t" A
    df2 = pd.DataFrame()
    : r+ O- N& e. }) _( tfor info in data2['body']['medalTableDetail']:. J* v0 a) o9 a0 ]5 n$ g) _9 c
        english_name = info['countryName']
    4 D( p7 R& Z! ~% `8 N    name_id = info['countryId']
    4 [# f0 p# e1 C8 }- [2 ]0 G1 ]    award_time = info['awardTime']
    ' u" v1 O7 `0 D+ N' [    item_name = info['bigItemName']
    5 E: Z* q2 ^- W! T) G    sports_name = info['sportsName']
    . v1 f" i; \* [/ a    medal_type = info['medalType']" H4 b9 S, m6 E/ `* y) T  v9 O
        # 组织数据
    , G9 v# Z% d( O+ @8 h; a    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
      \. z3 ~! z% h, e7 k1 i) U6 l    # 然后追加df. L' j- c! x& ^/ a5 Q  i
        df2 = df2.append(orangized_data)0 L; P- m8 h0 W, k# b! Q" G8 O' B* {
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']3 c& P! p! E  A! g% y% R
    df2* ^7 T8 ^& x& \; o4 N

    . O/ a0 @' ?) Q5 A/ s$ t. m- C& K对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 4 u6 O# \6 A: X) H6 `7 J
    2 `4 [! I8 \0 V! T/ I7 h7 }( H

    / X  I6 Q  M* ~2 f* [二、数据预处理
      r% Z/ Z7 V; R由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    9 {3 x; @6 a+ M" Z! p% X7 M3 E) I) P% K: T
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:8 N+ n% L' F6 d6 @
        x = f.read()4 D2 r  b( Q" {* Q: l
    * Z# ?- f  }( Q1 D6 Z4 L7 u: Y
    df3 = pd.DataFrame()
    ; |" U6 Q  x! Q  L1 k# o# q2 R  Efor i in x.split("\n"):2 v' y( c) P4 {+ {5 g
        x = i.split(":")[0].strip()7 w3 @4 B+ x/ G9 a0 t
        y = i.split(":")[1].strip()* R5 N$ r4 D, ?* b" ^' }* b5 `
        orangined_data = [[x,y]]1 x. `& N& s! z, H3 d
        df3 = df3.append(orangined_data)
      I; r& n, _; Qdf3.columns = ["名称","英文名称"]; j/ D) B) M8 i/ W* o& M
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None); o/ z2 [$ o  Y, p
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。- G. j' X% R# L* _/ ^

    ! m& p0 T( o2 Y; Sdf4 = pd.merge(df1,df3,on="名称",how="left"), J! O& H& B7 f! I
    df4.head(10)* h# N7 T- g6 y8 e
    : _& f6 q2 R9 Y6 J
    . u3 I- K1 `% k$ ~: f3 ^

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

    • ! m4 U5 I8 [- a+ B( Z7 @; B

      2 R! s( n" {7 m2 N$ A: X; O, }- W0 S3 u$ g
    * v6 x9 P: h) q3 H) R: t/ a* y6 Q
    ; h' U4 Q  w: J$ ?. V2 R
    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-14 23:59 , Processed in 0.436465 second(s), 55 queries .

    回顶部