QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录" v* B- o7 z" ?1 H' C, B  D

    ) G5 b% E( [0 q文章目录6 V6 e, @# o9 W5 P
    2 t' I3 Q* V1 m" {2 J6 K* L
    前言
    5 `4 y# k2 c) ^
    ( r7 c0 b6 M4 S! ?5 P- R一、数据爬取- T1 G& W* r) e) ?

    ) a5 R; x+ b# K. K8 R! P0 f% Q二、数据预处理+ Y1 h+ t% N4 y5 b0 W
    6 U7 d; K8 V4 \% o. C
    ​前言
    - D. l3 A; k0 j本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    ( e/ e  w( _& F+ o: N1 S+ }9 G- c. t" i+ E9 e& m6 J# z

    ; N6 _5 }; E' u一、数据爬取
    ) [0 ?3 C, u) J: q7 Cimport requests
    7 T  R+ Y; B- \4 o( Y6 S4 Z, o- A7 r) R5 cimport pandas as pd
    % c  X6 W5 S+ I) f% P+ Ffrom pprint import pprint; {9 M7 L' l. X
    导入相关库9 V* R. d! }3 O; i4 \# Y
    2 ~$ Z! i5 k2 d7 }: e
    requests库用于发起网页请求,获取网页中的源代码;
    # N( k+ V$ y& a9 d( B, a( S: u
    . F( T, y7 M: v* y6 \+ C* @! Kpandas库用于存储和读取获取到的信息;
    / x7 T! J  g2 E* G( A  T1 p( O6 [* Q" m) u( Y5 A7 ]
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    2 A/ [3 h: w6 u
    0 E9 A( }! z0 m0 ]% \% V6 r4 Rurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    0 b+ w. [! h2 m+ Idata1 = requests.get(url).json()
    7 x1 F/ l, |5 V7 |9 e: N8 j+ [# pprint(data1)6 _# }7 a6 p& C6 _

    + C. f; P% Z) f6 X  ^这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。/ z% I; q9 o: p
    df1 = pd.DataFrame()8 J5 t/ N8 E: x/ ]: M+ l# L
    for info in data1['body']['allMedalData']:- w0 k, A3 ^/ j0 T
        name = info['countryName']
    1 c. b5 s' i8 x. u5 ~' l8 V- i8 B* E    name_id = info['countryId']
    9 o& q* Z4 X4 Q9 d6 T    rank = info['rank']! i$ P9 H# b, U, O4 o
        gold = info['goldMedalNum']
    7 a4 ^% u+ a3 r5 P8 x, j- R1 ^    silver = info['silverMedalNum']
    ' }9 M  e: e) J/ W6 I3 |& L5 k  R    bronze = info['bronzeMedalNum']
    , n" d- ^: r: Q3 Q8 J. T- {0 b/ E    total = info['totalMedalNum']  E- f7 f7 x4 c: Q. z
        # 组织数据
    ( L; C. E9 |1 }    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    , r! A2 _# f/ k) K    # 然后追加df7 u% e, [- o" i! p2 s$ L" ^3 ~
        df1 = df1.append(orangized_data)( N5 \) ?4 `1 U/ e& g' U% q$ }
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    8 _7 [" B" x1 G1 Y! h" E9 Q" Ndf1+ I& {$ n7 t4 W/ @

    / F" r" Q1 T* P3 c# H2 H$ q3 n2 e* T
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。, ]3 r1 x' I6 D+ k7 F/ F& W
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    5 K6 r4 q2 U  {! u; U# _data2 = requests.get(url).json()- W- j2 j1 o8 f9 d6 e/ M
    #pprint(data2)
      S  K$ U/ [# t( |" T3 o: J4 q+ ^6 l0 f* \. N
    df2 = pd.DataFrame()! [: m* m' R( ^* D8 [% B  @
    for info in data2['body']['medalTableDetail']:- f2 V( I. q. r9 H
        english_name = info['countryName']
    6 k2 `& Z" ]. a2 G" y$ ]% \4 @    name_id = info['countryId']% _, G. n  K* m5 B0 ?
        award_time = info['awardTime']
      F3 w: i9 e" I    item_name = info['bigItemName']
    . z1 ~0 }; ]5 [9 q: i9 B+ y" @, w( j    sports_name = info['sportsName']) N2 b! ^- p9 A/ M# @
        medal_type = info['medalType']  F0 ^) Q& z9 C! y
        # 组织数据
    ! M; c8 X8 w( O2 m( x' @    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    2 l, a+ L6 Y6 g    # 然后追加df& r+ E- l' u+ `3 r7 d2 P, A
        df2 = df2.append(orangized_data)
    # r3 \* H/ s  W9 N) [df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']: ^' t9 C" S6 ~3 U9 j6 f1 H! f
    df2
    ' L( ]9 R) e. J2 _, R7 E5 u5 d7 q5 V* t% D
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    7 m0 y, K: g$ H1 ?( q6 S) w
    / {$ y, q2 |! q  N: Y/ R( W
    - d# s/ A9 ^% ~二、数据预处理# N/ a+ c" I$ O. @# U* E
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。. y/ a+ s* g/ m& k! }
    4 g! a/ M5 t7 h4 p" ]$ E
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ( }! A4 H2 R8 p- I8 a/ }    x = f.read()3 V, {$ Q* j( C* a, R

    ) t9 k; u' K' |# [) D8 J& t7 Qdf3 = pd.DataFrame()3 U2 X9 A7 D. B5 ?
    for i in x.split("\n"):4 M+ k& h5 {% d/ }$ M
        x = i.split(":")[0].strip()
    2 }, T# l& D0 M% z% p8 _    y = i.split(":")[1].strip()
    & _, z/ ^8 @+ z! d2 p    orangined_data = [[x,y]]
    4 }* D& \, h8 f# c9 o0 i    df3 = df3.append(orangined_data)
    7 C% S/ ?& m/ G) f! y2 w' \6 Z0 i- Ydf3.columns = ["名称","英文名称"]
    " R7 D! z0 V/ g. Mdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)) z: a& p1 Y6 ~) ~4 \% C" H$ a
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    7 Q" d, x* r  ~& R9 H4 F
    1 B/ G: R. D3 ?8 l: Vdf4 = pd.merge(df1,df3,on="名称",how="left")
    1 d- P" v: Y9 g0 r' Ndf4.head(10)
    / F) W6 I+ |2 ?& T  r& ]5 W
    3 J/ w* q- v7 V  @: W4 |
    ! s6 @% w! A$ t3 b

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

    • : U6 J9 d7 X5 t: W: K" T
      2 v: X5 h& J/ Z+ D
      0 U( l' y3 a3 Y$ t: V) [
    5 c+ s$ D- i/ r' x( \

      l, d2 X. |3 c+ d3 e/ k6 K
    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, 2025-9-18 05:59 , Processed in 1.143876 second(s), 55 queries .

    回顶部