QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    ! P% H0 E" H) _$ M$ n1 A2 n; @: g: t0 g+ U0 [2 z
    文章目录
    , Z# ]  e9 w6 T9 x* v* q! i$ ^8 }
    / s4 q9 x3 k) Y* s% ?前言
    0 R' n1 ~: u5 d0 @
    $ n$ m# ]/ t' F5 z一、数据爬取, ^& l  @0 {; t/ l- S( m: g( q1 {

    + I% Q; I4 R# F0 b二、数据预处理
    5 h  N8 a- V2 v
    - @! |3 D" \- ~: F8 q5 S​前言+ R: }' L% b3 L$ G$ r  T; `
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。& [* ]  l1 u2 F8 c  O2 q& M, n

    , v$ P1 W+ e& X  s+ {4 s( b2 j
    ( v6 A# \5 v+ x. u9 b, W一、数据爬取
    $ K) \$ ^5 t( Y( jimport requests3 f4 v1 z, J0 U3 b/ I
    import pandas as pd  H$ T* X3 n. u2 b9 P6 b6 N
    from pprint import pprint
    9 s, O0 h0 s2 T/ K导入相关库0 j* E3 \& e. ]; p
    % p) d# Q, G/ D/ ?( ^, T- Y3 R
    requests库用于发起网页请求,获取网页中的源代码;
    $ Z* b1 d) ~& B* y$ f: e& D2 K$ Z# }. f2 x
    pandas库用于存储和读取获取到的信息;% `+ U! Z; `, m7 a2 b# g- E! @5 w

    & [$ p7 O$ c3 C/ m6 Z" kpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
      G+ B1 |1 u4 S* V% r: R) ^& p
    9 u& f: p- M) c8 V: Q( b3 aurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'& x6 Q7 |2 @" O  H  T/ z. x
    data1 = requests.get(url).json()
    # d1 }9 F" \7 ]6 @6 E- l) y4 _# pprint(data1)
      o0 |% p( I5 s% |5 q4 e9 l6 Z$ N- {/ ^$ o( a
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。) e; w) a+ Z6 [7 y6 N
    df1 = pd.DataFrame()$ e$ T, k" \6 d0 M
    for info in data1['body']['allMedalData']:2 ^1 `+ g+ ?" w/ ^% u! t
        name = info['countryName']& N! X$ ]! }: {3 @
        name_id = info['countryId'], d" {4 Z% D5 b# |7 u& Y9 r: n* |5 q
        rank = info['rank']# Q  }4 ^( O# ^$ F3 s
        gold = info['goldMedalNum']
    3 l  Z1 K. R" {0 r2 ~    silver = info['silverMedalNum']
    1 Q. t1 X3 P$ G( T) k1 p. i    bronze = info['bronzeMedalNum']$ Z' P& e2 m" M
        total = info['totalMedalNum']+ c+ c& k2 v' b8 v1 Q7 X
        # 组织数据
    6 Z" D# z7 s, A0 c& }6 z0 w( t! X9 S    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]6 c% e" ?+ P+ \/ ~( @
        # 然后追加df
    : r7 a/ h) _  Q( `1 m( _    df1 = df1.append(orangized_data)* O  X6 t0 l" \: U  D0 E
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    7 ~; T. f8 A$ h; f4 Xdf16 g3 D4 L; M' ]# g" [( n6 v) a5 y
    ) u. W1 L+ K# a. Y

    4 C) |9 @) \7 i8 g, w0 k4 {* }6 H这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。0 x( X/ ^5 P2 e" h6 b* O1 s
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    ) ~- H! I7 o" o) E# N1 Hdata2 = requests.get(url).json()
    $ g9 M/ ~/ b5 d  O#pprint(data2)
    / \) z! u) U( `4 E5 ^8 ~: B, I9 w, ^
    ! |3 l  S9 p) F3 S0 v  U& vdf2 = pd.DataFrame()
    ) f$ ^8 k# ?! g2 L; Jfor info in data2['body']['medalTableDetail']:: I  @4 {$ U1 o8 }2 F: {6 F
        english_name = info['countryName']8 |# f1 F) n" J% G
        name_id = info['countryId']
    / I' N( D1 Q  T- u) d, p3 ?    award_time = info['awardTime']
    " E" |. X4 z+ H8 T1 h# ~+ R- \/ ^( G    item_name = info['bigItemName']6 ?$ H' y- {$ A. @; F) {7 I
        sports_name = info['sportsName']
    & H8 e3 \5 ~  O# O2 m) h    medal_type = info['medalType']
    5 ?: R& ^) y0 Y9 s& M+ A* c% d    # 组织数据
    ' o0 a. X$ v* g# q/ o    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]+ l/ i; @  h5 V( i+ P
        # 然后追加df( V6 a  h$ f3 O/ ]
        df2 = df2.append(orangized_data)# B1 {) Y5 C8 f
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']. _5 O- M6 s# w1 Q2 a
    df2+ B% _9 }9 W, F) i) H

    * ^) B9 w8 W7 q5 }对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    # _8 m" E' L* G, v4 _. ^. F% {. e
    ' R$ k% c  x0 S" R& L
    4 e; X3 ~& e% J, U- r4 Z* }二、数据预处理6 L) O) F' v' S! h4 q' c# h2 ?
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。" u; m- B: W1 I5 L
    : p, B1 \& \6 f1 q- Q
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:8 t! ^  V  ~  A' q2 T
        x = f.read()
    * U" V! `. L: W/ p) V: h0 f' A( a% _
    df3 = pd.DataFrame()9 x8 R: ~) }% w6 ]; d
    for i in x.split("\n"):# P, ?/ S$ p* C6 B: K7 J) R0 G
        x = i.split(":")[0].strip()3 U& ~6 d( H0 K* C' F; ^1 O
        y = i.split(":")[1].strip()
    - v+ b; }5 ?. z% W2 l  r* d3 z    orangined_data = [[x,y]]
    / R4 C. ]$ g" U6 D  U0 o7 {; c    df3 = df3.append(orangined_data)
    3 g( c) J, M; a/ U8 B, tdf3.columns = ["名称","英文名称"]
    0 N$ r0 H$ W" G% J* }9 R$ \" Sdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    $ h$ j- {* i, I$ T  L9 N9 U6 j表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。% V9 {; Y% r, S" R; X! t

    ' y7 T- @) _0 Cdf4 = pd.merge(df1,df3,on="名称",how="left")  z% E5 W& l0 c" t
    df4.head(10)
    . i! T$ v3 Q# g  e3 h" P
    ( d1 }+ B3 O* j  H+ Y
    ' R8 M. f( h( x

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


    • # o, l* B7 a& D% T5 i7 H% j, Z0 T. Y

      " X9 o  E3 [% b0 U
      ( ]8 ?" V- Q, @0 k3 J# j8 y
    , ]2 M5 |8 U# e5 d+ [

    . r4 z9 ]. @. W- o0 G
    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-9-12 09:36 , Processed in 1.559787 second(s), 56 queries .

    回顶部