QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    - W3 Z: v" P6 }; Y) B  x! z) ^0 v! K
    文章目录
    $ ~) M* E. D6 ]* c" o5 [7 i, j8 ^9 {& D3 _0 p2 M$ p$ D
    前言
    ' |9 K9 x0 t4 k% {& m- G% z
    6 s9 l7 k- p5 U( u! u一、数据爬取4 [+ f* S7 p5 q: p

    0 a/ }9 W# O1 K  ~二、数据预处理: o0 ~' w8 z9 Y, L- n
    & r6 M8 k* _8 g6 i- y% S7 q
    ​前言
    1 j" `/ Y- i7 T& {9 D本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。0 A2 }. j1 o  w/ e. T+ f

    / s7 H* W9 F3 D# W6 t
    ! T; A& i- a5 F* f, t* q' w一、数据爬取1 i) J" O# a: z( @- d/ C3 k1 Y
    import requests8 ~: T5 X" q' ?$ r5 q- H4 m/ I" V' A
    import pandas as pd2 W  q" M+ g7 n+ W4 g. I
    from pprint import pprint
    # @! k6 H4 }* z4 `( y( {导入相关库: y, m% ?, G8 ]2 b7 ~. s

    . o$ }" Z4 k; `& q; G+ z- N% rrequests库用于发起网页请求,获取网页中的源代码;+ P  ~& m( k! N
    ; z6 @) r: r5 {% l* K
    pandas库用于存储和读取获取到的信息;: b/ }" L! K7 P. i5 y0 o, ~
    4 x( \) @" p& `
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    # X/ l& j/ Z  `# }- G0 ~, n, w& _! @# F* C8 T! G
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'& t& B+ [/ I9 E# p) |7 |& r4 E- m
    data1 = requests.get(url).json()
    * t6 a: e" T- a& E( Y1 g( j) E# pprint(data1); P, _  ~% b* D. Z7 K5 [# ~$ y
    ; j: q3 S/ E( l& }+ r' _
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    6 n# x- s4 q. r1 H+ G1 \df1 = pd.DataFrame()
    5 T4 P! g: c1 O" e0 Y- d6 bfor info in data1['body']['allMedalData']:
      w: E4 A# Z7 j9 I- p8 o* S    name = info['countryName']
    # d: v, T; u! p' [' w, l9 ~. D+ Z    name_id = info['countryId']
    7 S9 u- m& e/ N/ i3 ]8 A' I: b    rank = info['rank']9 @2 I; u+ X; I" Y! T
        gold = info['goldMedalNum']
    8 u3 j, H- W- I6 v    silver = info['silverMedalNum']  I; y2 \" w+ S" j
        bronze = info['bronzeMedalNum']' A) t( o4 F- O3 u* t5 {4 e
        total = info['totalMedalNum']
    / p( D" }% M; W# ]2 Q4 f  q) w    # 组织数据" V* U0 t% p0 U" M7 `* A
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    : y' Z1 w) R5 ^2 O0 e2 Y6 I    # 然后追加df+ V/ w" n& x4 P$ i  K% w
        df1 = df1.append(orangized_data)- y3 I, |0 v- I- i5 ^
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    + \5 ?6 ]% q$ Jdf1; y1 R+ l- J& x- Z

    9 t5 D1 }. ^3 F$ i0 C9 M
    ; F( s+ j, ~4 L3 k' j- t$ F这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    ' D( k3 h) w. L# }+ D" S9 Xurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    & A) R! `5 \5 k- \1 V) Hdata2 = requests.get(url).json()7 |2 D1 {, w& G2 c
    #pprint(data2)
    . a2 h. l3 E1 b) H7 W" U9 z4 n8 ]: K6 b2 y. G* P1 Q! o
    df2 = pd.DataFrame()* y' z% z+ p9 r& r) z6 j
    for info in data2['body']['medalTableDetail']:0 k& P' r5 X* v1 t6 z( t1 N3 s1 x/ J6 ^- Q
        english_name = info['countryName']$ h  R4 n: c4 n; b. \
        name_id = info['countryId']( W# ^% p! t9 J; M
        award_time = info['awardTime']) U! q* F1 L3 u: d. z) I& F1 ]% h
        item_name = info['bigItemName']
    . t1 g7 z" P2 d& U2 {    sports_name = info['sportsName'], T( a2 y8 }! F) p7 D- p% _
        medal_type = info['medalType']
    : b, t3 G' P$ ~  s6 t' A    # 组织数据
    ! }7 b5 g9 @7 F6 I# R    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    & s  j2 f6 Y+ Q' r# y    # 然后追加df  Z0 Z4 _8 }, E/ U! |
        df2 = df2.append(orangized_data)& X/ x" u$ M* o9 _; A- g& A1 S' ?
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
      [4 K+ Y" q/ `df2! s) @5 I+ Q' D& A
    % E0 \* l2 G0 I! |7 p- c) J
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    * ?2 [5 }' I! H3 w1 ?1 P2 ^4 l3 K4 m9 S7 m% b% s; w- c

    6 r- b$ g3 h$ Y9 r2 I: F4 D二、数据预处理; n  N. f% h- u% [1 m
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。- a, G4 a7 s4 Y

      \) ?  t# G+ `, gwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    * P! k8 E6 n* U( r; g    x = f.read()
    " N9 X/ ]# L5 y$ E& z/ c5 R' {
    7 w1 _: r. f" h6 H) Odf3 = pd.DataFrame()
    , o* ~, j; w) h" W' }% dfor i in x.split("\n"):& F# s) m- [/ B5 |% T7 `
        x = i.split(":")[0].strip()
    ) ]3 I% Z% e, g    y = i.split(":")[1].strip()
    / u1 }% J; b( A) N; O. ~) m    orangined_data = [[x,y]]; z& R+ i, `1 E2 x6 c2 t  k
        df3 = df3.append(orangined_data). `7 J& |/ w* ~- U0 M
    df3.columns = ["名称","英文名称"]% R& Q# Z: f  H; ]; l
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)1 n/ ?; ?2 z3 |3 s
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。$ T+ O3 t( j3 u" @/ K/ F$ _' h

    , \* O% B) J3 h0 kdf4 = pd.merge(df1,df3,on="名称",how="left")
    " o, o2 M0 ~: |# Idf4.head(10)
    / @8 i; |& N4 ?* H" G, `; r/ k$ Y0 z5 G: c3 I
    # n* d' w3 z2 `- @

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

    • 1 i* ]( H3 u6 |7 A: r- |

      8 k, ?- [; |3 @* g# i
      # r! C- `. M& H& i
    4 x4 a% v( {- |$ h9 m
    ! \5 l4 _: R0 b; s; m
    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-17 17:14 , Processed in 0.343921 second(s), 56 queries .

    回顶部