QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    + O; x3 x- }* ?2 ]
    3 k2 v6 H- S- L! H( a1 `, A+ i文章目录
    ( q* x, }( t9 C. M" q- M/ r
    + |1 Z& P6 o5 w6 ?7 S' ^2 \前言
    & F% u4 V1 t# y1 j  N) i% n% n# \- \" @
    一、数据爬取8 u/ V4 S3 f9 {. y- j
    + @0 T9 f& s) T  B- c8 S
    二、数据预处理; I) q2 D+ u+ Z8 m& e8 q

    # f* Z% W8 |& ~* ?​前言
    8 c- E* G" e) D本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。* J3 a- J8 f0 x: I/ j  Y: y
    ; [; O/ [: O2 G0 ^# N7 G
    * `& B" p  ^3 J1 J
    一、数据爬取
    5 J% W$ S3 ?* {- A/ Ximport requests1 L" F. l: p0 b5 T8 r# S
    import pandas as pd
    2 _6 C% L/ ]( C+ Hfrom pprint import pprint$ H* S2 |, r! m' {0 P- l
    导入相关库
    ; `6 V. r7 Q& q( H2 P0 z$ i6 a' I8 S' p  n
    requests库用于发起网页请求,获取网页中的源代码;8 S$ a- d+ F6 ?  [) G# R* y* s4 J( F

    # m9 O7 Z9 z& M& Z: Vpandas库用于存储和读取获取到的信息;
      T5 }! b- d% ]+ I  N9 D
    ( O( a+ R! w: o9 u) R) [pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;/ U! Q/ }, t! q) ~3 g/ D% Y
    * \0 d  O. L8 d* e2 n; U/ C  O0 l! i! K
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! W8 \& G6 L. e) O* i/ `/ x! {( l
    data1 = requests.get(url).json()
    + x& i7 I3 J% P  |- Q# pprint(data1)0 w4 G! A  E8 R
    $ X) i: R* J5 _
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    $ b/ n% ?3 @; p/ I. [df1 = pd.DataFrame()4 |, A. k; U+ D( K# E
    for info in data1['body']['allMedalData']:
    0 j/ e: ^4 `7 G8 x    name = info['countryName']% J. m( Q! m% I
        name_id = info['countryId']
    3 m4 P$ j  \( D    rank = info['rank']
    5 ~5 i+ `" {/ C    gold = info['goldMedalNum']
    7 J/ v* \- r# \8 ^$ z& w7 i/ C    silver = info['silverMedalNum']1 P4 _7 \0 X  Z
        bronze = info['bronzeMedalNum']+ j. {3 O4 W3 i9 L% r
        total = info['totalMedalNum']
    " L+ ^5 @" Z& Y    # 组织数据- n+ s; F+ R' x8 i5 |
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]9 S9 B8 i. k! H6 I3 r* A
        # 然后追加df# K0 k0 s% B( l4 Z( M6 d9 R$ y
        df1 = df1.append(orangized_data)
    , t" V* p  w$ c5 e- Tdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    5 s1 B/ \! A! |# ^! M  \df15 I6 F( l$ _. D
      {( n) u# y( [% N$ r7 Q) Q
    6 K% J3 n, A  X' C4 e$ f% e
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    5 {* A4 X# [* x0 D) Burl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'7 `' n# v7 g" M+ L3 T' @+ F
    data2 = requests.get(url).json()3 ?+ g/ I9 ]/ x2 f: p  d! y
    #pprint(data2)% C/ R+ X3 s9 I# Q

    ( m# B. I+ f4 l6 J) }df2 = pd.DataFrame(), I- {, d" \) Q! b" J: j3 w- v- [
    for info in data2['body']['medalTableDetail']:
    ) [2 \* i/ m  ^5 q    english_name = info['countryName']
    2 @& j* {6 l1 b7 M    name_id = info['countryId']
    3 V* F" F8 l' |/ |  X" u6 E# Q    award_time = info['awardTime']* o/ ?2 _/ Q* ~" W1 z7 {
        item_name = info['bigItemName']
    4 n, q4 ]) w  D3 o$ z' u    sports_name = info['sportsName']
    , c; B7 }' L4 e& g6 X9 ~    medal_type = info['medalType']9 K" m- M" S% d, C
        # 组织数据
    / P, f2 I1 E* H5 z  j$ M7 U    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    ' T- e/ W. C  ~! {6 m- W    # 然后追加df
    5 S: J" R# c4 ~5 b3 M( D% B0 `9 E    df2 = df2.append(orangized_data)* f3 U9 @/ s9 L
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% [2 P  K/ `; v: V& {. w9 g! o
    df2
    9 M9 f+ n: {$ m9 R( }9 _) m8 Z/ ]: g
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 , t! p0 d3 _4 u! i+ w. K
    5 G% L& t+ `1 k: x
      v9 r9 M3 ^: s, |' v2 P  R
    二、数据预处理
    * h  i8 k+ }: S' o$ _2 ~由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    / q; f5 l* ]" d0 R+ s" o) c5 U' ~6 b8 O7 E! C
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    0 e( U2 h# t- S5 {. ]6 |    x = f.read()
    9 q) N- p. ?$ y$ n6 }/ a; c
    & a8 j- l# e+ M2 Gdf3 = pd.DataFrame(), k( f; a1 S6 H+ H& A: `4 Z
    for i in x.split("\n"):
    9 G) Q' m' z+ `) J+ b/ b% t* q    x = i.split(":")[0].strip()
    6 {" h7 l+ m5 ^- x    y = i.split(":")[1].strip()
    # ?. C1 {9 {& d$ ?, @    orangined_data = [[x,y]]
    9 l0 q! V: u4 X* l# o1 J) K    df3 = df3.append(orangined_data)3 m- g& w2 g$ D& S' t& ?; T' \
    df3.columns = ["名称","英文名称"]
    $ \7 z. O* O1 F- Q5 q: |df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)0 p! ?3 V- ~) X
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    , @/ z. G! N! c+ f5 t* i! Z
    . s+ y2 V( I3 p; A7 P. Cdf4 = pd.merge(df1,df3,on="名称",how="left")" K3 t% A, @4 k1 Q
    df4.head(10)2 \4 B+ x8 c0 F: Z
    1 @4 [8 J% C; @& O9 X# D9 r

    , X' [& q5 R; ]+ _

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

    • & n, R: M. h  b! U: D
      4 ~  C# J2 y  w7 z7 `

      9 A- ]0 R$ r) |0 t
    5 I! ?6 s3 t/ U4 e5 ?
    1 E( N. q5 h1 b1 J7 O
    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-10-4 09:04 , Processed in 2.057634 second(s), 55 queries .

    回顶部