QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    ; K5 d# i+ m" r
    9 |! _! E3 x3 G, c5 h: A( k* u0 M5 R( G3 F文章目录- U# y( U' f$ z+ p

    2 Q# J% Z* Q- G) y& z; d* ?& U前言; D  H# G) Z& e( ?9 q  d/ b( z
    3 W) R3 j0 p, X! a# R8 h3 l+ A
    一、数据爬取
    - o5 R) R6 H4 V/ f. I2 g# d( f% l* v
    ) g( s+ X- {* u. B' c二、数据预处理7 `. U3 N+ p. q1 o% ?8 D

    / U+ O4 R$ K  M' V) f​前言/ w. J, s1 J1 Q0 Z
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    + Q  I1 u7 V. X( I+ k3 T  {" U
    ( m9 ?4 a. t  _7 i' c& X* P" {2 Z" ~2 \
    一、数据爬取0 I7 T$ j7 z) d
    import requests. ~1 z7 S9 b, I3 |3 g/ e; J& ~
    import pandas as pd. ]+ Y5 `: {8 b+ C; l
    from pprint import pprint
    - k  m% B7 o# O* _" }: ^导入相关库
      f& h! }: Z; E/ n
    # k9 W  N' N2 Q6 @requests库用于发起网页请求,获取网页中的源代码;
    : [4 v' h! `9 c$ L4 @# g) D0 E3 e1 S3 ?& I
    pandas库用于存储和读取获取到的信息;4 R" i7 F9 v6 K$ P

    ; z7 L: F$ g9 z) O- S; ?; e2 y* spprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;0 }  f  W* u% D/ h: {  ^; J
    , g( U. x/ [5 j) Z; |
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'1 Z9 A/ e. m" S
    data1 = requests.get(url).json()
    / ]5 P- P% z9 z+ ?# pprint(data1)$ F! W' l0 C5 R( d2 h$ ~

    ! B  \0 Z" H" D9 J这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。" ^, ?0 m; y6 v" _1 g! M, B5 q
    df1 = pd.DataFrame(); ^1 ]8 b" B" p$ n
    for info in data1['body']['allMedalData']:% M& e% r) z1 r7 I
        name = info['countryName']
    + p( D0 U, _2 L, |# S    name_id = info['countryId']- t* L8 I0 T) O( A8 q
        rank = info['rank']0 @5 T/ _; n3 M& c
        gold = info['goldMedalNum']
    ) [  u* L! n8 {' b    silver = info['silverMedalNum']' r* z+ Z1 h3 ?# M6 c
        bronze = info['bronzeMedalNum']
    + Y* y' A0 |# c+ T  |    total = info['totalMedalNum']" y7 B9 |9 z6 v7 [( p  E
        # 组织数据+ X# {( D' X$ F; e+ b5 ?
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    & H% x; L# N: I    # 然后追加df% Q! a7 f% \4 r- ]: G1 e  Z' ~% U
        df1 = df1.append(orangized_data)7 i) ~# |+ O0 e% e
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']( z9 G. ?, |1 [5 M3 P
    df1
    5 c4 }% I- Z. t4 J0 H. X3 V# ^! K2 d- e

    5 H; ]/ ~5 s9 v( J这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    0 U- Z. d; _; _% Z8 g+ S- Yurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'2 L& T3 @& U3 G, d  _+ U1 P
    data2 = requests.get(url).json()
    / Z/ _: b6 l0 g% c5 B. Q#pprint(data2)
    4 U* @: O4 N% M( I, ]' ]" Q1 d( E& F6 y$ ]' _+ f
    df2 = pd.DataFrame()
    * q  L/ g* i4 W0 V4 M  ufor info in data2['body']['medalTableDetail']:
    " f9 R/ D) b: z7 H' B  l1 z2 h    english_name = info['countryName']; D  N: H7 N* q4 r
        name_id = info['countryId']  @( n' f* ?, g+ V7 _
        award_time = info['awardTime']. D* q& ?% O( a7 ~9 f! z/ `
        item_name = info['bigItemName']% n: N" ?; Y& \" A6 P6 J/ a
        sports_name = info['sportsName']
    " @2 r# b7 `; v  Z! u& h8 i    medal_type = info['medalType']' U6 o+ U5 C% r" r4 \* R4 I
        # 组织数据( J/ Z+ l* ?: d3 o; R. a6 X; ?
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    . m/ I! ~8 x9 G! v    # 然后追加df
    7 a7 T3 y: Z  U- v    df2 = df2.append(orangized_data)
    ) A8 k8 k* X9 K) t4 x# bdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型'], @% ^& ^9 b4 t& N
    df2$ |/ ]/ A& ]% R+ f  t2 q
    % w; d7 K' i- }3 I) S- p
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    $ @- n" B, e: B( _  u) q$ J1 ~# k' o# l
    8 g2 o- J( X" R5 v! I$ {7 ^
    二、数据预处理
    / `( h% S2 N% P4 A由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。5 d" j3 r6 w% p5 @# O# Z
    ! a  n* N# F! x
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:* ~5 n* L3 [) x, {
        x = f.read()1 I* q1 }% [* S* n* ~
    1 t( p4 E% z" z  a7 _
    df3 = pd.DataFrame()
    1 |: C& s! E5 r% `5 mfor i in x.split("\n"):
    - r1 L4 y% ^2 |# g2 i    x = i.split(":")[0].strip(), l0 M+ M7 D$ a: a, l- k$ \6 F
        y = i.split(":")[1].strip()! J2 t) [2 z! o1 B
        orangined_data = [[x,y]]
    ' v2 L7 y6 d8 t  {    df3 = df3.append(orangined_data)
    # [. B6 h$ {3 Z' D4 i4 bdf3.columns = ["名称","英文名称"]4 @1 U" ]! E& @% b" o; o
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)# c# e# F5 x- w3 A
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    2 D4 ^) J8 j- T* L. [' J/ {+ h0 p3 C' h6 f* H
    df4 = pd.merge(df1,df3,on="名称",how="left")  \) C3 \& d& a1 V! X" ?' L5 R
    df4.head(10)
    8 j; }9 I4 J# ]4 \) t8 Q9 M8 q. A9 Q  c7 ^7 k
    * A& [' _4 h0 }  C1 S

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

    • ) `1 O3 X3 q. S1 l; n
      6 W# |( V+ q* G2 X$ `

      " T- N: D  ]+ d  q* q0 Z7 O, F+ C3 w

    $ q! U7 ^, l" Y) |1 b! K4 Z5 ?2 n8 l- O; v0 o9 x' }$ Z8 j
    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-18 14:53 , Processed in 0.415254 second(s), 56 queries .

    回顶部