QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    目录
    + c1 U& |4 v  {& Y
    9 `- f& T, g1 [5 F% q文章目录3 }$ A4 `# D0 a$ i. b" t. x8 ^
    8 K' s, A5 n0 o  I8 X5 X9 C
    前言6 Q/ u! b) k$ _8 O4 W& [& k" B

    % }8 c/ x' V2 @0 I& ^: D4 E: M一、数据爬取! T9 n8 @( ~6 B2 F- C; s
    ) f; L6 p. v7 b) y- Y
    二、数据预处理
    ) l; ?8 p& r2 `8 q$ M9 `
    ' J4 h/ B, x! K0 W6 [​前言4 [1 U0 I: r. ?1 z" k' T
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。+ I0 P9 L$ W1 u0 j. e  h, G

    1 w' x6 n* e. h7 j, |; E4 e( F# |+ d8 P4 Y2 j0 Q
    一、数据爬取; Q+ }- s; p; b. M3 ?7 n) J
    import requests3 b. w, y4 o2 _* ]3 |# T) V3 v8 O: e1 E
    import pandas as pd
    2 o4 _: O: S+ R& }4 O. R  W7 e; s4 bfrom pprint import pprint
    , q. d+ }  j9 l6 j5 Z+ z/ y导入相关库4 \! l9 u4 a5 n  A0 q# L  r8 v0 [
    ' p" T" q# z  F, j
    requests库用于发起网页请求,获取网页中的源代码;
    & E2 Y- L. X; c! W, Y2 Y. Q/ F( e7 o4 t6 R$ R' C
    pandas库用于存储和读取获取到的信息;+ h1 Q1 ^& M- r. D+ L
    ' @+ ?% L2 O8 K! `
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;5 I  R( ^8 ]* z+ g" {; e# @
    * r+ H2 @5 e& e% o+ ~$ ^6 R% D
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    1 g, e1 G: y5 a+ I$ ^data1 = requests.get(url).json()' c1 h% u& N( X3 L7 q3 G
    # pprint(data1)
    - z: |- l% y2 Q, P9 W. l$ o4 c
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    , y5 h: S, d3 \5 t, M' C3 ddf1 = pd.DataFrame()3 X1 j4 o- }! z* J. f$ D
    for info in data1['body']['allMedalData']:
    / r+ n1 \9 Y7 N& j& q    name = info['countryName']
    - i! h. t8 l: P0 Z    name_id = info['countryId']
    : _: l  w; U. m; r* J2 s! a1 X& r    rank = info['rank']
    . ^6 H" e& g5 z0 E2 V    gold = info['goldMedalNum']
      }2 N: Q: D; u* W) F+ m    silver = info['silverMedalNum']5 R  r& G: u/ `( N2 x, z
        bronze = info['bronzeMedalNum']- j1 X0 `1 L4 W. E9 A8 B0 T2 E# g0 V( p
        total = info['totalMedalNum']. W7 E( T" o! j2 B4 \) x
        # 组织数据* j$ i! p; K7 ?! a; x) _* P
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]. F0 [$ O6 l- s( [3 |
        # 然后追加df
    ' c+ x4 s$ D8 N( v* i    df1 = df1.append(orangized_data)4 M, M- Z! l. t- F
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']$ Q5 ?: V  Q  c
    df10 H' |, _' x7 p! Z% ]. M) g' F

    1 w7 K8 h/ _" k4 A/ M( B- J& e  e9 p( M% G5 ^; @) w
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    ) p3 N6 t& H3 \5 Q5 kurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'4 o; l2 v+ k# V* t; |
    data2 = requests.get(url).json()7 W2 h% Q2 d8 L2 L0 L
    #pprint(data2)
    9 ~2 V: s: ^# M0 ~
    : ?; F2 S5 q" C7 X5 b0 ~df2 = pd.DataFrame()
    $ S% J; k$ S1 G3 n3 G9 H/ ?$ pfor info in data2['body']['medalTableDetail']:
      g/ Y8 \5 }& W5 w  P' i0 u" d    english_name = info['countryName']2 |  y8 H% T  y( I( G7 |
        name_id = info['countryId']
    * E' [7 Y6 a/ }8 [0 h/ \    award_time = info['awardTime']* R' t- E' s/ l# k4 B. X, P
        item_name = info['bigItemName']. q! p9 N/ m- y% ?0 P. I: o
        sports_name = info['sportsName']) ~- d) C+ n) ?" H5 S! K2 s5 x
        medal_type = info['medalType']: }) ^6 T6 _" c
        # 组织数据
    - `* A$ t: b# s% J- c: }, P) ~7 y# h    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]+ W  M. f9 c/ h  _9 P
        # 然后追加df8 s* e/ {2 t; e' ^; x  ^" X8 d
        df2 = df2.append(orangized_data)
    " V, u, O, _% V  f  idf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    4 x6 r: \( y- ^4 k8 b7 x' Zdf2
    & A5 N; m4 P- @" w: G; q; l, x
    " V1 k- d5 X+ d对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 0 l2 Z4 Z5 b! e. @* G) P1 \
    ; H: |3 n* f7 ]" Z8 B3 @6 \, e

    9 k6 _! j& m8 h% }% X二、数据预处理
    2 {  t  ]2 Q5 ~% T由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。: t" Q( F9 m# e  s
    1 p1 l/ q! I' Y8 j; G- O
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    " P7 b9 T/ l/ W5 X6 @9 X1 t    x = f.read()
    $ O) t: w0 @3 V& N& {# d: z6 K' x. W4 H7 d) S3 x
    df3 = pd.DataFrame()% m8 c" H1 y2 G5 ?% g7 P
    for i in x.split("\n"):. j0 B. _( k' ?8 X2 A4 f4 {! R' T
        x = i.split(":")[0].strip()
    8 L6 M% u; z# t( a9 @    y = i.split(":")[1].strip()
    , ~, w6 ], y/ q, A+ p: ]* t    orangined_data = [[x,y]]
    $ h, V, E2 A9 d  o    df3 = df3.append(orangined_data)6 ~4 ]) w8 d  X# w  h
    df3.columns = ["名称","英文名称"]
    ; ]3 q# l# Y. A4 Q7 Z5 X2 wdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    " S7 N# @9 F' W/ T表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。% X9 E8 v, }  k, e- t
    # Q" j, j5 g0 a% `# T  j
    df4 = pd.merge(df1,df3,on="名称",how="left")
    ' [- g' _( c+ |/ f: M4 {0 I; {& j' \+ Ndf4.head(10)) v2 Z  @$ |2 g5 u

    # u- b. r4 c' B% i! I( W) H5 J' }) V$ s2 B: k3 S& b

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

    • + P+ z7 h' D2 f5 c; e
      & u9 y  u: v4 }2 [

      4 Q* _& f! I# z$ R
      B. }, j8 S1 X, s

    " U3 s! F; F" ?$ a# U" O9 a4 H; Q
    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-9-2 06:25 , Processed in 0.462998 second(s), 57 queries .

    回顶部