QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    # ~1 F3 d+ S+ ]; g8 A- ~: V3 S" v! T: h3 Q+ n5 r" Z/ r  ]! I% a
    文章目录8 ]$ B+ D8 U$ ]

    , J3 P5 \( j( r+ P6 g- a前言
    2 a+ P9 g, ]. ~* y: W  ^! ]! z* r" D6 X5 Q+ l
    一、数据爬取7 X0 W! n& m* D, @  C; \! g

    / s: c5 v8 E, Y2 m3 v二、数据预处理* m2 L% K) L0 [4 v: Z5 y- ?4 J

    - v5 |' v! ?4 T8 g1 X# [7 B​前言
    ! ?' P1 U% ]& S+ G- R本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。3 E" y" D0 Q- c8 O6 o9 s
    ' T4 P- a! @& u5 W# Q# {# Y& \/ _

    & u4 P" E+ |. e( ]. h) x. Y  e一、数据爬取
    ( X; R4 W# i- Jimport requests) b; x6 L' Q" h8 j( Z6 b: I
    import pandas as pd# x( a! w3 E* P8 k
    from pprint import pprint
    : M* M4 n. v) n导入相关库) O# n( o6 Q" |  q
    2 [( {. m6 x' t7 j3 X0 X! x1 }
    requests库用于发起网页请求,获取网页中的源代码;
    4 F  k+ @' x6 G! R" [4 k; n7 n5 K: ~2 X- m: f
    pandas库用于存储和读取获取到的信息;
    6 A. I% X* U- d( }, s; k4 R. x4 R. L7 H; B1 ^
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    ! V4 ~& M  A% z; o4 l" p- R/ y7 U* T0 t% r$ A; B* x
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    4 n' _) H, G/ n3 v9 xdata1 = requests.get(url).json()
    5 a/ [/ R% g8 v3 o+ ~; _2 N# pprint(data1)8 f% B3 w& C' \

    ! _. l' q8 k, n3 v: C& D这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    - E' J3 w/ N1 m$ j- H  Pdf1 = pd.DataFrame()
    " o) ~2 T1 k8 C$ _" j( J1 K. {$ p0 h0 rfor info in data1['body']['allMedalData']:
    # I* t$ g$ v% t- r; j4 A/ v; P9 t    name = info['countryName']# }9 d4 w2 f- d0 \" H1 a
        name_id = info['countryId']
    + N% j& [& H2 A' n0 I/ A    rank = info['rank']
    1 m' M0 \; p6 D6 [) W  ^8 M7 ]7 S! Q    gold = info['goldMedalNum']
    3 u* w/ y2 G: `) s/ R+ P    silver = info['silverMedalNum']
    / ~/ B4 |+ B; ^; D1 d! v6 u    bronze = info['bronzeMedalNum']% i2 b- j' j* c% k% o8 }  k3 i8 t
        total = info['totalMedalNum']" z7 o. O* ?( q+ \0 i
        # 组织数据2 p9 v& A, o# ~+ b/ D: m
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    ' h& G0 C2 i2 r$ ]    # 然后追加df0 z, ^& D- X/ ?( {$ j
        df1 = df1.append(orangized_data)  x  i, |' Q' _
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']/ s6 }- r9 J- ]; k5 ?6 `
    df1
    6 f  `4 d; V# z9 J, H9 s; g$ z; [9 O& m; V' T

    : J& c( [7 n7 j  E这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。. U. ]( N8 A; g- u( Q8 [7 f4 _6 t. W
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    5 d" n- L% a, g3 [; e! P* jdata2 = requests.get(url).json()
    ! W$ I) R' G* z! k% K#pprint(data2), @  `: a0 D8 ^" r$ m3 j- T

    # x5 D# T5 }9 n, @df2 = pd.DataFrame()
    * ]! B. m1 T8 A. ^. f+ afor info in data2['body']['medalTableDetail']:! Z8 b: h! z( d6 L5 g& f
        english_name = info['countryName']
    - f8 |$ m& q* n/ I' J    name_id = info['countryId']
    ' Q. \# r6 |( n$ ^) q: i/ z    award_time = info['awardTime']3 Y+ M$ W6 ~* G2 ~1 D
        item_name = info['bigItemName']  s2 {* w* j; T4 e
        sports_name = info['sportsName']
    . j; \; l9 ~& r) ~& Y    medal_type = info['medalType']  n" b) d) U; @8 Y- }. ], M! @: S
        # 组织数据; G; A5 S; h# v# e6 p' ]$ u1 ~+ @
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    , ?- @6 w/ {9 K9 B/ I( X* o    # 然后追加df2 Q/ ?. e0 I3 k
        df2 = df2.append(orangized_data)
    # N* e/ u2 N1 W+ h$ F( t' J9 Ldf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    2 b& [$ L, A! N* z* B2 [+ Ddf2
    6 V0 n5 a) x9 ^. |5 P
    7 s  I; T% M* v/ `% e% k对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 * x* I  I7 K- G& ^" e- p/ M  T

    # |$ Y$ |+ r% v5 \
      u  N, `% P3 v二、数据预处理
    : @8 v% z' K9 a% M7 T/ C7 Z由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    / }- `8 ]2 k- p, \+ u" k& A( Z4 Y
    ; q$ Y# A1 d( j# X% v! H  Xwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:4 U) c. y" U5 T& F; q( j
        x = f.read()
    6 m4 J2 r; _. r* |. N+ _7 c0 b) U5 J8 ]" I
    df3 = pd.DataFrame()7 k- c% t8 I7 x
    for i in x.split("\n"):
    0 P- `4 X' g% ]- S6 }& o    x = i.split(":")[0].strip()
    ' q) w" b; o: \( d! C    y = i.split(":")[1].strip()
    2 {; @$ w9 B. Q+ f    orangined_data = [[x,y]]7 e. h" ~% h; J
        df3 = df3.append(orangined_data)4 }+ R& C( j0 \/ Y# C; b4 Q
    df3.columns = ["名称","英文名称"]9 p$ `* {6 ]$ d1 r' h3 ]& s
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    / Z1 u: m6 W( x) {: v+ k: S% U表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    # @8 p) x4 E% F$ K4 L6 j' k
    # s' p* C/ Y5 _/ Tdf4 = pd.merge(df1,df3,on="名称",how="left")/ ~  x" M( e; }: T: M
    df4.head(10), {! W  g; f% B  H1 ?* O

    6 l# [: a2 u) o1 f7 Y1 ^6 l5 ]0 u- d; \& L. H: @6 G: K8 q

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

    • ) [6 A$ ~' B* _2 q: b
      & A+ n# F" g# ]% ]" l
      ( [) P7 M7 K0 Z4 k0 J1 I$ @

    ; h' c0 L9 A: l+ b, r- G/ A) t! h7 p4 R# ]5 a; l8 e/ J3 L" _
    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-2 23:54 , Processed in 0.430978 second(s), 55 queries .

    回顶部