QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    ' O. B6 \3 K+ s: ^& m% `* J* [) \* D0 r! s
    文章目录
    9 [# U3 U0 P5 S3 n+ `6 S6 e! I* `1 q# N  L# a) Y
    前言$ R0 n4 C7 R- z( L

    - E( f# k+ a  y一、数据爬取
    " y% L5 H0 p: c& ~% @+ f2 E' I9 T& ^: T& H: j# L
    二、数据预处理- h# p& e& `# `$ _& I
    ' v2 {6 L; |# S
    ​前言  A: k0 F0 f- Y5 M  w1 O$ X. A
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    , A  g0 C6 J5 l  ^+ C- q  t4 [7 u

    ! [7 {7 y3 r/ k0 \' g一、数据爬取. ^+ l1 \  G( p5 S4 m
    import requests: M$ s9 G3 z8 V5 p1 e
    import pandas as pd6 y8 {1 Y$ ~+ h$ L. T" r
    from pprint import pprint
    # p6 \6 y- f5 A/ e5 `导入相关库* C. J- F4 E" R8 i0 c6 v; v  b
    9 t! N3 C1 m7 J; g9 _/ n2 F' I( a
    requests库用于发起网页请求,获取网页中的源代码;
    , `# S- v/ ]$ m7 B. {: b( G6 k7 _( a) R% x$ W9 ]5 `
    pandas库用于存储和读取获取到的信息;
    % b  _. G7 f5 N) l6 e" n
    ) G+ Q* o2 [* U, D7 Jpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;$ a! ^, Z9 K; j4 T8 }: i9 e, }% _3 T# C
    ) F- [& }+ U0 e3 U, @' \4 T" a
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! {! ^* L4 A- ^4 h" j. e
    data1 = requests.get(url).json()
    2 i/ D4 {6 F4 L& F$ E# pprint(data1)
    " P+ I- {% C  Z! d  V5 C- r( t! O% t1 _% ?5 F* T* a' e
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。, J9 L$ r6 c+ T# H7 J4 J  O
    df1 = pd.DataFrame()  ~2 O* F$ ~( _$ `
    for info in data1['body']['allMedalData']:; ^/ j4 {' X3 u' E, i
        name = info['countryName']
    $ `, g; J! q  ]' b. v# ~  S    name_id = info['countryId']
    1 Y9 Q7 F4 ~1 A2 O    rank = info['rank']* V& {9 q# i4 }9 k4 f1 O( l2 K7 A
        gold = info['goldMedalNum']1 m* z* L+ o7 x1 v( l  T9 d
        silver = info['silverMedalNum']$ t& f! P/ b5 l  e' w6 M7 s
        bronze = info['bronzeMedalNum']* Q1 [. b9 H  ~1 e7 q$ l6 e
        total = info['totalMedalNum']0 L# @+ L1 a) Y8 i+ u
        # 组织数据
    4 i  Q" v# J) h4 ^' W1 I+ V    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    $ l( c8 _, j- [4 q9 G    # 然后追加df
    ( D. T8 P7 s. b4 O8 L5 F0 A    df1 = df1.append(orangized_data)
    4 P1 I0 x) P$ [5 t* `. |4 ^df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']& o" l9 W" P$ T1 }  f4 O3 H
    df1
    ( r6 o. X: A' p. J; K4 O. G% k' }6 e5 G; W

    ) @- h* j; P  F! ^这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。1 `" K  ?, ]$ ]9 V
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'  y) g! p/ y3 U8 u4 x2 s( r8 D' x
    data2 = requests.get(url).json()! k  h7 [0 W' E
    #pprint(data2)) f) `0 M8 m7 E$ j

    + u9 P. v2 r# @: R( ldf2 = pd.DataFrame()* N$ k8 S8 g7 C9 C6 _
    for info in data2['body']['medalTableDetail']:
    " [2 K5 y( f" |7 j, V& \    english_name = info['countryName']! Z% i5 v4 a6 `6 A! v- f$ `& _' v
        name_id = info['countryId']
    - v, n/ I( C9 @$ Q6 m$ m7 x+ _( S    award_time = info['awardTime']+ m/ r% _/ D( Z6 |5 S5 h: D
        item_name = info['bigItemName']+ j0 M6 F  b& q
        sports_name = info['sportsName']
    3 R# w- {4 ]5 T4 t    medal_type = info['medalType']
    1 \5 m1 y- x+ {. W0 M/ f8 e    # 组织数据
    ) l' A9 s0 G5 d5 n2 [/ z3 M    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]; \6 i9 M% \! C5 u( x3 Y9 C
        # 然后追加df3 g2 j& T& g3 h- u  }7 Z7 M6 r$ g
        df2 = df2.append(orangized_data)# ~  t% g0 k/ `
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    / t& R! e/ V/ i3 n5 xdf2
    ; g* ~& Y' R( L/ I" }3 `
    6 v( o" y5 J% V; [5 `8 ?对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 # E+ s6 Z, T; G9 Y. t8 j7 l  o

    ) X/ S  _$ O6 s) ]) {# T/ O6 @, q% `
    二、数据预处理) @# y9 t) ~1 u$ l* Z; W
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。9 k8 |6 `) h" ?$ N+ M

    ) C% U8 D) Y. F& Z9 S: U7 ~with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    " F) b' {7 s0 w% B, z6 `3 b4 L, N    x = f.read()
    ( o/ y4 P: F) y* l5 _0 ^# O9 |% D! ]& ^0 s) z7 q
    df3 = pd.DataFrame(): K0 j4 k( k8 V
    for i in x.split("\n"):
    ' I) X# X, R; x& m2 D    x = i.split(":")[0].strip()
    0 l6 E0 I$ t; v+ ]    y = i.split(":")[1].strip()
    6 ^, ~1 ]( T: R7 o5 m    orangined_data = [[x,y]]
    + a4 W) a7 ?. Q' j    df3 = df3.append(orangined_data)5 O8 p3 @8 P' T5 x% b
    df3.columns = ["名称","英文名称"]9 r9 D# k0 w4 v! ^$ r
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)$ q* j9 b- E0 k/ D1 t* E% ?
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    : I, F7 Y: W+ r# M) a! h
    & Z, c9 w' u( d3 u: I# r0 Zdf4 = pd.merge(df1,df3,on="名称",how="left")
    3 r/ i1 s9 ]. K" Y" x, I0 \  Y# kdf4.head(10)& f5 ~0 c# {  T$ A

    7 V( T: k& M. r5 I) j3 @; J. D1 w5 K5 X7 N$ s; W$ y

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

    • 0 m! d$ W( J1 }* Q/ g* L+ Z; t& l" S
      8 K- y: `6 `4 O
      " K' c/ @: T7 w2 |
    - G* P7 c, W; ~4 I/ E- x
    9 o2 d; k% i+ I# W1 Q
    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-7-18 06:12 , Processed in 0.411387 second(s), 56 queries .

    回顶部