QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    ' e9 x: I% X# W! N
    ' ], U5 o; Y0 L: D文章目录; m6 s, y+ N: p. o

    & f! c1 W; I0 R& ?, r4 t' I/ k. R前言
    ) T# t+ I2 N' p) k- @
    % q7 H3 E& N- {1 U一、数据爬取6 @6 n6 q/ h- ~, v- e+ _

    ' v) U$ N0 L% z  o( |+ }二、数据预处理9 c# }* C) {" y

    0 F( S6 Z0 G$ a: p! C* ~​前言
    * p5 J0 y$ b1 R/ l! c3 I; L本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。- g/ _2 R- @$ ?  N, C; f. A$ Y

    6 n' H* D  [( g, L  A6 T3 ?& I. S9 |$ i% p6 d1 b
    一、数据爬取
    ( n, `2 y9 v3 S, j/ G$ [2 Bimport requests
    5 u( T! k2 R/ Mimport pandas as pd
    5 Y: @* q: ?- cfrom pprint import pprint
    / l2 W* c7 {# ~: i5 D' ~# S8 _导入相关库" {; e- H3 T+ }$ W! ^
    ' X4 \# j, K8 U- ~- H3 G
    requests库用于发起网页请求,获取网页中的源代码;
    # h7 F% ?4 C- b
    $ [3 ~7 E0 K4 S8 j, u5 Apandas库用于存储和读取获取到的信息;
    % i/ `- d. q  Q& ^6 t
    ! N" x5 e9 \" Ppprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    ) s% A' e4 J3 \5 \6 r4 Z
    , Z5 ^+ X/ l/ M- c. Kurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    ) k* n) k5 c; I( xdata1 = requests.get(url).json()
    + p8 s7 Z6 |7 Y( }# pprint(data1)' l# e- b, _9 g2 }( C0 m" j( A

    / c7 _" S' {7 m3 p, O6 C/ j6 h! ]8 s) J* W这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    2 ~+ Y3 Y; q2 g* H' m7 t% t" ^/ Y& Edf1 = pd.DataFrame()+ O* W6 @; q' q+ K  s* J# \
    for info in data1['body']['allMedalData']:
    . n' R$ j' ^3 ^6 |    name = info['countryName']. w1 x. |, p( F% f
        name_id = info['countryId']5 {/ q, K3 v1 M+ `. M  G3 q# |
        rank = info['rank']" z- P' ]- ?1 ]4 M
        gold = info['goldMedalNum']
    8 k3 t- W! u9 I- U  v* G/ x    silver = info['silverMedalNum']! B1 \0 R" Y6 G. a
        bronze = info['bronzeMedalNum']
    ' g. E; o5 s6 ~& R! k5 m    total = info['totalMedalNum']
    + Z  }6 F# i% L( E- i; Y    # 组织数据
    / I$ m8 P  }) G: Z    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    + G( L1 p6 M+ f* }! L    # 然后追加df' H" V( i" |( t( D0 n
        df1 = df1.append(orangized_data)7 t( d# K- c& ?
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']" r) c' j" w8 }- a
    df1
    7 O( ^7 T! J* O! ?7 I2 ?8 X6 P  G& T% Y. `' o/ U7 B% p+ W# ~
    ; _9 }' l' x: E6 X
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    & @& f, m9 C% k2 @) K8 v0 I, Furl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    0 H5 f  Q& Y& P3 {/ Ndata2 = requests.get(url).json()6 \8 D0 _6 b( W% q$ ]$ S* Z
    #pprint(data2)' c0 J  Q3 R5 }: K

    , e& v" ?! [5 ~2 e6 S, C% S, @df2 = pd.DataFrame()
    # N. b% i5 R9 u8 W  mfor info in data2['body']['medalTableDetail']:
    6 @+ Q& R% O* `" w' L/ }# k2 J    english_name = info['countryName']8 z, x( Q& b1 E( B. X) a! c: ~
        name_id = info['countryId']
    " `/ }6 P- j" J    award_time = info['awardTime']
    / @0 r3 ?2 b& F$ u" w5 ]    item_name = info['bigItemName']
    3 d) r; \" B7 N; A) k9 t  ?    sports_name = info['sportsName']
    ' ?- \; X- s, ]* g" v  o, G8 ~$ _    medal_type = info['medalType']
    * }0 q# X; A7 g: H    # 组织数据. C  X! Q9 i$ e$ |4 D& @: X
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    ' F  p; ~( v8 |% V! E" a3 T/ G    # 然后追加df
    ) j1 u; G/ U7 h2 l    df2 = df2.append(orangized_data)
    $ Y* Y4 x# k: n7 l0 ldf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    % k  W1 k( m3 z% X+ Q7 A9 X1 S! kdf22 S. ]. J! v: P5 ?4 J, @. ~
    ) ?6 O$ U3 i. l( e' o4 A1 d8 e' E
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 1 X; ~/ L3 t( i! @4 N

    2 g/ U% E- K& ?2 W
    ; }- Y8 T0 d) C( A) o: V, u二、数据预处理
    . V' @+ L( A8 q+ y, V由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。: \% c0 p( [$ @3 X* J0 Z! i
      F0 H7 E3 N3 L- k8 ]  R
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    " F8 g3 e8 t5 M" r1 N% o: _    x = f.read()5 J* D! l# V* h0 F
    - O! X* k9 _. J
    df3 = pd.DataFrame()9 i) w' l  F! j; \# r' D8 `
    for i in x.split("\n"):
    ( B( E4 r+ }3 Q! |; Y    x = i.split(":")[0].strip()
    - a! I: ]  q% {' w6 O    y = i.split(":")[1].strip()2 L4 c# O7 p( f" ?. K
        orangined_data = [[x,y]]/ o$ V" v* I' ]1 T" S: v; J
        df3 = df3.append(orangined_data)
    . `7 R! T1 ^5 h: e2 ?, gdf3.columns = ["名称","英文名称"]
    : ~$ n- l; y: H9 bdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)4 G- H4 V* G$ d# h/ y! ^. c$ h. g
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    1 i6 I4 I" Y. t- o3 b. `2 Z) \+ b* I) g
    df4 = pd.merge(df1,df3,on="名称",how="left")
    ( T6 W2 ~2 {6 m3 Adf4.head(10)
    4 U9 c7 ^1 _- p6 V
    8 U$ o8 L# `3 ?/ N
    1 ~1 l' f5 x( L- R- f

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


    • * ^' {4 a  q& h1 r2 n/ i

      1 J/ f- F; J+ y' c( |3 a. ?( Q% A$ r- z% i

    4 V, _0 Y: w# h: ~  n# k( K
    4 @+ {( O' u9 `$ z5 v
    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 03:11 , Processed in 0.417788 second(s), 56 queries .

    回顶部