QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    " s) _7 t( A7 Y9 W) U4 @) t3 ~* c) P
    文章目录) B; P1 a1 H) y/ \. x- v

    0 K( b* I  ]7 Q) S. q' u前言
    7 C  o$ X% b$ G% {7 [( W  k* n: j2 |5 h; P. d0 i3 x3 H/ V9 i/ T
    一、数据爬取% q" z$ e- L1 M( V4 P7 z
    ' v0 T$ Z% _8 k- ?
    二、数据预处理  X4 A' z5 Z, A4 L% u% M

    / o2 l; v" G6 g2 z/ o+ u: y​前言
    5 x% c( j/ p" `- S1 K% ~+ I) E8 d1 C本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    ! p! Y# C+ F! ]6 b3 t  A$ g$ O1 ]1 [* H* |

    9 c& t: O% P) @' a. o% Q一、数据爬取( i* H9 p2 s) o& r
    import requests
    - \+ Z0 {: x& a$ c; Ximport pandas as pd0 ]: {. C4 \0 i, e& p) G
    from pprint import pprint; e/ q. e1 V2 \8 A
    导入相关库. L' n4 n7 A$ t+ w& ~

    ; n' }) ?. o( v. L) t" r# _requests库用于发起网页请求,获取网页中的源代码;
    # `! k. w9 v% T* l8 k% A8 l3 \1 z# {2 B9 U* p
    pandas库用于存储和读取获取到的信息;
    / E8 G) ~7 ]5 D' c3 s) u9 J: q! V1 U9 B; Y  t1 u2 r. L
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    2 V5 o8 J& v4 K
    5 z1 ~4 \* I0 p0 M- g  Gurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    2 S5 J' w6 \: edata1 = requests.get(url).json()# L$ m- I; ^/ H1 A6 \6 @
    # pprint(data1). l2 Q3 h7 B% t+ o3 k4 U& `

    2 [9 b! g" @0 i( w) ]这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    4 c, S: a& i; mdf1 = pd.DataFrame()
    1 K. I- D" V+ g9 ^for info in data1['body']['allMedalData']:' \. H8 d- L. Q* Y0 }4 U
        name = info['countryName']
    * q) z( z" V. R    name_id = info['countryId']2 n; O* N+ s! u' }
        rank = info['rank'], O+ v/ q% H% e
        gold = info['goldMedalNum']* ]. [; q, l' R3 c  ?$ B
        silver = info['silverMedalNum']
    - F- i/ m( Z! ~/ N  j% F0 Q    bronze = info['bronzeMedalNum']
    & h4 E) N# E3 ^) B  j  K, f; {    total = info['totalMedalNum']
      c& y! n4 [9 D/ ]& t+ E; ]    # 组织数据' v8 z' K0 j- t. E
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]5 s/ c( z/ ^' d, V
        # 然后追加df/ \3 X! _3 g/ K4 f* m
        df1 = df1.append(orangized_data)
    $ y- H9 ?: J+ J  S6 sdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    4 \, `$ q& K3 c0 V1 K3 l( Sdf1
    ; X0 i, \. c$ Q& Q
    & H0 Z9 T7 Y3 `% l1 F) E9 M3 r/ w  r* w" s. a1 x
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    , h- o8 ~' G7 Gurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    : a9 m* ^1 a; L" A6 kdata2 = requests.get(url).json()- H  X' B' O& i# ~, H
    #pprint(data2)
    - r, Q  K# I$ Q/ |. s0 h2 h; N( `! T: Q/ |1 ^  `
    df2 = pd.DataFrame()
    0 ?* O3 o9 n. u6 ?8 ]1 afor info in data2['body']['medalTableDetail']:" M  f( v" {6 B3 g* o
        english_name = info['countryName'], D* K" g( j% f0 z- N  _
        name_id = info['countryId']
    & A+ y5 M1 _* z( X    award_time = info['awardTime']! I( D  t/ V6 D& x5 \
        item_name = info['bigItemName']
    ; x( _) `* e4 G7 S* s6 S    sports_name = info['sportsName']
    # f, f+ |; {' n9 ]  ?. F    medal_type = info['medalType']+ M0 f# `5 s4 d# l  @# F
        # 组织数据
    8 L5 S9 o% P; ~- C  |; Q    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]- j5 l2 X. u# W1 x5 W5 K' x
        # 然后追加df
    * H8 p+ h1 L" s5 u, {( T    df2 = df2.append(orangized_data). n0 \# k) K: v- ^8 N0 F7 Z
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    7 O* X$ k7 K2 L0 K# T! J7 m2 ^% ~df2
    4 b7 q. z( ^5 f; d. h
      Z& h1 P4 W/ i4 `对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    ! m: e5 I6 L9 E; M6 A  c
    + S' G7 f; t% u1 c
    : F. z8 X/ @5 f$ v$ E1 D, i二、数据预处理! n$ C2 C% u1 I" `& e$ L
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    9 D, ^3 m6 r4 {% [4 I, I- \# }  u' F( ^" O$ [6 [2 Y  @0 X( P0 _
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:5 s& R+ U! k* D9 J5 o
        x = f.read()
    : e% x  u8 f5 A4 g- E  E
    ) H8 K; I' R& E6 }$ ]1 ]+ U" Ydf3 = pd.DataFrame()2 W/ |6 t% _. R: k  {! n
    for i in x.split("\n"):0 d* U1 j4 E1 C$ h2 e7 Z$ q
        x = i.split(":")[0].strip()
    * w/ I% i( J/ Z# I/ |: P    y = i.split(":")[1].strip()( C0 l+ U" F' \( I3 ~! G) ~
        orangined_data = [[x,y]]" _" K/ X. v9 B0 r. e" k3 J) K: T. _
        df3 = df3.append(orangined_data)8 O3 b, h( I6 I+ U  s  E: R% W
    df3.columns = ["名称","英文名称"]
    - j2 ?/ L6 B4 T$ kdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    $ `% Y/ \0 n8 d" w3 \8 {8 i( A表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    # K- m4 |7 e$ U9 h; a' ?
    # B% A* A4 {' ddf4 = pd.merge(df1,df3,on="名称",how="left")& O/ B4 R; q' a3 ~
    df4.head(10)
    + l+ [4 Y6 K# V0 ^: Q; h: [) N  }. R) _2 o4 I4 D6 w( N

    , U( r( ~& A8 p1 F% I, f

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

    • & B* E" g% X8 l4 D
      # ~; [! @' m' u# u! t: r+ ^

      2 s4 n- m, ?. g3 i! Z
    3 r9 ~& D" ]3 j& t
    & P+ K1 ?1 R3 Y& x
    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-4-18 06:29 , Processed in 0.404181 second(s), 56 queries .

    回顶部