QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    + B: n6 z+ Q% M) ^! j6 V' b& K( b$ ~0 R& l5 k
    文章目录
    * {; m0 g! c% T5 L6 B2 @; Q; T6 k$ T4 w* s! G4 A
    前言  T2 l: N+ y' M6 x" p5 _

    9 G# o" t4 f, X: F一、数据爬取
    ( R; D( I; F& S. J4 m8 \" S$ _; K8 ^8 Q* W
    二、数据预处理4 q4 Q7 B! S2 Q4 w2 {

    / S! [) L9 {) @: R​前言
    ) i$ f0 n& C5 l5 B4 U- Q本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    0 ], \7 Y4 Q3 m% g$ p4 \
    , f* {8 z3 k' S3 T; a; B+ C' G  p
    一、数据爬取: N: }$ W/ A* V
    import requests6 \! k# X3 w& P8 x9 k9 W- A
    import pandas as pd* `# R9 n6 G; a( @6 {/ P; D" z
    from pprint import pprint
    ) a! [2 n! {1 V8 {2 b导入相关库5 }" l" H; e* H+ B# _3 m  y# o
    & m7 M) S# }9 W0 _; P, w
    requests库用于发起网页请求,获取网页中的源代码;
    ; Y: k" A* Y8 Y+ e4 M5 h
    * w( g' F2 F& K; {pandas库用于存储和读取获取到的信息;! F- X0 p* d7 ~4 S4 Y& c

    ; W: |" m4 o. u7 U# P7 q# `pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;" \, c# ~* a9 j- D# E. z$ {

    9 G2 S# t" y0 Y" n1 j! Vurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'5 x4 ]& x9 F. P( d
    data1 = requests.get(url).json(), B4 I4 }& Z! }- U, J
    # pprint(data1); E* F4 e3 D: D* o0 j, A

    # f  h( v9 A$ }这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    * i4 j7 u# R: H% Ldf1 = pd.DataFrame()1 F# V/ t2 H% Q; @
    for info in data1['body']['allMedalData']:
    + E9 q& R- w; ]) x3 @6 [' q/ j    name = info['countryName']
    " i: U' Z; [4 g; o1 B2 h) j& Z3 E    name_id = info['countryId']; ^; }& }9 Z2 Z+ G
        rank = info['rank']  J" T7 t4 V% G: ^3 H+ p
        gold = info['goldMedalNum']
    . _8 {6 l" |) r/ ~7 n4 f: O    silver = info['silverMedalNum']
    3 z# V' e% g6 j    bronze = info['bronzeMedalNum']' k$ L7 H0 L4 j% P+ _
        total = info['totalMedalNum']$ K* B( Q1 c- Y! `8 H* s: F
        # 组织数据
    ) N7 e8 m$ o( Y; P: h1 M  \    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]+ o7 P8 ?& e4 h
        # 然后追加df# `5 e( G" h1 ?" o* }
        df1 = df1.append(orangized_data)$ G1 K# @6 {5 Z: k$ z
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']: i; s8 }: p5 A0 l, |; A4 w
    df14 l- C  G% j" Y, z: O8 N6 @
    7 `6 r! \$ c9 o$ I6 l

    ( D" p& |- C+ W0 h7 }" F  `这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。5 e  {7 r* d  u" ?  s( P
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    + K$ ~9 G$ z3 T; m; y7 O, I6 S/ mdata2 = requests.get(url).json()
    3 V: k, D3 P- |: |/ i& t#pprint(data2)- Z3 [; I6 B1 a6 M; u

    ( ~: T6 f- z6 \0 U. \% ldf2 = pd.DataFrame()# @- d+ |5 j- F& b2 t4 A
    for info in data2['body']['medalTableDetail']:
    * f! u$ R  |4 H# e    english_name = info['countryName']5 a  C% ^; K9 @) O4 d7 K8 v! ?
        name_id = info['countryId']
    & w* l0 ^! {: N$ P% i1 _; l    award_time = info['awardTime']
    : y) a, D% `, e1 `7 y' _    item_name = info['bigItemName']
    5 o8 Z; l- T% X. A& u2 j    sports_name = info['sportsName']. T; F4 z% q$ T& q3 a. b- t& L3 D
        medal_type = info['medalType']$ c( ?: F, u5 O5 X  L( E
        # 组织数据% A9 T; B# \5 V- I4 j+ y) E
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    & v4 X- k0 r& [) P$ c    # 然后追加df# q2 d3 b0 D0 ?! h; C8 u4 {
        df2 = df2.append(orangized_data)
    7 o* A* \9 Z; F0 k/ B" ydf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']! |8 a$ V( X  X
    df2
    , ~: ?5 k$ R( [  _6 `" a( ?' i/ f$ O. D# y  ?! ^
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    . m+ C: s' K$ F. f- C  P& w; X
    ; H, V5 |0 R2 n$ n
    ! S5 T. x; _! K# K6 }+ ^. z二、数据预处理- D+ e: j# g' l1 H5 Q8 E6 ^
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。! }, g. J' U5 x) X' _
      a* f6 s9 `5 ~% S! p: ?
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:8 X* Q6 s( K; ]" U4 J$ `
        x = f.read()3 H# i) E' Y; }0 x1 K* K4 u) h5 k& T

    ; N. K" |4 g8 O6 kdf3 = pd.DataFrame()5 Q- e; A! A: X* ^
    for i in x.split("\n"):. R4 P: v! ]8 W! K, p
        x = i.split(":")[0].strip()
    ) {4 R6 d( ?0 B  G4 X  K7 w    y = i.split(":")[1].strip()
    : n' L2 `/ Z- j' H5 b! N' q4 b4 e6 s    orangined_data = [[x,y]]7 r2 j, D/ V/ ~4 P; h
        df3 = df3.append(orangined_data)& L1 G7 q) a: r/ t+ l! t
    df3.columns = ["名称","英文名称"]
    - E! d) u0 a9 K) E% l9 o- q* Z( g. adf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)- c! h+ p- U/ Q
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    & t* S/ C  s* Z4 i+ f0 z9 H  x1 H8 |+ p' D/ d, y" Y8 t$ c
    df4 = pd.merge(df1,df3,on="名称",how="left")6 ~2 m/ E- f. K2 [+ V
    df4.head(10). S1 s# o$ C- O! A. |* F, E
    0 z' k) s* }) Q% k. ?+ J
    & A7 C6 i& Q, Q

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

    • 3 j: U* i9 f- `5 P4 _7 ~9 \9 O

      ' c! H9 F' G2 A, L% z
      ! n* _9 w1 b+ W) m& v
    % m9 o% E9 k' r
    4 ]: d8 C! Y7 M# a+ t" l  K  X. J
    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-3 09:06 , Processed in 0.447049 second(s), 55 queries .

    回顶部