QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
      u' Q8 r3 i9 n8 ]  }6 C
    - k0 V/ d9 |  |4 g8 N文章目录
    $ T& U# A& k4 v! I
    & v, v, a8 k( {2 u$ D6 G前言! y, j6 M2 T8 g

    + |7 f" o5 w* \, ]" m& S一、数据爬取+ @2 A( a4 d+ x* h+ T/ \

    : K0 G5 X, x  n7 f2 F7 v5 E  n& t二、数据预处理* \$ w' A. T' {" D, [8 G! |
    ( ^& {  Z1 Y6 a, V- q* B9 f$ c
    ​前言
    % d  }1 B- U3 J  z9 A本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    . o% g2 q2 k& f+ b; v/ N! s6 z: r( H3 e# V9 _* r
    ) i3 N3 a- x6 W3 M3 s5 N0 x, [
    一、数据爬取
    , t$ C. E- C8 n( Eimport requests
      E/ F+ M# G3 i+ yimport pandas as pd
    " ]$ f5 X0 ~1 T6 g9 G# r( kfrom pprint import pprint# {& G3 \7 b; n% A
    导入相关库
      q" l  b$ J+ O# g1 O" u+ q3 o0 f& g
    requests库用于发起网页请求,获取网页中的源代码;" f% k7 ?3 f' J' j8 E0 ]+ a( b

    5 ]% p) ?( `9 E. r) d: Dpandas库用于存储和读取获取到的信息;
    $ A- _# b$ @7 {" R! U' y5 w
    % F- i* t/ V7 B* U" [  ~pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    7 ?6 j- W; z0 C/ O' |' @* D
    , F1 K& J( L& p9 _url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'4 F5 }* \# g: s
    data1 = requests.get(url).json()4 v6 d6 [" k1 N( R5 v  j5 T
    # pprint(data1)
    3 R) K/ l1 b" l) Q, ^5 Y( G" @* u) ?" B
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    . \/ ~2 ^" p9 N- I/ bdf1 = pd.DataFrame()" o2 r. m& B/ x1 e$ t3 M; A
    for info in data1['body']['allMedalData']:
    7 j* Y8 s% x* s3 A% q+ Y( u    name = info['countryName']
    - @) [) b( x7 V; q% |  ^    name_id = info['countryId']' O  s/ ]3 K4 j8 P- ^' j' S" h' t
        rank = info['rank']
    2 J" d& ~! n% g* P    gold = info['goldMedalNum']) z, u+ H! v# k9 s, m4 R
        silver = info['silverMedalNum'], e" m0 O# X& ?/ |& A' V
        bronze = info['bronzeMedalNum']
    * [9 ^3 P8 |' ~1 o+ J    total = info['totalMedalNum']
    " g3 G2 M8 Q: S' D1 _7 l    # 组织数据
    1 E9 T8 _% E1 ?8 m$ w0 k7 m3 _" l& d    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    - [: \: ~4 }/ G* B    # 然后追加df3 B' z( p, [7 y5 c" ^
        df1 = df1.append(orangized_data)1 V  V% p2 }% k
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    ' d* q1 ^' [3 ]4 _! V1 Bdf1$ m# |- ~% \$ v' \5 e$ A% w

    ( V* S. ~9 e6 Q& @# l3 s& v3 h
    0 y7 ]+ C; p- W- a" ?这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    # U) f3 a$ h) W& n- q9 [7 H! lurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    # D0 o/ `! J- D* _- G+ wdata2 = requests.get(url).json(): @. V: i- y$ x9 t
    #pprint(data2)
    6 L* \! N! s) X7 c; Z& r# {" v3 y. \) r
    df2 = pd.DataFrame()
    2 a9 P& m" [& [' n. E) Mfor info in data2['body']['medalTableDetail']:
    4 z* C  K( r7 a6 t* F% B( k5 [- r    english_name = info['countryName']/ l+ v# Q* R/ d8 Q5 S
        name_id = info['countryId']& q* D4 Y5 E2 h! a; X+ ^' y
        award_time = info['awardTime']
    % f) ]4 V; T5 L" |* b$ E! ^    item_name = info['bigItemName']
    - E% q( n! k5 r3 q& d- m    sports_name = info['sportsName']5 I2 @4 ?0 V4 h" h' Q  r/ k/ b3 X
        medal_type = info['medalType']" r4 V9 X3 _! D5 m
        # 组织数据$ t$ k( c4 a: _, h4 S; Z/ U  k8 Y1 K7 i
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    ' O2 X' l0 b1 _+ V; L+ _( j    # 然后追加df& O- s' L% k( J3 Y$ D
        df2 = df2.append(orangized_data)7 S: q+ c0 ?- J% z: a! n
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    $ ?& ]" R  w/ ?+ D: i0 \$ l; ^8 T; Cdf2
    / x" q1 g9 n+ T" j, m, @! b1 k' |# h
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 - M, W3 [+ s9 I% }/ N8 J. P
    7 M  r. v/ |* X/ y5 f

    " Y( c5 J; U8 A! ~% N; o3 N二、数据预处理4 p+ d2 u' t$ [5 B
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。( I: s8 M$ X2 K, f( z) a
    ; h& G: f( I! v5 C, Y, t
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    0 \/ J; k- L9 I6 J& N    x = f.read()
    2 f& R1 X( L9 ?1 {, m; n3 k4 e6 s' i' h# s( w/ @
    df3 = pd.DataFrame()9 s) ]" J3 a9 y7 k
    for i in x.split("\n"):8 n& {. U6 S' ]% D" P
        x = i.split(":")[0].strip()+ B1 W( m5 h0 l
        y = i.split(":")[1].strip(), H2 s' b0 D1 N3 d. c* i  Z
        orangined_data = [[x,y]]+ T, Z) {5 _% F3 W
        df3 = df3.append(orangined_data)0 |0 ^# M( d2 e7 `) s6 O
    df3.columns = ["名称","英文名称"]
    ; R8 v) z( ~4 `8 _+ Hdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    1 g) i% W$ n% c+ X4 n表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    ; H2 R! C( O$ C( E! m- r! u! ^; F3 Y2 n- ]
    df4 = pd.merge(df1,df3,on="名称",how="left")7 G9 ^: K8 l$ B6 A0 ^. a1 l1 ^+ v
    df4.head(10)
    # a/ _# X8 e+ f9 ]5 x' \: L& y
    % C. `/ H% A; k

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


    • - h2 }0 o' F. |, ]) C1 y
      ( r7 z3 R+ P+ P3 s# U+ @2 d' s
      + w* z, K  W" |$ o+ ~9 ~' s) x, v. F% V
    0 _; S7 y6 R6 n
    8 O5 R) X/ Z2 z0 Y4 w* m" |+ 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-6-3 04:25 , Processed in 0.372922 second(s), 55 queries .

    回顶部