QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    / h' Y7 L2 [# m
    , {/ H0 \7 ^+ o# e6 H) ?文章目录
    # H. u# {( D  C. T/ |; r5 ?  g" |2 X6 f& y
    前言
    1 t& R) D1 }* v2 d- q4 L
    1 N2 N3 ]' {; B: W( T/ P一、数据爬取( C! g+ K: N2 J7 ]1 m2 m
    - p! C3 W) C1 x" I
    二、数据预处理+ \- g9 }6 Q2 K+ B( ?! [  Z' Y
    . D) d3 [- ~' g5 V# N
    ​前言' U" w( I$ _6 A' Y$ A
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。5 u! w" j0 z; r% X; ]# k

    : C( Q( r4 _1 \8 i* o: {+ E& `+ i0 [' [0 e
    一、数据爬取: f$ R/ {# X; ^: [5 K1 H& \
    import requests
    2 U7 ]& n$ ]+ E/ C2 Q7 c4 jimport pandas as pd: `. x0 X% [/ A" `; e$ x9 N
    from pprint import pprint
    3 {5 F2 q  ~2 a) K9 N! |导入相关库
    3 D* P& j9 s3 F0 @' \& q# f9 z7 ~* K: c7 v4 G7 s
    requests库用于发起网页请求,获取网页中的源代码;
    ! _! b4 \$ V; x& e$ U0 B' |$ m# Y7 \4 v' x3 J& I. @& T
    pandas库用于存储和读取获取到的信息;- Q9 w5 H, p( k& j2 e6 U0 @
    7 }- G$ N& A' Z: v7 n6 F. s
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    5 T1 O+ _. d/ G3 G) l
    ) M' ~8 G2 Z* ?. \4 Eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'& y: y$ W7 M: w' r
    data1 = requests.get(url).json()
    1 d, i. W# w- D* g2 y8 q# pprint(data1)
    9 L* w. k3 k0 N2 ?1 S
    ! R% d8 q2 ?/ g( t) P这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    0 k7 x  r" i$ P) i9 Ddf1 = pd.DataFrame()
    ! ?+ ]+ o. k: e$ a4 Dfor info in data1['body']['allMedalData']:3 H; p- D1 e; ]; e3 D4 r
        name = info['countryName'], ~/ J0 c! C: o) w
        name_id = info['countryId']7 }2 `; t( S8 g
        rank = info['rank']6 U( |3 u7 q. ~$ [
        gold = info['goldMedalNum']
    1 ~6 O2 m4 }4 J: R    silver = info['silverMedalNum']6 J* P7 Q1 B' z  @
        bronze = info['bronzeMedalNum']
    . f  u# n1 S" N6 h    total = info['totalMedalNum']
    9 w: s) Z: x+ E" l4 {9 [    # 组织数据/ N5 e9 s5 o. K  u* t
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    & t$ `5 p% }4 n' M/ G2 `  {& G) K    # 然后追加df
    , O  {) |' ]/ b' K1 o6 B; z    df1 = df1.append(orangized_data)
      E9 E! L) [  Hdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    . V- Q8 @: d, ]0 `df1
    1 F; \: [3 D/ D$ G0 ~% O4 W; ^3 w/ x, m" r; r

    * R# i6 ^6 h9 |这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。9 Z3 {4 A0 L% x% K. h& ?7 s+ D4 w
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    $ m+ X2 _* x! I( ldata2 = requests.get(url).json()
    + S1 V; U& t$ `- q$ I" ?#pprint(data2)) H8 r9 o$ w1 h3 V% h

    0 H+ f. O2 T+ {  V) z3 Jdf2 = pd.DataFrame()
    $ t8 n. ?8 Y. b. T7 H! e8 lfor info in data2['body']['medalTableDetail']:
    7 H, ^* g6 J0 ]. m5 O    english_name = info['countryName']
    / [4 C; B- o. U! P7 n) e9 Q8 J    name_id = info['countryId']
    4 X& I, c" x1 k6 ]" S6 [, ^    award_time = info['awardTime']# z) C3 V8 \2 B7 ~& Y! S  g
        item_name = info['bigItemName']
    3 T7 v: E' v, G4 m! |8 Z7 i! |    sports_name = info['sportsName']- \$ N2 ]) e" s4 x# l. f
        medal_type = info['medalType'], J( A6 J" J% ?- ~* s
        # 组织数据
    8 _* E' `% N3 E8 \8 \    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    , Q1 r3 `  m5 a; L' p" T    # 然后追加df
    , F7 ]0 B$ o7 B5 {7 z4 W6 l( j    df2 = df2.append(orangized_data)& x4 c3 n9 L' h6 [
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']* K3 u$ N0 P2 ?% V$ T
    df2- Z. n! x  o7 t: G6 J+ r4 A

    / j& F$ `6 O5 ]6 Y, z对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 4 _5 y: ]8 h  Y

    7 B1 y( Y3 L$ i, }! G1 |( v+ G; e) |, ~- T) u3 m
    二、数据预处理& u: V; l! d) i2 t+ k6 x  \7 D
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。5 d5 F6 u' V, C

    3 W, G. m3 A- ~! m1 qwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:) _9 Q% e% p+ w, @# B( z
        x = f.read()
    8 ?+ l4 `1 p) }  R- k; }
    1 ^# j. C4 c0 x1 ]- \df3 = pd.DataFrame()+ g5 [' J! k" [$ o0 z, @% C
    for i in x.split("\n"):9 o/ B! m& R' }8 o2 n& P
        x = i.split(":")[0].strip()
    1 W- n! G$ A5 ^    y = i.split(":")[1].strip()
    , E% [: |9 F6 s    orangined_data = [[x,y]]4 e: J4 s# ~5 o$ N: }' U# Y$ ^
        df3 = df3.append(orangined_data)
    ' E+ x  u2 Q, x! f8 xdf3.columns = ["名称","英文名称"]/ T' u& q& R, J6 z+ n
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    ' ?3 J, n  X( C9 m/ e表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    5 q5 _9 w9 z- m  o! F1 \% i/ C: L) f5 a" b. p9 O
    df4 = pd.merge(df1,df3,on="名称",how="left")) V' x4 i9 u7 }5 N3 _
    df4.head(10)3 U7 k+ }1 h2 r6 L
    " }" e7 a3 i7 K
    " B7 Q1 N' O* q5 v

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


    • / {/ M$ V$ X  X* f- |
      1 W; l' T3 N! q9 Z% j$ n5 q; U

      - T9 x' ^4 A  ?( L
      m3 r0 k* D6 O& ^

    # t& K7 q* m$ }. t2 ?
    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-5 03:42 , Processed in 0.332041 second(s), 56 queries .

    回顶部