QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录- P" b! o* v4 y! _/ i

    ( w: b- ^: u4 s/ u$ M8 s文章目录
    / i# i- D' @7 f1 q* u$ s( y& a
    / j- x; w* W$ H前言
    ' d$ [* R! r5 z: v6 I% p4 i' j7 m4 M) X
    一、数据爬取
    : k" ]3 O3 z1 N8 w5 i; ~2 N' m* t6 K1 G# x  u/ R  V: L, ^
    二、数据预处理; ^1 j) J0 |. K
      q# y2 q( q) K0 I( }% e
    ​前言
    , [* ?: \: Y& s" T6 \- ~, t" S, [本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。! M8 v+ t# l2 m) \( T
    9 j' h! a" W# }" n$ y$ H6 z; H

    0 V. D) Y  b8 M* l& R一、数据爬取
    & T% I, O% R8 J" ^  i5 O9 Mimport requests
    9 U7 K5 d7 E3 G  f* C9 k: ]4 Gimport pandas as pd
    # y6 F' ]& f3 Nfrom pprint import pprint
    / N5 x: ~$ r4 O7 x2 X3 f% S导入相关库& z" ~1 U+ x& ~7 u

    & x/ c, y6 j0 [/ k  p+ {requests库用于发起网页请求,获取网页中的源代码;
    $ u, q$ M  t, b! h  F( p3 l( d# ~6 j: F! ?; V( T
    pandas库用于存储和读取获取到的信息;8 D) h+ L# F5 n( _+ ~' h1 q6 \% t& Q
    # ?+ ~; U$ I6 C4 n6 j
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;. m$ m$ u/ @; H2 u$ x) H
    0 R8 l4 h, Q) g% G& O2 n
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    % M1 h7 K- W+ G2 q, Pdata1 = requests.get(url).json()
    3 n5 `1 J5 [9 {/ J# pprint(data1): }9 C- b9 Y$ x* R5 H5 H1 [* _- ^0 G: \
    % I; W% X" h7 Z$ W/ ~/ G
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。* X( c; Y: F# z- Z4 O4 R" M
    df1 = pd.DataFrame()* |6 I" g4 M) M/ I8 u
    for info in data1['body']['allMedalData']:# @. h. J$ W8 Z" }
        name = info['countryName']
    , w+ P( u: A. k    name_id = info['countryId']- [# i* L  l1 o! b- I( j# y4 Y
        rank = info['rank']% k; @6 ~1 l* c6 x( @7 M
        gold = info['goldMedalNum']
    : G- ?# i$ @9 p1 \$ r, K( u    silver = info['silverMedalNum']+ J4 i% T" D$ E: R! y' S" @
        bronze = info['bronzeMedalNum']- y( l. ?2 z6 S
        total = info['totalMedalNum']
      ~) G) B# K2 V4 x    # 组织数据
    ; h4 Z- h; ?/ u% g5 ]( |% f$ f    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]; O2 K/ I8 M- ^( O$ g8 G
        # 然后追加df) d( E9 L) m$ A
        df1 = df1.append(orangized_data)
    ' I- a/ g4 J( w# S/ {% Ndf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    ) M  l& K6 o" l/ t8 ~df1
    & F. U3 _$ M" u+ ~/ {% W4 k" ]9 H( Q1 [. f

    ; G! u+ \! j0 A9 h9 W- \2 A这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    ) }- v4 n/ u' n9 y$ Gurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'$ a% g5 x- K  B( N, P5 ]5 l! A4 z
    data2 = requests.get(url).json(): n" }1 D$ {# T. k# m
    #pprint(data2)
    2 H: `8 j7 T$ b6 W
    " k% r7 v, E3 F- Ydf2 = pd.DataFrame()
    8 \) R  i- \1 D; V6 Zfor info in data2['body']['medalTableDetail']:
    8 H! y4 Y9 ^6 |: x: F, a    english_name = info['countryName']
    # ?6 }! \% E" d! c. V    name_id = info['countryId']0 R$ c7 Z3 \4 j% L+ n! A! k
        award_time = info['awardTime']
    " p- h+ {# M* s2 c, [3 F2 y) y0 Z' w2 U    item_name = info['bigItemName']6 ?( Y( v" i* ~- G3 z% U0 O
        sports_name = info['sportsName']
    - e) Z7 c# G8 ?# r9 `2 K. S3 C    medal_type = info['medalType']0 B- o* ^0 e, r" |$ @
        # 组织数据3 B2 X* ?6 w4 ~" S
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    0 d0 ~! D) u# i0 C. n7 q    # 然后追加df9 Z# F$ R+ k; J5 {
        df2 = df2.append(orangized_data)
      R% S4 P* C: xdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    : ]2 _) s! ]- v3 Q! gdf2" T+ u$ L; v+ }' @  {+ {' H

    + m1 {+ q3 q2 p对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    & ]. J% Z7 o8 [# @. q2 t. Z3 V# K  N0 b1 }

    : n$ F% `- n, C& W9 w2 }二、数据预处理4 }% i' a- |1 |6 k
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    ! c" v3 [% m' W1 z9 I! i4 ]  J7 y9 ?3 b5 s3 o/ p$ ?
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    & V& ^" V; U: s7 p: k- G8 [5 Y    x = f.read()
    9 t( x! ]6 s2 k& [, }9 J
    ) j9 w4 d) u: r6 S" g# Pdf3 = pd.DataFrame()8 r  h# {( W: P" v
    for i in x.split("\n"):
    " e* t4 z4 W6 ~    x = i.split(":")[0].strip()
    3 y9 G- L# a( X    y = i.split(":")[1].strip()* c) n$ j" o1 \5 h- k
        orangined_data = [[x,y]]
    : e0 @3 [5 h3 P% S    df3 = df3.append(orangined_data)
    6 ~' R+ t- T9 G& ndf3.columns = ["名称","英文名称"]
    5 V) L9 K' P6 Q/ G" h! A" `/ `% Idf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    , z- d$ S; {$ ?( P1 y, n& G5 P表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    2 g0 H# k5 L1 R7 p" c8 S9 g% I* `
    df4 = pd.merge(df1,df3,on="名称",how="left")
    ( B7 t/ `& K7 @2 ddf4.head(10)3 P4 |/ E. z+ e1 F: Y

    / J3 Y' j2 x: G3 O6 K$ v  a( t' h! e, |  G- j; u

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


    • ' z8 q9 A* k, U* F

      % Y! t3 Z/ k9 ^7 b* M# L" y1 ?' o, S4 q1 ~) l! l$ A, P& a" I

    " ?# K, W3 u7 M( y' @/ k0 F. |2 o0 X: k- s5 l
    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-10-10 09:51 , Processed in 2.384277 second(s), 55 queries .

    回顶部