QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录8 l% j: L- d( B! J1 @- I* Y6 `

    9 @# \! O& F& Z) a/ N. N( H0 b3 Y文章目录* R$ f$ F1 \! c& `  i! g- Z

    % U1 V7 C2 k( Q& H前言7 M3 i( ~# O; {3 A
    / o9 ^' m( Y- f; d
    一、数据爬取
      F% Q% s- Y2 P( `2 t' {" v% Q0 I! f  ^( p0 {9 e+ n2 Y: k
    二、数据预处理
    & S7 U5 F3 D7 C) A' z- I7 ~, R% c9 x# p
    ​前言
    # O6 S& X2 {6 b本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。: ]1 M  Z& x$ \( v
    $ l1 ^% Q# i3 h

    ' M) |8 ]- D3 p  s一、数据爬取, ~6 D! l- B1 G( k7 U; R! H
    import requests- T0 L3 w$ w* P% j( c# |! C1 m3 }
    import pandas as pd
    8 ]1 i3 x# ^4 A% y! o- }: xfrom pprint import pprint* ?1 a: K. ]& ~1 z: X- Q! ~
    导入相关库
    1 O( X! m$ W6 p. X6 k( n3 H- N
    & I. C: Z& r  P# s, C4 i1 V, yrequests库用于发起网页请求,获取网页中的源代码;# R- B9 y4 V7 B- l" \

    5 C8 n: {& M. n, ], Z% I8 Ppandas库用于存储和读取获取到的信息;4 d, C  N7 b8 D+ B8 z3 T
    ( d7 r( L2 r+ A8 {% c
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;# Y: [8 X' y/ |. v6 b
    9 G' G( K, S, Y: r$ p( R
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'' g6 p( M9 \1 K7 T/ ^2 ^- a
    data1 = requests.get(url).json()
    / C4 K3 K) e/ G3 l1 n# pprint(data1)0 ~9 \3 B( D/ O& R' a( C& S5 C0 ~( s

    2 u# T& [9 s/ P4 l5 u; C这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    3 C5 O1 f; N: y% y$ o1 d9 m5 vdf1 = pd.DataFrame(): b8 a  H+ C! w6 ?+ b7 F
    for info in data1['body']['allMedalData']:6 k# A# ]9 e6 u0 o) u
        name = info['countryName']: k6 {+ B' D* |- z- x
        name_id = info['countryId']
    $ c3 L( y" V- g    rank = info['rank']
    : N+ O: ?2 z2 w9 X0 R    gold = info['goldMedalNum']7 i% E, M% r( ^  j) q  y' z- G0 A) I# C
        silver = info['silverMedalNum']7 |( S+ l" ~3 s( B7 w: u- h9 ?& K
        bronze = info['bronzeMedalNum']! f; m: }# f7 ^: h2 g2 K3 p
        total = info['totalMedalNum']
    - U& r4 b$ \' w+ j! J+ z# f    # 组织数据
    1 ~2 G- _" J4 b# j! C    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    : O+ K3 g- N! r) o2 I    # 然后追加df
    ! A$ B2 O" i9 r& i' r    df1 = df1.append(orangized_data)
    # T6 s4 u( c5 O) {/ Tdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    4 d" i8 [5 D4 P/ e( B- rdf1
    ) U* l$ z" T6 f# N- L  p& S3 o4 P" Q! q  n- Y
    1 v0 ?9 y$ D1 |& q9 x7 A6 A3 k
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    9 r' g: r* c. L7 a8 i: murl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'0 d1 G4 G) q0 K- g4 g
    data2 = requests.get(url).json()
    . R8 G- ]( @+ L2 ^8 l' Z5 [; x#pprint(data2): f0 N3 c; x3 a7 g4 G7 |

    5 [3 F" e( H6 m* y7 odf2 = pd.DataFrame()& @; d, Y; }! ~
    for info in data2['body']['medalTableDetail']:) f9 _$ y7 `+ \/ y0 }
        english_name = info['countryName']6 Y+ I# @8 C$ z
        name_id = info['countryId']5 D; C& a* t3 Z4 T, c
        award_time = info['awardTime']
    0 F$ o8 B0 i+ A" R    item_name = info['bigItemName']
    , c$ _6 N$ _; [# x+ A- }; k: Y8 Q    sports_name = info['sportsName']9 n2 _  f: V8 X* q/ i) @" h
        medal_type = info['medalType']! F5 O  N: ?( H& D  j: V
        # 组织数据
    3 z: S% @: R4 z1 n5 r4 W) ~    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]( j/ e* }  ~4 e! x; j# I
        # 然后追加df0 z1 ]5 H" Z  A/ N$ D8 f* X
        df2 = df2.append(orangized_data)  {% h7 b* l# ]/ S- t5 d( I& L
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    # Q5 ]9 ~# H2 L- U' Adf2( F7 {9 Y* S# I5 {) U* i$ o, v
    6 i$ j6 i! g& ]9 r, c6 ?- d
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 ' h8 F2 R6 b5 V& H' n/ B
    ( |1 N" z6 Q$ _' }0 D' {. O/ x& ]

    ; T3 c" ?  R# p: V0 f, n二、数据预处理
    % ~0 Z% e2 z  @由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    " ^) j0 |+ ?6 T  S7 G6 D
    " Y4 G3 u1 M& ~with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:- C* W$ L% K2 \7 C
        x = f.read()
    * E6 v' P( C3 y' h; R& ~8 M6 _5 _) M7 [% g+ g
    df3 = pd.DataFrame()) y) N) r4 i0 O) s. C. Y) ^% E1 A/ \
    for i in x.split("\n"):
    ' `5 F4 C$ j+ V3 I: [, o3 A    x = i.split(":")[0].strip()
    & p, v8 E9 P  |; Q5 i    y = i.split(":")[1].strip(). @/ n' |* Z( m% D
        orangined_data = [[x,y]]2 i9 u0 r. A3 d
        df3 = df3.append(orangined_data)
    $ @( @% e& o8 D0 _( y  adf3.columns = ["名称","英文名称"]
    2 g/ m% s) V5 @0 s* udf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)( p( D% l8 c6 W5 u! M7 g( N. ~
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    7 D- b( R1 s. |4 ]7 |- l4 ~, t3 i" O6 _9 s+ X
    df4 = pd.merge(df1,df3,on="名称",how="left")' W0 Y& V/ ]% r/ I
    df4.head(10)
    . d9 Y7 H/ `+ D6 D8 V8 n, @2 a" F0 k; j/ Y2 z

    + Y7 m  [. U" J/ q8 H4 z/ o

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


    • # n1 G8 Y. m) K

      ( {$ n, n( v) z9 U; C, ]# G& Y) |/ W# ]( V! Y/ B2 A, M

    ) \% |5 J( D9 N6 C9 a$ }3 h; X+ X% G( H% M: W, h8 K1 i9 M+ r
    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, 2025-5-10 10:23 , Processed in 0.457580 second(s), 55 queries .

    回顶部