QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录+ N6 `+ I6 `- S' w6 P; @
    # ?/ W: Z, k+ F
    文章目录
    1 q* e7 m, c$ M8 v/ z" x
    $ \3 X+ Z* G2 {0 k& V前言
    # R: [  p8 L1 S6 H/ e
    9 B4 p' Y& N8 t; O. W  s: w一、数据爬取
    / a9 M& {0 `5 T$ z. M
    ; u! F; Q/ x! x4 n' g, i二、数据预处理6 j% P  Y9 L8 Z% w1 H
    : U& w. }1 b5 r6 S" E5 ^; p, Z# @
    ​前言
    9 Y) E4 P- r" D- o本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。% v- b; h$ Q& |- ~

    1 g% w+ Y* h7 c7 \+ H* L, ?! u1 k2 l  L& d
    一、数据爬取
    / U' ~. D1 [# k# M' z5 Nimport requests
    6 k9 b% H0 }" W- G0 [: \! Wimport pandas as pd* _/ F+ H, d4 n+ E! T" H
    from pprint import pprint: u/ M$ w* x) R0 M) H" P$ ]0 D
    导入相关库/ G1 U1 o( t" A. r) G6 N( ~
    6 w7 I1 E1 Y: F. Z3 c3 T# w% m4 c
    requests库用于发起网页请求,获取网页中的源代码;/ l' |& q% v5 F$ ?+ l

    8 l) Q4 Y& M% z7 z# {( ^7 T6 \3 l+ ypandas库用于存储和读取获取到的信息;
    0 L' w# z( Q6 s2 n0 V, _2 d/ \, G3 Q" c  l5 e5 s- J
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    ; p. B) t' l5 C- I1 Z$ X: c  a0 O) H3 t, p& ?4 d5 }
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    0 s0 a2 \. f4 V4 X) qdata1 = requests.get(url).json()
    " Z9 h- d" j7 G# pprint(data1)' k$ J7 k; K5 {7 U: F

    - ~7 p7 w6 _2 o5 R这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    5 Y0 V& Y! @) Z; P. @" ldf1 = pd.DataFrame()- w2 T1 I. X, B
    for info in data1['body']['allMedalData']:
    4 m7 B( b1 {( H) q# y% p! T/ p- _    name = info['countryName']7 G- f* k# n3 C$ t6 z, r5 X
        name_id = info['countryId']
    7 w  @0 G9 p8 q9 a1 N    rank = info['rank']
    ) U* q+ \/ m, V: a: v! X5 k    gold = info['goldMedalNum']2 a/ Y" o$ P. ^8 l$ \* N
        silver = info['silverMedalNum']
    - r% v9 Y/ `5 }    bronze = info['bronzeMedalNum']' Y3 k0 A4 k: P4 e# s
        total = info['totalMedalNum']2 k4 K& b: k; l7 @+ |) \
        # 组织数据" z- x) O( r* D! T* I0 X' D
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    ) d5 L) {) Y3 k$ R1 U    # 然后追加df7 @) V. q5 u( f) @
        df1 = df1.append(orangized_data), U+ B" C( t- Q
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    $ F9 m) p+ }5 f0 @) vdf1
    " |4 }2 u+ N3 f3 A: J8 q
    2 I, w- \% Q1 f2 g' y1 q6 Y1 x& n9 c6 F: V; M/ k/ x9 v6 H
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。6 u0 K5 f1 J% V, w: F5 X
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    + [3 U# S; {2 y3 U5 }, A8 Gdata2 = requests.get(url).json()4 G7 B6 C3 u# e
    #pprint(data2)
    ' p- s% d. ~' F& r
    , r/ H, f  m5 ldf2 = pd.DataFrame(): [: w. h! j! P4 m1 T& X: n  `
    for info in data2['body']['medalTableDetail']:
    & H& L7 V' I! c" z* Q4 Q' a+ r    english_name = info['countryName']
    & u9 p0 D- d3 y    name_id = info['countryId']
    " _# d% d8 e1 V    award_time = info['awardTime']) |( d( N/ D5 c% q. ?, e1 ~+ z( Z
        item_name = info['bigItemName']
    2 q- O0 M5 n0 G6 U' p+ t    sports_name = info['sportsName']8 ~# R5 q2 I1 D6 |! n0 ^0 ^
        medal_type = info['medalType']
      Y, D  S0 f; P9 y* f# `& w2 D    # 组织数据
    " n/ }- t3 E* M' }  S! G% ]8 v( C7 o  y    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]! {2 M0 Z) u# `
        # 然后追加df
    $ ?' R, F" V) r! \8 W    df2 = df2.append(orangized_data)  V8 j) b3 H  o3 z: K
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']# @, u- e% O* d6 `) o9 Z) p" Q
    df2
    ( N: }5 X4 A; i
    . G, E* M: {1 G9 I% m  L6 N对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 9 c. a+ y* X  V( u/ V/ \

    ' [. t, s: i7 s. \, @$ W* J) _7 e, L. ?6 E. t
    二、数据预处理0 i  A8 Z/ a; W) h
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。5 y1 H# @1 S& a2 ]8 w1 D) i
    0 T: S6 p6 q  W$ G3 ~
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ' }. r# A% u1 a0 u1 ]    x = f.read()
    * p: G) D- n' ^2 ~% d6 i8 Q. i1 U. |
    - X/ Z  M. D4 ?, V# S7 i0 X8 Y' qdf3 = pd.DataFrame()" \! x3 v# R( G5 w" u
    for i in x.split("\n"):
    9 t3 @( I, n+ d# H! Y& P' K    x = i.split(":")[0].strip()4 r3 G' ]7 K- Y. i8 ]. ^4 O
        y = i.split(":")[1].strip()
    ! V5 P& G# a2 J' e+ x    orangined_data = [[x,y]]
    ' F( c( n7 F4 N5 O! u1 @# W    df3 = df3.append(orangined_data)+ W. A( T0 s/ v8 c9 P4 b
    df3.columns = ["名称","英文名称"]
    % D4 m+ ^9 f+ S2 Q$ K( x  Adf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    " E* d5 e$ n3 |7 i! S) g3 C表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    5 T3 X+ @0 z: `) W1 y8 f% @
    3 ^5 W/ \9 y: [% Z7 @% fdf4 = pd.merge(df1,df3,on="名称",how="left")
    , m1 k, {9 ]; xdf4.head(10)9 O' S, ^% m6 ^, B: ^( C

    ) B1 ?8 ^6 x2 n. e1 t/ U% ~4 L4 j7 k/ H* L

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

    • . b7 Q" I5 I. Z0 y6 @0 F

      + k; X2 s: [( S/ _+ m8 X
      * k; l4 @6 ]: C8 C7 ]) f
    + e0 r" Y# R( i/ a
    : q" C: `+ _: F1 x0 r/ S
    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-11 23:23 , Processed in 0.432060 second(s), 56 queries .

    回顶部