QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    5 G9 X# u  b/ U: s' X( d7 K
    ( [3 x: R& j# Y2 {  K8 X文章目录3 C2 C0 `$ |7 V5 q/ t- x. U
    * K7 b/ I6 K" Z
    前言
      e* l! e% K; u, I% \
    . [" R7 A* j/ `4 @* V; y, v/ m一、数据爬取# K7 t: q' s3 K: e/ |5 f

    . n' c* A  k, e8 Q二、数据预处理& T5 k- \$ F5 N4 F) s
    ; {( s- x8 X& q. y* C
    ​前言
    / ?6 t& [( w. L& T3 W5 u6 O; R本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。4 f, H2 b2 ~0 Y/ b
    + |1 W' I# N( i; g
    $ ]3 G" l) G5 ]
    一、数据爬取
    % D0 W8 @6 o' z& u. Cimport requests8 r5 g8 W4 Q2 |: m. n6 k
    import pandas as pd
    ; C, {+ G. G+ ufrom pprint import pprint
    4 a  f" u# t) R2 p  `" M8 U导入相关库
    9 [9 B4 P4 ^9 n' b# A8 q
    + M; ]. Q+ m& V3 H5 X# a: Crequests库用于发起网页请求,获取网页中的源代码;! F% b; o+ U" w

    4 \3 n' n' z& b4 H( P6 y0 vpandas库用于存储和读取获取到的信息;/ F7 R8 g; |: ~: f( y4 d

    2 _/ l4 L( A; T2 Y' R, I8 ypprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;7 y9 A3 G$ ^+ j' D3 D

    ( ]/ J6 ^/ L% I& V$ ~: O0 `, @7 surl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'/ i7 _/ U6 O6 @, n" b! Q4 ?
    data1 = requests.get(url).json(). [1 N4 F3 R' g$ X) i
    # pprint(data1)
    , w9 j: ]# `0 V7 Q! T% J6 l6 ?8 b8 J- X4 O0 u& h
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。/ C" W; j3 f. R# y) |
    df1 = pd.DataFrame()
    * S( S; ~  H( A. C8 Qfor info in data1['body']['allMedalData']:
    . M0 O' X. E$ D* k6 [    name = info['countryName']
    * s+ M# L  H5 ~% b2 d/ l+ f7 ~    name_id = info['countryId']
    ) X7 k3 e$ [# I0 D! x$ v, k. h4 X    rank = info['rank']
    8 Z" j6 A: e/ J) Y5 f    gold = info['goldMedalNum']+ H  L% P3 \) o; h' g# A/ [" d
        silver = info['silverMedalNum']
    ( S% r& {7 K' ]5 g5 W3 d    bronze = info['bronzeMedalNum']
    & f7 i+ c7 }- M  }$ [/ F    total = info['totalMedalNum']7 z! ~$ Z- t! c7 ?; ?% ^2 i3 p- l
        # 组织数据
    * d; c0 t; P3 Z+ [  v1 u    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    " Y$ B( R( \' u5 B    # 然后追加df$ C: i0 H; o- U2 i
        df1 = df1.append(orangized_data)7 Q' Q) s1 D6 L/ K5 [  D
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    : R1 N# i- U! d) V6 h$ _df1% A6 T5 d7 D" k7 s9 U

    % c( N# p3 ]3 g5 b. K8 Z* C7 h
    0 ?4 q4 e$ C& i, f( F' `这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。" \$ Z7 o( u: [0 F6 ~
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'. @( @' F3 d; G! n/ h( l( }
    data2 = requests.get(url).json()
    2 u1 T9 X, Y  f- p! d#pprint(data2)
    " K7 P8 D8 s2 H$ F7 f$ c. U2 A7 U( m+ t- }! p
    df2 = pd.DataFrame()
    5 x0 P# `/ @0 {" F- dfor info in data2['body']['medalTableDetail']:
    ( I' g: W( j( g  m0 h    english_name = info['countryName']. }# {9 ^1 U. G2 B- r
        name_id = info['countryId']; H+ K7 ?$ o' t. r
        award_time = info['awardTime']. f. u# {( y" u1 g" d6 h! d
        item_name = info['bigItemName']8 b! n! P. q/ @1 x
        sports_name = info['sportsName']
    ' u4 @1 l2 m' ^/ j. r( R/ Y: j* h    medal_type = info['medalType']
    7 k( [& M; E1 `( J- ]    # 组织数据& M& c) K- e% g1 k
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]. L* C. ?/ X, C. v9 j% Q
        # 然后追加df
    & A1 @2 T" }% v9 Q3 k    df2 = df2.append(orangized_data)
    " f, r" V/ i' _0 wdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']8 C( P9 R) u3 @9 E& p7 |
    df2
    . [8 O3 e% V/ T# h9 K! p0 f+ B! A! {2 l8 P. r  |3 Z. @, |5 f# ~
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 0 j( [: b* ?: T

    2 X: W% B2 f4 M  j) i  S& @6 S! \
    . M# I- l9 I- L6 \5 f; R二、数据预处理
    / r( t# c6 J. ^. Z/ u由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    ) u( \5 W& o1 B2 {2 x
    ! Y! x' Z  x7 h' H; h, U, xwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:2 L! H  N$ B; r/ U, Y" Q
        x = f.read()! a$ E6 a/ q" z8 V$ ~$ ^6 |1 m

    " g7 _& S% `7 Y9 W' ~2 ~df3 = pd.DataFrame()/ Q' u! R; y' F7 ]3 a& a2 g
    for i in x.split("\n"):" ]# @' W2 Q4 A0 p7 W7 ?# U3 W, K
        x = i.split(":")[0].strip()
    % Q( [) M; u. z1 i! s- H, V) K) f& G    y = i.split(":")[1].strip(), n, R% t! b3 _
        orangined_data = [[x,y]]# A, L( _% {+ [& d9 u
        df3 = df3.append(orangined_data)
    $ y. p5 j; U$ L3 ?6 k* S" Sdf3.columns = ["名称","英文名称"]% ?2 \% \2 o. ^1 K
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)/ j! k& F# l3 ]) B6 L% E
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    ! l& u2 Y1 V+ K/ G/ [
    - f! @" p8 c1 b# S& S  @df4 = pd.merge(df1,df3,on="名称",how="left")# ^8 U2 z: w8 A$ i
    df4.head(10); @8 ]7 x/ p2 O
    5 C8 v, T- W9 M1 K3 t1 M
    9 i$ K) w" m9 L5 O- R

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

    • " n3 A3 Z7 j. {9 M

      9 K0 u2 }, q1 O$ @" P% ^3 }2 N* e1 y. m. A! C/ ~
    ) `7 n5 r: K! \1 H% y7 Z3 @

    3 `" A  ?6 V7 r* 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, 2026-5-22 03:21 , Processed in 0.401852 second(s), 55 queries .

    回顶部