QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    ; o" n. n( D7 m; n2 R; J
    & M, y8 V' x9 {6 `6 {; N( ~8 J文章目录
    # r, _  M# `5 M5 y# e
    5 [/ g2 a9 {4 s* {前言
    2 a1 s' W$ y2 }  `6 R3 B# `7 S: c  c/ ^$ @& c' G6 L
    一、数据爬取4 E* i1 a  ]! ?2 p7 }3 M; Z% V, ^; }% c

      i* ~2 X  k/ ?1 \二、数据预处理1 {1 L% q* ~6 r) O3 F$ e

    7 }' a/ e$ P# H6 h" C​前言
    5 W: S) M3 J8 \本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    ) q/ _7 u1 L" C# w5 G) K5 K/ I  Y7 s- X  |2 Y( a3 y

    ) f4 I7 T7 L, e% I! i* O一、数据爬取. \& M2 V" L, J! \2 o- k
    import requests7 `6 K6 R5 u# L- _
    import pandas as pd
    4 i+ Q! k# q9 @7 K3 p. ffrom pprint import pprint
    7 N/ R- Y1 k/ e6 h, A7 H) N导入相关库
    # n9 d3 T7 j" ~
    2 }/ p$ k" E) r2 v+ g9 e) e0 w/ erequests库用于发起网页请求,获取网页中的源代码;
    - K2 c( f1 i2 o. F  m$ ^' N2 |( F
    - _3 R9 `' W; D( I# g, z% tpandas库用于存储和读取获取到的信息;
    3 Y. T5 S& P5 N3 u% r! \
    2 L0 s. d) L0 B( p. Ppprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;' N; }, H& f! ^, i  d
    * W. W( N, A( |9 c4 I
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    1 T4 w# D/ T" Ydata1 = requests.get(url).json()
    3 x. M" x& G! e' R% K# pprint(data1). I" M" @0 }& I# Y9 j

    . D  R# L/ L+ u% a6 u( ~这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    2 [+ Y" G- M# ]# |( X( odf1 = pd.DataFrame()0 i8 O2 Z/ ~+ T" V) r
    for info in data1['body']['allMedalData']:
    . M* \7 e* r- |6 p    name = info['countryName']
    ! i* y3 @  N3 x8 Q1 S; E2 D    name_id = info['countryId']
    # S' ?; M8 H( E    rank = info['rank'], o4 N! E; y  Y. n
        gold = info['goldMedalNum']
    * x5 W2 R5 b4 \7 [5 M4 J    silver = info['silverMedalNum']1 ^, y: Z/ z5 [( D
        bronze = info['bronzeMedalNum']
    8 H4 O; p' W% F8 f  `" w* j    total = info['totalMedalNum']
    9 B8 w+ d7 F: P* u$ z    # 组织数据
    . I9 j) \7 E' {1 f    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    1 U0 H# T9 ?& \3 o    # 然后追加df
    4 Z" W  w+ j' l, w2 D0 b7 s3 }    df1 = df1.append(orangized_data)
    + n2 V9 k4 Q$ i7 Q5 V: A4 Y. Sdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    : f/ P" U5 k# L6 u2 b" }! `df1" R7 P, w) e- t3 t* ?! v' r) l/ t

    0 a. j/ Q7 a) l/ V% |; n2 E, w
    ; `. A- }/ R! n. W4 a2 J+ \' h! g& }8 W这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。2 D3 L: Y4 i2 a, T
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'1 J7 |. U* A# M: k2 Z
    data2 = requests.get(url).json()3 w" ~! p5 \" l( J" V8 {
    #pprint(data2)" S2 ?# h4 ~( r) z; p' `/ }1 b' c$ N
    # T) n' K2 A* w* I6 d7 L( P! h
    df2 = pd.DataFrame()
    % o- ^8 l! C. V0 Y. d) B$ _for info in data2['body']['medalTableDetail']:
    * ^+ D1 F4 W  d, N* z( B    english_name = info['countryName']4 J, N( N0 p! f5 [, x
        name_id = info['countryId']
    8 ]7 d9 A( l: ]& U+ k# T    award_time = info['awardTime']  x' n% M6 L1 d) W7 E
        item_name = info['bigItemName']' Y+ R8 Q, u' _. _7 |. q' z( a
        sports_name = info['sportsName']
    , b$ z' c5 z5 {8 X5 K    medal_type = info['medalType']
    ( p8 H5 {7 c  T) s* U    # 组织数据
    ( x; J$ V. m9 |7 r    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    ' V4 O2 `( ~$ K+ a    # 然后追加df: @: l) g+ l, t9 M1 z# ]
        df2 = df2.append(orangized_data)1 b0 ^  L& c  J" s
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    * o3 H) A! C2 }. i+ _: ~df25 R$ ?# q. m8 b2 {9 p/ ^

    9 D, a) l- l) i5 p- p5 [对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 4 A9 M$ @7 e; H9 d5 k( `( D) I1 S  ?

    0 u$ L. X& Y. R: q) ~* T$ d" k- h6 u  i6 u+ S. l5 b- f. m% m
    二、数据预处理
    ' p  l# `* j! ^. ~4 _+ n由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。7 A/ O4 Z$ ?! P1 F7 t

    / N+ k5 K' k8 w9 Wwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:# y( R( O2 g6 B7 q
        x = f.read()3 m0 R6 u0 q0 r# _6 a8 H% Z& [$ x& }! Q

    ! K5 @8 m: K* m4 Xdf3 = pd.DataFrame()( f# o. @# L% q$ S
    for i in x.split("\n"):8 B% x" F2 L3 J% q
        x = i.split(":")[0].strip()
    - G' ]3 S0 L7 ~3 X6 [    y = i.split(":")[1].strip()' h8 }+ Z  P+ h1 {8 B
        orangined_data = [[x,y]]! f5 g. \; J  S; }3 }
        df3 = df3.append(orangined_data)
    1 c& m9 s" x8 P7 y" O1 Z6 udf3.columns = ["名称","英文名称"]
    # O# o0 ]7 h2 s' r0 Z7 Z; rdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    $ R# @9 M2 k3 e- Q% `) |7 o+ ]/ |表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。, o) o& d/ B  O

    ( }2 t0 `* b; ddf4 = pd.merge(df1,df3,on="名称",how="left")
    + Y8 S4 @/ n" ?/ [1 Zdf4.head(10)7 g, B3 c2 J- T) P: v, z4 e

    9 d3 p% V, t) O1 H) @( u! M, I1 j8 b6 f

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

    • 0 P$ C3 X' N+ _1 ]) ]- r* C4 E

      6 T6 N' i1 s# i& d5 t5 I1 w
      1 c3 T5 x! T. c4 J. Y$ M$ C
    / g' G+ A6 v$ I& A: v
    ; n" M& X' r, D% Y8 I, a
    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 02:40 , Processed in 0.403724 second(s), 55 queries .

    回顶部