QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录8 |/ \3 o) V3 K* {* I' r8 c& r
    & b" e" X( B8 c" {; c3 Z
    文章目录- I0 Q3 I2 M9 S8 M$ l& O
      u! W7 t& T8 X2 X. }
    前言
    $ j8 o& ^+ F* J6 A+ k# p
    ( }5 j. R$ g/ d* g) N& s一、数据爬取( s" ~5 c7 \. {! A  E& O# y

    9 V  L- |. M  P/ }4 t& ?二、数据预处理' }! B: \! u$ D
    4 z8 q, k% z4 ^: I+ c/ j
    ​前言4 C) i5 y0 s( J4 m/ i0 z1 `
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。) E3 T; z; q4 y% A, I" ]
    , r% r$ ^$ G( r: |6 i/ `7 c0 |

    2 |7 x, q8 n8 f9 D一、数据爬取
    8 X8 v! ^3 y- _( M( \$ k: N/ P' u6 `import requests1 r( D! c0 q7 k0 m' s% h  g- l. U
    import pandas as pd
      W  \' ?) u" Cfrom pprint import pprint
    ! v2 Y1 t. ]6 p: n导入相关库
    . v. g/ T' _8 \7 r, H( Y: B" h
    requests库用于发起网页请求,获取网页中的源代码;
    , S% K0 G# e+ X# R# z
    ( m# m9 N  [. U. x1 f7 r3 X. N* Opandas库用于存储和读取获取到的信息;
      ]& d/ {4 g( O: C% @
    & t" Z. j6 f" N4 v8 |! E7 I0 Ppprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    4 p" w0 X/ C5 f3 J: Y0 G! w( V
      U6 U" X; M/ z- \' eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    6 m& \8 p# w4 \+ jdata1 = requests.get(url).json(), P! [% B5 a3 o4 V/ L) x
    # pprint(data1)
    $ O3 ^! t9 A1 m% Y1 z5 y9 C4 E/ T' @* q4 u+ Q, b, U" G8 c4 }
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。! a6 S; b5 M0 Z9 ?6 n0 i( K  s
    df1 = pd.DataFrame()
    / c4 |; g0 A9 Xfor info in data1['body']['allMedalData']:
    & L* `5 j+ ^# X! c- X    name = info['countryName']( s+ t5 |/ M& }
        name_id = info['countryId']2 t, j. ^% k: ?) i
        rank = info['rank']
    4 I. j4 l2 s  s' X4 M7 l5 \    gold = info['goldMedalNum']5 u; Y- t9 p6 X% {" x
        silver = info['silverMedalNum']
    5 m4 @0 q. m; P/ f0 m    bronze = info['bronzeMedalNum']. v# \( P+ s, ?- }% F) W
        total = info['totalMedalNum']. ?  X4 v% u" Q$ p! i- X
        # 组织数据
    + M0 Z% m6 m. [% a8 i7 b    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    2 r* y; ^* e3 d8 c( o8 L    # 然后追加df8 O' T) e# j2 d, p. v1 v
        df1 = df1.append(orangized_data)
    1 Z6 ]" o& O) ]1 S& a4 ddf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']2 d3 G/ r; d1 c( v3 f* g4 `
    df1
    % P+ V) ]5 C; N, }8 x; J" `$ z  Y% P& w% g# ~: C0 o( Z
      h9 M. F; P8 t% B1 _) {$ f
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。  }8 B1 Z( d4 I% l" O
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    - N, x) ?1 ]7 Kdata2 = requests.get(url).json()
    4 f: I5 U6 M; |$ K9 h7 o#pprint(data2)
      K) x8 C$ w/ }- P% l- s$ R* g7 n6 r+ b) I3 E. q. @
    df2 = pd.DataFrame()- F5 v1 K3 G* E4 X! T
    for info in data2['body']['medalTableDetail']:3 l2 F& Q+ S. @; G
        english_name = info['countryName']: x% G# \0 Z1 Z
        name_id = info['countryId']3 [7 B& D3 w4 y9 m! D7 t8 M: A
        award_time = info['awardTime']
    3 J+ `- y5 M) E) ^    item_name = info['bigItemName']& h5 S; S: i2 i$ \1 ?4 ~
        sports_name = info['sportsName']
    * [/ J# ?5 \' K- E" |    medal_type = info['medalType'], [/ a8 m7 C, a7 |7 X8 D) z
        # 组织数据
    5 ^6 i3 l; k/ b2 Q  W: T    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]], |7 Z  o: J. j3 E, |" Y
        # 然后追加df
    1 z7 T" Q) h3 Q    df2 = df2.append(orangized_data)! @/ p; ?+ ?2 H, Q+ Q) H' [! G
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']6 \/ a( F9 L( T) L9 }' i, G, d/ \( [3 d' m
    df29 p$ j* L8 r4 t9 q+ p3 j# |- Y

    4 m, {  M% p% o0 i! @9 W3 Y* o对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    7 P5 L6 y' m: D$ \9 e; N3 i) ~" |2 l3 q4 [
    % q  B: ?  d( m) p
    二、数据预处理
    8 L. m8 }/ c3 t$ D4 a. j由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。8 N3 R9 {6 H) D8 G0 m

    ) u* G$ G* }  S* ]4 c# ^# }% I* s% lwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:! f6 g- i0 Z0 @
        x = f.read()
    4 d9 E7 p3 y, x0 R# T7 k1 l
    6 V  W* ?6 f, {  bdf3 = pd.DataFrame()) K( W( M( x" K0 |- {: {2 ]" y
    for i in x.split("\n"):% B5 {& y8 Z4 B/ I7 }5 J* u. O
        x = i.split(":")[0].strip()  n) m$ z* m2 e
        y = i.split(":")[1].strip()6 P  Z' f5 N% f7 E* Y3 ^! o
        orangined_data = [[x,y]]
    1 w1 M* m& \6 K' o    df3 = df3.append(orangined_data)( D. M( a3 H7 D* B6 E, n( O. A
    df3.columns = ["名称","英文名称"]' g5 q4 x# L9 D- [9 V' g2 `. N
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)1 l9 J4 s3 v- ]  P$ f9 ^
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。$ c$ _$ L5 h! S  f! w

    # S/ @9 [8 b2 l' Q3 g2 j4 Mdf4 = pd.merge(df1,df3,on="名称",how="left")
    " {8 N# [1 k1 }) R7 U" rdf4.head(10)
    ' B  `. `/ B6 G/ E& X1 Z" s* K$ L2 J- n1 q* A/ Y3 S+ X9 _

    , A3 m5 p6 Y- t" U( E" [

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


    • % R" D& z, o9 Q# _0 i6 }) Z

      . Q& t  U0 |$ u. }0 M, U: ]) X7 l4 g+ P

    - Z: n* x4 p" w  `# z' F9 Q9 M" ^7 v- Q2 _- }4 _7 i
    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-12-19 11:20 , Processed in 0.436156 second(s), 56 queries .

    回顶部