QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    9 Q1 r: _% G; @
    ; g' M  o3 D; g' Z( n; n, P' s8 h文章目录
    8 I3 T3 _/ G. J+ G6 y+ Z2 k6 e: i# k
    前言
    5 W+ u4 Q& f0 P4 O" C% G9 K/ s
    3 P7 ^! I( d, W9 \. Y一、数据爬取
    ( Y5 s3 B" m" {6 P* u
    7 D# x2 d2 [# v  S- w' U. I二、数据预处理
    9 T6 T: p' H% T% i, ?7 }( e5 U! ~) ?) w/ \2 n; O
    ​前言5 C2 C  m+ Q% r/ u( R! G
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。' a8 h* I6 l) b! o
    % Y1 G4 I$ S6 C# w

    ' p1 M! i% |+ f$ @& K# F. C一、数据爬取1 R6 [, K  t2 ~7 B- i8 s. Z
    import requests
    ( f3 t0 N7 S4 \" s* R! F0 Qimport pandas as pd. v" X7 b7 T( Y+ k& l( @9 m
    from pprint import pprint
    6 t8 o+ i0 U5 v4 J导入相关库
    8 Q- D8 l+ N# a' _/ ]& L" Q( V8 Q, t0 {/ E5 ~. K* w" w, }
    requests库用于发起网页请求,获取网页中的源代码;
    , F/ W9 z8 @7 a+ }: C* O, ?: _, t$ {
    pandas库用于存储和读取获取到的信息;
    - w$ m  B5 ^/ d, g9 [
    % {4 v0 o* W0 a" Y( K8 k) p7 epprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    % b+ |5 g* s6 A7 y* ^) ~) d; V- t' e6 P, V: k
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! D" [) ~, T, P2 e& X: S$ p0 V
    data1 = requests.get(url).json()
    + d2 u! R& i/ m+ s3 m' \# pprint(data1)+ P6 T+ i, x( l

    2 e; r" w+ [( s+ Z, z这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    0 s; H9 X) I# y# Q  `! f" Qdf1 = pd.DataFrame()
    / c8 m! p5 R: k5 v/ V7 G4 t4 @* gfor info in data1['body']['allMedalData']:/ c4 t' D7 J( b  _7 a
        name = info['countryName']- ?* m* h4 F2 }/ r
        name_id = info['countryId']
    " e0 s, w/ y  R  X" U) j5 l    rank = info['rank']
    7 g1 J3 c- p, G  t2 |    gold = info['goldMedalNum']
    9 Q, ~- U5 I5 o( T* Z    silver = info['silverMedalNum']
    ( \: n* {9 X" @$ G    bronze = info['bronzeMedalNum']" p% ^& R4 o" Y' h" \- ~" g
        total = info['totalMedalNum']8 c' q0 z1 |2 q2 z
        # 组织数据
    / f# U% f, G5 Z% H! D" g) Q# F    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]) B- I: A8 P( H3 G; ~
        # 然后追加df
    5 O$ T( |9 o& x) l# j- _    df1 = df1.append(orangized_data)  k& L* }, W) }0 C/ J! E9 q3 u
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    ) l5 Z; y: i) K& ^+ }df1+ W2 X6 L! P) ]
    0 s+ I4 y5 C. P( i* u

    6 l1 X$ L, l$ y+ C9 T& D& E) S& W这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
      l# m9 B5 {( W. E6 ]  surl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    ' X2 h" h2 B) V- |3 [data2 = requests.get(url).json()
    : v+ A6 E9 r7 @. F& f0 q# \: F#pprint(data2)
    / {1 _8 g5 s$ X/ L5 K8 x% g! A* |/ J7 H- C5 c  U( }
    df2 = pd.DataFrame()
    ; f" E% D$ f, q2 b# N+ z( Mfor info in data2['body']['medalTableDetail']:
    4 m7 g( K! O9 ]3 Q; \  e    english_name = info['countryName']
    ! Y) m$ v  i! S5 \. h! b- ~5 I    name_id = info['countryId']6 Z' R, G; d' h& y5 B
        award_time = info['awardTime']
    * X# U  v( K8 q$ m, i" d# h* |    item_name = info['bigItemName']* n& s0 q3 k4 O% |
        sports_name = info['sportsName']% o: i. O$ D! j, T# C% G. _
        medal_type = info['medalType']
    ; |/ o/ a+ H$ Z; G: }, P" W1 Q0 j    # 组织数据" s6 y! g) k# _8 K
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    ( A3 k+ _; Y: `, W    # 然后追加df* E0 L! P" {9 g. ?
        df2 = df2.append(orangized_data)
    2 l& B  J) ], z4 Qdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% ?1 D+ A/ O& O6 h! O9 k
    df2
    - a  B9 B5 c3 a0 u6 `: y4 C; r1 f; I. R. [+ b$ j, O( W6 A
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 ) Z# A8 L2 U+ B; Y/ m( F# V
    % P* ^- I& m; N' `6 y; ~

    ; E6 e, D1 d( H* k二、数据预处理9 A$ F6 {6 @0 ^) ~5 P2 x$ m2 F
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    " x/ \+ r8 g5 K% L9 B/ U* Z6 r. v4 ]0 a* b; ]$ ~: X1 ?
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ; ~: N6 E9 H# @  j    x = f.read()& i) d) i& S' J% r
    2 n3 v) z0 {4 ?- J, `# e" D
    df3 = pd.DataFrame()) f! P1 M6 m! z' a
    for i in x.split("\n"):' w# J% d2 p4 W% ]
        x = i.split(":")[0].strip()* c( N* F/ ?, a8 H1 ?* [4 d
        y = i.split(":")[1].strip()
    3 `6 W4 r% U1 y, a    orangined_data = [[x,y]]
    4 S2 v, j: _: I; u& r; y! l0 |    df3 = df3.append(orangined_data)
    6 W. Q' y( h3 S* O6 X: j! y$ M. kdf3.columns = ["名称","英文名称"]7 g% E/ y- c2 N! P5 g3 ~
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    ) J/ l  ~2 x9 x" O# G( k' Z表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    % A! ?* C3 {" {+ K& U$ w, q- j% t) Y5 R/ L. D
    df4 = pd.merge(df1,df3,on="名称",how="left")
      B4 q% c# O1 q, K6 {df4.head(10)
    ' y+ W0 k) Q# n$ a
    " o  q/ @: g$ `# j" L: `2 |- N! u1 s6 t) n$ i1 l' l2 d* i# F$ C

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


    • 3 Z! C' u' _" I) x/ j) G

      % R2 V# T3 U& Z; A' p0 [* u2 i4 E  O: Y& ]6 O6 l" o5 M6 m
    0 k  k7 ~7 r/ a+ v6 ~2 S0 l5 }
    6 Y& ?# D( i5 l5 [% P; ?
    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-8-28 23:24 , Processed in 0.454606 second(s), 56 queries .

    回顶部