QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    目录
    / O, X# u  t  y! K7 X9 P9 N# N* E1 Q
    3 O3 f% k' ~9 f, x文章目录
    3 ?. {8 T1 J5 ~5 }+ T4 z6 C
    7 Y& D6 s! T, O1 v. w# ?2 C前言# y7 W: V0 l9 P8 N
    ( x' c0 b5 u1 ?: @; Z
    一、数据爬取6 `* R2 j" }& e8 R9 R. C3 X# V- G0 c

    " p8 y" z, O. ]% f5 O5 D二、数据预处理8 b2 G1 T! V, {. ^6 @' |1 E0 ^# a
    0 m% K( A% u1 Z, e1 T6 ?6 [, y
    ​前言& D% A1 h+ a, E0 V# M0 h, S
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    " r* R1 T. D' T" }& }
    ! o6 @  K7 K3 Y8 P4 A. P' Y7 P( x) N& h! o/ j
    一、数据爬取
    + J9 l, U4 g9 \9 y- y- cimport requests7 P) p3 j7 {1 L+ L7 \  e
    import pandas as pd
    ( w) i2 V6 i+ d0 v6 M8 rfrom pprint import pprint- a- o, n8 G* \5 Q- \: j8 o
    导入相关库, y1 Q5 ~, O3 B2 U  @& l0 r9 V
    - X" S' H9 v. D8 `  z
    requests库用于发起网页请求,获取网页中的源代码;
    5 Z/ }5 ]- K: T" p  e3 T3 f% g6 ]1 M) l" H+ V  M* J) ?
    pandas库用于存储和读取获取到的信息;
    $ S. }: ]$ J* M+ `$ y
    . Y% k6 P5 i) A2 |3 |pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    $ y! S  S3 `2 }/ s. G" _# U5 o' u. Q: ]
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'1 t5 i# ^" q1 h5 J5 j/ ]
    data1 = requests.get(url).json()' p% P6 p/ |; @) v  f
    # pprint(data1)7 V6 F/ O& V8 Y- g+ r

    4 ^6 p4 e  M3 w4 S: k这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    " j: m$ l4 B1 b1 [df1 = pd.DataFrame()
    $ ?1 x# t4 Y1 f2 bfor info in data1['body']['allMedalData']:- U( Q8 g. J- \& Y! \5 Z( |, [
        name = info['countryName']
    # r  C9 Q( [9 T8 j; a+ j0 g  n% a    name_id = info['countryId']
    - v  e5 M5 c- ], D- ?# N" S5 V/ H3 b* L    rank = info['rank']7 \; Y1 S+ M4 J) I& w. A, \. D
        gold = info['goldMedalNum'], j8 M' i% N; V- _9 L; L
        silver = info['silverMedalNum']# [% M, l: ]- v  o- ]! S
        bronze = info['bronzeMedalNum']
    , L6 u% |8 _  |$ @    total = info['totalMedalNum']9 M4 u% P6 }8 n
        # 组织数据0 l9 \. U/ Q! G( e+ b* y' N, y
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    - l6 [% \6 T- w9 {0 a5 F    # 然后追加df* I- Z( ~! m- Y8 H  r* H& h% N
        df1 = df1.append(orangized_data)
    - u+ D( u  w- X/ N# |2 _df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
      i0 g% g/ h' b. i5 `df1
    1 I8 K% `& |, k1 H, b3 `. d' D3 Q0 X, Y6 [
    ; M  s: i" a0 o+ W/ s4 L
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。) i7 k! @" }: B; ]& ?  s
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    , ]( D% Y, r" M! ~, g- Mdata2 = requests.get(url).json()
    , Q3 ]0 Z+ ^% ]- G/ [0 _. f#pprint(data2)3 O/ p1 \' r: y! |
    2 j. \; M- A6 p7 |
    df2 = pd.DataFrame()( s! Z0 ]1 e( s. E8 {4 w& l
    for info in data2['body']['medalTableDetail']:8 ~" A# v% k9 O7 I
        english_name = info['countryName']
    8 D' z8 g: }% T- Q    name_id = info['countryId']
    . W5 w$ T2 j( }: C+ J7 ^    award_time = info['awardTime']
    ) b: |+ t% z6 A/ x6 u8 U7 @    item_name = info['bigItemName']
    * M" ]$ o8 t4 ^3 i    sports_name = info['sportsName']
    + V- |! T3 S+ g( p& ^6 u    medal_type = info['medalType']
    0 j4 Y* A+ ^3 u4 F& S    # 组织数据
    0 Z, F/ N8 M7 ^/ A3 I3 ^7 |    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    9 m: \( d6 V2 ]9 Z7 i    # 然后追加df& q; T% ~7 s) N% E. s, e
        df2 = df2.append(orangized_data)$ }. m3 A9 w5 h" D
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']5 H$ \! H# m3 N: ?
    df2& }8 U& l9 H( J6 z5 r

    5 f& u  E+ n/ U5 g! U1 K, @( b( R: S对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    / o' \8 I+ s; R4 g# [
    ; j: l! `: \! p& }8 f" L0 L0 r5 \1 G
    二、数据预处理6 Z3 n2 j. @! @: w* J+ L4 c% v: m
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。& x) [7 M$ _. E% G+ g
    0 e* M5 S4 b9 }3 B9 t
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    9 I; F6 o0 S- s) a    x = f.read()8 q2 f7 c, p: }
    / D2 W3 j$ |  a+ G; R5 |' h
    df3 = pd.DataFrame()/ _- S7 z1 `0 T4 {4 T
    for i in x.split("\n"):; n; u; J/ `, ^( X, a
        x = i.split(":")[0].strip(); ?/ s% }; }2 J# v
        y = i.split(":")[1].strip()! u) R1 p, W8 a4 q
        orangined_data = [[x,y]]
    ; n" j# y9 |/ r+ n7 R5 ^    df3 = df3.append(orangined_data)
    0 p* _3 n& G" ?. N( y- W, ^df3.columns = ["名称","英文名称"]
      V+ S! t) J+ pdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    - a2 J$ |+ ]1 y: s* U表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。0 J5 A6 n5 u' T: `  S6 A3 i8 K/ }

    : w- R; G! r; J2 Idf4 = pd.merge(df1,df3,on="名称",how="left")0 V: ^1 p4 K2 r: Q' J% Z3 h
    df4.head(10)
    ) M" r# {+ I4 z1 m0 }; ]8 L7 R/ |! u  `, }- x
    7 c6 I. a- k' }  ?- A! i+ Z2 s

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


    • . p/ T" x3 E& m3 z* w7 t1 _! X
      ! j& _4 F7 Q/ Y. t( P
      - Y! v& D) p" [" C8 a
    7 u4 C" }0 |9 M/ s

    5 \' m% \  `8 I* 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-6-3 02:45 , Processed in 0.435108 second(s), 56 queries .

    回顶部