QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录) i8 z+ k. t% o
    6 r5 N/ [6 {+ B; g% p$ w6 e1 z
    文章目录$ J& W9 s8 {. C2 U8 J. @2 F/ \# b
    ' ?& \( s, x2 \+ S. p1 [8 y6 f, T0 ?) L
    前言
    % A2 ?" U) N4 x6 }' ^  R* e0 \9 L4 A' ?
    一、数据爬取- Z' g# W7 n% N3 f' F8 D7 s

    ! s5 A: M6 \7 a2 H5 K6 ?  ^二、数据预处理
    6 a! K: ~8 v) h) j/ ?  `. o* G9 k  ?1 i7 i& F8 }0 k+ v, N
    ​前言
    + C/ Q$ g; c! F5 D本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。' _/ F: H3 p9 c
    $ }2 x/ O9 ?4 J4 @: L

    . ?; x# E. L' {8 `一、数据爬取
    / y0 Q! R# z+ F( L: a& b- |0 Uimport requests: z6 q; L+ U+ P0 \/ v! v2 N
    import pandas as pd
    2 b3 [: l( r8 t8 bfrom pprint import pprint7 ]$ H& h1 p7 Z( m' p1 K8 x" f
    导入相关库* W8 U# G$ [) G0 V( K: {
    1 b: x3 p; L. W' ?. M
    requests库用于发起网页请求,获取网页中的源代码;
    ; Y9 D2 N) A5 p2 `& B( C5 }- G  {- W- a3 _4 h) ?& j/ k/ f5 ~
    pandas库用于存储和读取获取到的信息;
    $ u0 ]/ K( z4 Q6 W$ k* c2 G' g+ p) A, q+ x3 |" K
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    2 t3 P% I. \' k" ~2 U6 o2 Z6 m% d$ ~, s# ?
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'2 `1 i; @$ z0 t7 n9 V7 n3 B
    data1 = requests.get(url).json()! A" h# D: L4 j* ?
    # pprint(data1). Z7 J" N. l: K* g

    6 l* R" P; c4 q  c% @这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    ! w! p3 a1 m, a. mdf1 = pd.DataFrame()2 y; V. ?: n- ^4 r$ e) A2 L/ z; d
    for info in data1['body']['allMedalData']:
    2 q. c( S+ _3 o+ h    name = info['countryName']
    - z3 a! {+ _1 I5 T/ j% M  a    name_id = info['countryId']& P: [; X! P! h, R, N: v+ a
        rank = info['rank']
    + _* K9 ]: o4 X' S* w) q    gold = info['goldMedalNum']
    ) I8 |/ X( d$ L( d4 ~7 f7 d* n    silver = info['silverMedalNum']
    ) R' g& r' n4 `- g9 d$ l+ }9 N    bronze = info['bronzeMedalNum']4 o9 t* q6 K% v6 D9 x1 S5 i
        total = info['totalMedalNum']
    8 x/ @/ x4 r8 U9 N    # 组织数据
    0 _3 e/ Q, s1 [6 R. G7 F; b, C    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    ' e8 T3 u/ a; N( _& g& S    # 然后追加df3 E% W# w- K5 A! k9 }
        df1 = df1.append(orangized_data)
    * i' q) b5 |, w+ X9 ]0 `df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']: N1 Z/ E* g' x+ i) ?. u4 Y' X
    df17 p3 {7 `" H3 M
    2 U! S" O" r3 c9 h7 Z" {
    . N4 m# W& Q0 F; W% j8 u
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。! i9 l4 ~' ^8 y9 T; \9 F2 f
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'% d  q" S( L+ ]1 \; J
    data2 = requests.get(url).json()
    , ?( @0 n( r% T: w/ y#pprint(data2)
      c, f3 c+ d$ U. E& R: @
    3 A) }: g. G  }& S$ Ndf2 = pd.DataFrame()
    " ^" N( k2 y1 c- }; efor info in data2['body']['medalTableDetail']:
    0 g. C# {8 {; S% @6 V+ T    english_name = info['countryName']/ G+ K) H6 r: F; [4 c
        name_id = info['countryId']. l* Z8 J3 D& b" l
        award_time = info['awardTime']
    7 g$ ?& a! {$ |# P2 ^9 U+ ]    item_name = info['bigItemName']
    ; g$ R. Z& }3 k$ M1 `$ S    sports_name = info['sportsName']
    5 l  `4 X/ D4 e    medal_type = info['medalType']% r. N8 l: S) w7 H. D4 n
        # 组织数据
    ) d, w  v# e( v- s3 e    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
      i8 h1 A" ?+ Y. v3 v$ o    # 然后追加df4 M8 w8 [/ t4 W" Y
        df2 = df2.append(orangized_data)
    0 q+ f$ ]$ E- Kdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    ) Z& ]. u' d& q' j) Edf2
    / Q" Y0 e0 b% f* T: m$ D* R7 q: v) k( l5 f$ X
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    " c+ y( v4 X5 b4 X; i  I$ t
    . w+ P$ }) w, ]( W. ?, Y5 x& L' s9 Y
    二、数据预处理
    . |9 z5 C4 c: `8 e  G由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    6 f" l8 T1 a' M
    6 o( g5 j* w+ V% i" j; J0 j. }4 N* pwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    5 O) b1 k- S1 k! a' X% C    x = f.read()$ b" h$ ]. _3 b3 D

    , f6 H. K- }: e) p  r) Q' Hdf3 = pd.DataFrame()( A& G, y/ ?: E
    for i in x.split("\n"):
    ! j. l; i6 h1 m. S& ]    x = i.split(":")[0].strip()2 j& A! L3 h4 |) b; @, |+ t, [
        y = i.split(":")[1].strip()
    # t! Q9 `1 p2 F" B# g    orangined_data = [[x,y]]
    ' z) K0 W7 X* ?% s+ C    df3 = df3.append(orangined_data)  N7 h; T$ g4 s" e# s
    df3.columns = ["名称","英文名称"]
    5 Y7 o1 p; x$ O) W* w8 hdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)/ f1 Z9 b$ h4 [2 k; K5 C7 o& m2 |
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    0 v$ P% l6 Z5 `& Y2 t3 j8 p4 S  c+ [- `- k% P* Z, d8 E# V0 V2 j( }
    df4 = pd.merge(df1,df3,on="名称",how="left"). ]1 p: g* w/ j2 [  n4 C
    df4.head(10)
    * v0 ]0 ~. X: {; ~9 _3 O
    3 X" [. o' \+ w6 n# t
    : `4 ~: _0 _' D  |( U/ i

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


    • : P+ J+ S3 A* t+ M' D

      , V) v% J) B+ V) Z" F, l* @7 q0 k0 V! D: a

    / P7 A& F8 s) z! M6 C" g
    - |% k: _& R) h( X+ v/ M/ K0 T
    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-7-10 12:40 , Processed in 0.339068 second(s), 55 queries .

    回顶部