QQ登录

只需要一步,快速开始

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

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

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

1158

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录+ w$ B, F8 p5 {+ W2 D+ c
    7 O' e; M2 \1 a7 S3 g' S
    文章目录
    0 _% l+ r. P7 ]* I1 \% K9 \* {0 E- s8 I: Q" r
    前言3 S! z* M* @1 U0 D( p

    ; g! u' G- a- N6 |" d% {: y' j一、数据爬取
    & x% R, p, G  [/ t/ R9 L- K$ T: k$ M- r
    二、数据预处理$ q2 v5 c& e1 u* O1 b* `% m

    : _" l: }/ |) {) v( B% P% M7 B6 x​前言7 }3 c/ V+ Q8 U/ n0 M- i
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    * Q4 D1 q" `) ?$ O0 U6 x5 S) O4 x4 L( [' y
    ' U, N+ D2 {- J  I
    一、数据爬取
      E/ m5 t1 ^6 e1 D8 M6 Jimport requests0 |8 S8 I, {% \2 {# Q1 K
    import pandas as pd
    9 V/ p' C: c& {9 t  F1 Ffrom pprint import pprint
    7 r8 N3 |) l" Z7 e, R导入相关库: w; q8 m; p! h1 j/ f/ i, r/ z

    " c. K6 b0 N; F  F* ]. I; srequests库用于发起网页请求,获取网页中的源代码;
    & H8 I; B' e  `* A. ]% m0 D% H9 C2 i
    pandas库用于存储和读取获取到的信息;
    ! k/ d5 H/ u; z3 ^, m- A4 e. C- w! q5 R" D7 j
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;+ r1 n, G" @( T% ]5 `2 W! k

    ; t4 O9 h' C& R6 {  d: H9 H7 hurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    & s' m; w, u$ g4 {4 g; k5 g: kdata1 = requests.get(url).json()
    7 P8 a5 r. e1 I' b( B2 c# pprint(data1)
    5 y$ Q' W5 E. |/ D+ E
    : v) C1 `& p5 e, v; g3 x这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    2 L; \1 z4 O1 l7 O2 ^df1 = pd.DataFrame()
    5 T. z* @+ R1 r7 Q8 _/ g/ Z% D' B) Ofor info in data1['body']['allMedalData']:+ r6 Z5 I1 N7 g- U# U' u) U
        name = info['countryName']6 D. j7 V' m! B3 G9 ^1 o
        name_id = info['countryId']$ W' w% O! K) Z4 Y8 A, T
        rank = info['rank']
    , q$ r& c5 c4 _+ G# s    gold = info['goldMedalNum']# @. K. v% @" G8 h' n
        silver = info['silverMedalNum']" {4 y5 h% C1 y' v7 B
        bronze = info['bronzeMedalNum']6 {7 S2 s+ [+ }, r7 D
        total = info['totalMedalNum']
    . g9 X: N. M6 Z' ?    # 组织数据
    1 }5 I& c% r- z" @# j5 D0 E5 m    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]6 o* e; a" L4 }: ?
        # 然后追加df
      A/ \" ~/ R; A6 d: b+ G6 d    df1 = df1.append(orangized_data)
    # }( S9 w9 F8 ddf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']  v. R. g- V& x4 l
    df1
    ( c2 V; w9 e. g/ h$ |( z" R! ~  X$ P, i9 c- O7 q
    5 i6 O" P1 P0 [0 ^1 i3 n* s
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。2 L' |7 ]: @7 c6 h. J% N
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    * j& Q  [( E5 ?) A5 Z- @% q5 ^data2 = requests.get(url).json()
    0 B6 m; c- [7 r, B. L9 z; }. v#pprint(data2)
    6 ]' R2 J6 E! t0 z" q$ T: w3 y' \
    2 M) E" i* \! g' U5 }df2 = pd.DataFrame()
      [0 u# h& w+ z* ~4 Pfor info in data2['body']['medalTableDetail']:5 C3 X" F" O' k$ a* a
        english_name = info['countryName']  v; {& k) z9 [+ B; R( T: q0 p; B
        name_id = info['countryId']
    ; v5 D5 K$ e' m8 A7 B# g    award_time = info['awardTime']5 X: `  R% Y8 {  y3 h
        item_name = info['bigItemName']
    ( y. M9 B" |; z3 |9 A& T# g    sports_name = info['sportsName']5 [; B* \- ]" y( B/ y3 U
        medal_type = info['medalType']2 |* H) a5 H3 c. W
        # 组织数据
    4 p% m' a: Z/ H0 O& z    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    3 D- L4 I4 |6 s5 q+ Z* @5 n! ?    # 然后追加df
    , Q9 h) g4 S9 V* N( k9 n5 I    df2 = df2.append(orangized_data)! e* Q2 n3 ]7 z% `# [+ J2 T# g
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']) E& U; D3 o0 e# a, @5 y1 N1 e+ R
    df2
    ' H8 f' h7 p3 i  |
    + u) x# m" {, D对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 8 l; E# H; x! t
    9 A# a6 w8 |/ M& g7 G

    1 ], G' D+ o+ M! R, F  v二、数据预处理
    : G/ s( k5 [+ a5 j/ I( ]0 ^由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。& r& A& R: k9 ^( J. a
    ( I: s8 I: ]' |$ f  |
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    + i8 i9 G! C% e2 m3 Z    x = f.read()0 }) f! ^8 \8 O# V  q

    4 o9 T4 u  n. Q  [8 t7 vdf3 = pd.DataFrame()6 v0 ^" o4 e" K0 a- q; N
    for i in x.split("\n"):6 z% z) k- P& W
        x = i.split(":")[0].strip()8 u' g4 p9 M) U" w8 L( a
        y = i.split(":")[1].strip()
    / v( p9 V1 C% k$ h    orangined_data = [[x,y]]
    - `$ ~9 U3 x0 ^4 x6 c9 [    df3 = df3.append(orangined_data)
    . d% m2 p! Z- w. v" o) {df3.columns = ["名称","英文名称"]. H6 l% w9 y* B
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)! K) B$ `, ~' {. P# V  N  y' O6 B
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    2 L. L; V' I/ Z; a" h* z! G9 \2 \# e2 r8 y
    df4 = pd.merge(df1,df3,on="名称",how="left")$ U3 [# m1 E2 E8 f
    df4.head(10)1 V! J' o8 Q) W( D1 c6 `+ T

    / ?7 @# Q7 N$ v, X! {6 g7 {' e, c' J' @0 k! ?6 h

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


    • # C: j" h! N- S( G6 m) x
      9 D- {( p0 s! v5 o3 y/ Y

      9 ^. |3 A$ N' \" e$ e
    9 P+ q' \- h" z0 Z+ h5 N3 B* d/ n
    8 R% a" W- J. z7 B) 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, 2024-4-20 06:45 , Processed in 0.300276 second(s), 55 queries .

    回顶部