QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    7 f7 h$ M0 n% W$ k) z6 ~) V+ v: O7 t6 R, w" q( [2 x
    文章目录
    2 [  }3 a) K; K8 m; |- N
    ; r' }' G1 z3 a7 [: C) Q8 P1 z' ?: [前言
    3 r9 C5 R/ r; f$ _9 }; v" ?# w, I  V4 o* U2 N2 d* c0 W. b
    一、数据爬取; o. n. x6 Q) }% r( l' C

    % f$ F( d' a( S1 O- L- B* E  z二、数据预处理# R. N  t: V8 u- l+ _/ t% N5 q
    ( p! g# d7 H5 o: [. K! \# O9 O0 }8 t
    ​前言
    ; m/ K1 _- U, O* r) K" {8 S& _  Q本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    . N5 ]9 ~- x! N/ f+ s0 r4 E: Q" `+ \" u+ k0 G2 u$ T7 g  K
    # f% h' `! H% ?6 ~' v" N
    一、数据爬取. K2 q+ l7 u8 J: p
    import requests9 c0 g& C/ \- J" R, }
    import pandas as pd
    + m* `4 p' w/ Z  w) bfrom pprint import pprint
    9 g7 _( T+ R' n8 B. Y* P4 r( v- I导入相关库6 ^4 v/ \4 C+ W7 j# J
    3 B0 ]! B2 S% {6 t4 u
    requests库用于发起网页请求,获取网页中的源代码;
    . h7 z1 ^6 E% t: t
    / W( i+ f+ [$ w% Spandas库用于存储和读取获取到的信息;1 x7 D4 I: w4 {; H1 n5 p* _/ g6 ^

    ; @& J9 p2 R% F5 _2 n$ r! n$ ~pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;. f8 U; U" }# f9 V9 h

    * n& G+ o/ K' Q, ourl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    ! X- y) |1 ?. A: j& c& `& Tdata1 = requests.get(url).json()
    ! n# W: T1 }' [* s, G' r( D# pprint(data1)
    * c, u1 k% S( K. w3 j% l4 ~) v& w' M& }6 K  @% F4 i3 Y- `" y
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。6 h, i! o5 g. ^+ F3 O0 O
    df1 = pd.DataFrame()8 e/ Q& d0 @: A# v4 L1 k1 l
    for info in data1['body']['allMedalData']:
    . _1 H  y& _6 Q    name = info['countryName']8 O; ~; g4 [6 D0 {3 `( A
        name_id = info['countryId']
    & a/ N8 @- O$ p& I  Y/ C) m    rank = info['rank']
      Z6 `% S6 o* d( k* ^) v! E    gold = info['goldMedalNum']
    4 \4 d6 x( [* \6 w3 z/ }( U    silver = info['silverMedalNum']1 {9 w2 m8 K* [. g' P, W+ f0 \- S
        bronze = info['bronzeMedalNum']
      a( }5 p. F" P" l5 ?. X- Q7 a    total = info['totalMedalNum']* \8 Y9 J# j, Q. s' i# @, O0 P
        # 组织数据
    # C+ s* c, W1 B    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    9 w' B% x0 e* O7 a" f3 s8 {    # 然后追加df
    4 R" v4 H2 T$ R8 P) Z* S7 b, _    df1 = df1.append(orangized_data)2 e  y  _4 \: L  V
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    ; ]4 ?7 `5 Q* u& U$ }  l9 p, r9 @( P# _df1" D* Y6 a; Y( X6 ]
    0 ^! N! ~' A$ J7 `

    $ @2 @0 C4 x' [) q这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    1 B1 p  C& o0 u; Aurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'$ q$ ]! `8 l% {' k
    data2 = requests.get(url).json()
    : r8 T" W' R. D% _4 D: @#pprint(data2)
      Q0 T9 f/ w" `4 N/ ]4 e# Q+ o- |8 K/ h4 F, @7 n, \1 B
    df2 = pd.DataFrame(), i' V7 j- w6 s( Z
    for info in data2['body']['medalTableDetail']:
    8 d- d' l; \/ \6 ^    english_name = info['countryName']
    ) J% Q+ i& n9 ^, T$ F: w8 I    name_id = info['countryId']
    ) o, v: O7 n3 ~% {4 n    award_time = info['awardTime']
    4 W2 j4 H# N* c1 I, V/ ]* C    item_name = info['bigItemName']" T( N' a: V$ E+ r# k
        sports_name = info['sportsName']
    ; g9 V0 Q- L  R. J. \( \; ^$ S    medal_type = info['medalType']  E) E8 P$ l% }1 l6 v% J- x
        # 组织数据
    3 \9 [# }4 @% j( B" c3 v# _  |    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    6 A; D, _: g9 q( @3 A    # 然后追加df
    ; u! L. g5 e; z    df2 = df2.append(orangized_data)
    6 ], m$ N' C4 ?5 cdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% W4 p  m- L' U" D! p+ f+ V
    df2
      O: U# Q7 T9 W) T) j5 s6 S0 _0 ~9 b; D( b
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    / R' y3 F3 y  i) O2 ?+ E( z1 g5 w" y9 E1 L# X( @

    7 w! |. Y) }  \( @/ s3 l% u* t2 g二、数据预处理
    - R) s/ S. _* |6 m. C2 d7 @由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。+ Y* v7 R  \4 C8 |( j1 P* w

    $ E% c8 b' b- s% N% s4 G* l6 m, @  g" Gwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:' U! ^! n: W, s" v8 A; m5 @4 b  R8 z
        x = f.read()- P1 j: _6 R7 V" I- I

    ; E/ I6 A1 A; D' ?/ D. Kdf3 = pd.DataFrame()
    7 o* \  x+ f, H; {0 Efor i in x.split("\n"):( e: q9 k! M! \  Z4 E
        x = i.split(":")[0].strip()
    ; r  V9 D+ K6 Y$ i2 G; P    y = i.split(":")[1].strip()
    0 _4 p; q7 z+ `    orangined_data = [[x,y]]
    8 F, P! F: H, \; C    df3 = df3.append(orangined_data); p' W9 E, K; V' E
    df3.columns = ["名称","英文名称"]
    " w5 z# m" Z9 w- \  z* Ddf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    ( h) h0 T& a2 K- j$ u$ ]表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    : b; d: f- i( [! v0 z( n% L& K7 m! F
    df4 = pd.merge(df1,df3,on="名称",how="left")
    3 o  i- T" I# i9 x4 ddf4.head(10)" R; r/ v/ u/ n6 V& |% S4 s8 _

    3 o/ Q( K6 P2 I% W$ g1 `9 ?% A1 K, }  @6 g

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

    • ( F) h/ c1 ~0 @

      4 m. h4 x5 J5 S& |2 d- _6 R& r% k, }! N0 ^% H

    8 s4 V$ H$ ~. W8 G7 j+ |$ }) V8 R$ _$ M6 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-6-26 09:10 , Processed in 0.448445 second(s), 55 queries .

    回顶部