QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    8 Q7 p8 o/ Z  }
    $ s7 ]2 @1 ?. T) g文章目录* W, @) G* h' I" b) o! h

    " l3 ^( f! K0 n, K- b前言
    + |- ?0 j0 C# T2 v0 f7 b8 \8 P1 \3 O' e# `" }9 K: q: p* i2 Q
    一、数据爬取0 }1 {$ A9 \5 R% t! q4 c
    8 d- M" \# b% L' j
    二、数据预处理( h7 F7 `( a" q

    ( W( {# y6 G# b  P​前言, q( }; y5 [1 U! Q8 g' Z3 m4 e
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    0 K4 F0 R+ h$ ]' T+ j, W! c
    6 U1 x& U9 J7 a5 h1 d) K+ ?6 G+ d$ H; v; K" Z; [* A/ V$ W
    一、数据爬取
    7 d8 S9 A" |! ?2 |0 B* Bimport requests
    / c7 i* M* T; timport pandas as pd4 v0 [/ u* Z$ D( \
    from pprint import pprint3 C' h4 I+ C& E7 T
    导入相关库
    7 S- x! E/ `5 S0 X2 {2 Z
    $ G1 e: O4 ^& @$ |, M& c4 G  {requests库用于发起网页请求,获取网页中的源代码;7 b4 q, J( |' u) W7 c7 T' K
    ) E, k* K# ~" a# O
    pandas库用于存储和读取获取到的信息;* E5 M2 j+ ]6 k% c  E+ j# y

    9 B& W' w$ O, e# j. f& }' f' Mpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;" ]# y9 v* J# l
    5 p) ]4 @' P& Z% W% s
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    / @+ u) x9 d( ^( ]6 edata1 = requests.get(url).json()
    4 ?( h& c: r& G  j! a- o! f# pprint(data1)+ U: \4 W1 c7 K, u) y) g

    3 E, Y, a0 j; p0 K这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    + m, m* S0 V, }; y) t0 v' Rdf1 = pd.DataFrame()4 h0 }/ O$ v3 I% F7 K/ q: m- d
    for info in data1['body']['allMedalData']:
    3 V6 k3 ]" w7 H2 ^7 v    name = info['countryName']& J4 L& M. H9 o
        name_id = info['countryId']0 s; O; n3 T( D& M
        rank = info['rank']0 h7 u9 A- ^, q* V* r
        gold = info['goldMedalNum']' A2 ~" ?0 M, B7 K
        silver = info['silverMedalNum']  C$ F0 r8 V+ q6 a1 E
        bronze = info['bronzeMedalNum']0 Q. W7 q; }' D" H3 }
        total = info['totalMedalNum']: |9 ~5 V) {2 O6 ~
        # 组织数据
    % D- w. _- P0 ?; n7 q' [    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    $ ]: H' m' ?* G9 M2 Z    # 然后追加df
    ' F! t- F5 P9 s/ T; W# @    df1 = df1.append(orangized_data), }# c" l' R3 N/ ?! Z
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']" `2 i7 O2 w3 H( K1 ?8 L( S: s
    df1
    5 k2 m' Q$ P  y  C
    1 e4 ?: w3 K2 l( I5 D
    2 O0 k$ c' D' }0 ?1 T0 l这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。; p* I, m7 U& ?. D: t* ], H: W6 v. `
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'$ B$ [! a' z5 R# [' f6 Q' d
    data2 = requests.get(url).json()
    ' P" p1 F3 c* v9 |* b#pprint(data2)5 Z- u, Q/ K! n

    5 O& [: z7 e9 G) r+ V0 z5 c9 ndf2 = pd.DataFrame()
    5 E/ U$ n1 ?4 n( p# D  L& `% Y2 Jfor info in data2['body']['medalTableDetail']:/ B/ \) }, T! Y' S0 P
        english_name = info['countryName']3 T, p6 n+ g# Z7 n9 u7 E
        name_id = info['countryId']
      f/ W  ^/ `) ~5 W; u    award_time = info['awardTime']" p! M' y  |1 }. I, W( {# v
        item_name = info['bigItemName']; k, p+ {/ r% N0 G
        sports_name = info['sportsName']
    ; a! |: \0 `0 G) I    medal_type = info['medalType']
    1 `' L* x9 K; Y! a    # 组织数据1 \  {9 z( }% G, @$ @
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]1 @% h) \$ B4 L6 n
        # 然后追加df* @2 l! i- L+ m. r* r8 l( x: h& D. u
        df2 = df2.append(orangized_data)9 Y. e8 U! J5 o! u! x. A, T5 G
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']# b8 F# \% @1 t
    df2
    . _: m; W$ ~$ g% L6 _1 z* b. @5 T- u3 ~& f
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    ! @  h7 p8 V# m8 I4 O0 \* z" |8 ]- _7 C* c% a2 m

    + J7 y9 r* }. q, ?# ?: B. x- G二、数据预处理, \2 d% x, k& P3 J$ h) @
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。$ B4 {/ [3 h. V1 s6 |) r' O/ N
    . m* ?3 ]: W, B( h" y$ @$ d
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:. {' r3 P) _# S% V9 b
        x = f.read()
    : W, I  ~3 E  R
    ! ~  y1 Q4 ^$ h* W2 ]df3 = pd.DataFrame()( W3 v. _4 x8 b9 J$ [
    for i in x.split("\n"):; E- E2 o5 X: v- k" t
        x = i.split(":")[0].strip()
    # h" q, X' p1 V  C# t    y = i.split(":")[1].strip()
    9 ?& K% D! W; Q" Z    orangined_data = [[x,y]]4 l4 e: g3 Y0 f" j* |$ K
        df3 = df3.append(orangined_data); }5 S* F% {# l# B, {
    df3.columns = ["名称","英文名称"]( ?. {" J) U" f" N" E
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)4 x# T# d. I3 E: g) U* C7 h" X
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    3 u2 }  V% u7 [1 I" a1 N4 B4 X( }
    ( e4 r! j, M7 s) Edf4 = pd.merge(df1,df3,on="名称",how="left")3 _! F' R# ?; U" r: L9 L1 ]- U. S1 l: ]0 A
    df4.head(10)
    " w8 B* i; V6 g; T4 x- k, S
    ( z0 _5 v. l6 E/ d2 S. v) m$ p  h' B$ x7 j4 J* m3 i5 \2 {/ T

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


    • - M4 K  E9 K9 `1 A0 x
      ! u8 X9 U4 A, ~1 c! e$ n6 T* F3 R

      , ?3 `) q9 w7 C& A; T( W1 o

    ( W8 w) A2 I- N9 R2 a9 j
    . N0 R# I! ]% K$ W9 @6 A  C' }6 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-7-31 21:54 , Processed in 0.323679 second(s), 56 queries .

    回顶部