QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录+ F: I  o: {: d0 Y

    ) a5 Z% X6 T1 d5 z0 I0 Z文章目录
    % b9 p$ x5 y9 f" Z( t) \; p) E; w; S2 i& E1 W: Y$ C
    前言
    3 M; [. q$ r* f% G
    + p# f# f5 k, E一、数据爬取
    ) b1 Q- Q* {: j* @- J' A" d# R$ b: j
    二、数据预处理
    " @3 Q# z% t+ i) ]2 A
    . Z. @: I: h7 `! \0 m​前言, Y4 P, f4 B5 @" P0 }! m- u
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。; M' O* N4 n1 n7 H& y

    ( N% }# O/ ?# {1 m) u" L9 A- a8 a. Q* q
    一、数据爬取2 P! M, ?4 ^7 ~
    import requests
    ; E8 O2 B0 ?1 J2 f3 fimport pandas as pd
    , ?  f7 Z. Q7 h+ C" sfrom pprint import pprint+ U/ F$ Q: x( W# i, y) N
    导入相关库
    $ k0 B% X$ j6 |# ]. q- r6 r/ D0 J. O0 W: ~# T
    requests库用于发起网页请求,获取网页中的源代码;
    6 A8 j7 A% k6 n8 Z* W  G$ K2 b5 L' j( J7 m+ q
    pandas库用于存储和读取获取到的信息;
    ' e5 \' a. Q2 K* S5 `! r
    ; [, h* w+ i( d2 b4 Y7 }pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    : R) b4 M8 V1 n% M0 M# e
    4 n5 c5 P+ T" u5 Y& c6 V) F$ Eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    $ a6 X7 c1 N9 Fdata1 = requests.get(url).json()" D+ V- ]3 h, ]0 `( _. G" K
    # pprint(data1)
    * G# B6 p% q. S# l/ w( I7 s4 R5 F& ~
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。, u" b% U7 f# n3 d  @6 t. Y% F1 s% ^
    df1 = pd.DataFrame(); W3 H* k3 ^; a4 S& s
    for info in data1['body']['allMedalData']:
    4 B# t7 a7 L% I% ]( l+ p( M    name = info['countryName']4 \8 _8 W: o) {3 J2 F4 K9 k7 q& E
        name_id = info['countryId']- p# ^5 d4 n3 r
        rank = info['rank']
    / l( N+ l% E6 ?; v" r; I1 [    gold = info['goldMedalNum']* q: ^1 y. e! t8 y3 Y
        silver = info['silverMedalNum']
    : d- ^2 l: ~+ I; I5 ]) z) [    bronze = info['bronzeMedalNum']( x) Z9 X0 ^2 S- l$ N/ u+ U+ m
        total = info['totalMedalNum']& Z& g% P, s! N6 L. T  Z
        # 组织数据' t: z- ~5 q% U& _' W
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]- n" P. A( \& `* z
        # 然后追加df! b. R( t; U7 ~" \# C0 ^
        df1 = df1.append(orangized_data)7 b2 J4 r2 k, J/ f$ n; b
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    9 w; ]+ q; w  T. G" R, udf1' d; k6 z) n1 z( Q

    ) M% Z6 L1 C& b* U  n: G" N# K# n+ z( i# M8 r/ j1 u  B: ?
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。" K2 E) x+ r/ \
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    + n# l2 L2 T# t0 z; h. i. s% o( p5 |4 ?data2 = requests.get(url).json()0 @, S" B+ u! y, ?) T
    #pprint(data2)6 \5 a4 l( r. U9 u, p3 k) N- s2 Z
    ) r) A: h  e8 C  ?; j7 H& c
    df2 = pd.DataFrame()
    0 r' ~& H3 W, }* w1 d0 yfor info in data2['body']['medalTableDetail']:
    : Q% k; ]7 h& H$ H" V    english_name = info['countryName']
    7 n$ O" T5 |3 ]4 O4 h2 k/ }    name_id = info['countryId']1 W% {0 U& d. n0 d% l4 f, `
        award_time = info['awardTime']6 F. T0 m9 P4 g' {9 `
        item_name = info['bigItemName']
    - q0 F* a& Q" f9 E% |  G4 C/ J    sports_name = info['sportsName']! V' ^# p, Z9 Z& h% l
        medal_type = info['medalType']
    0 V' j( J) J5 N& ^( w* d    # 组织数据) q6 P/ L: m. |  `
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]# z% G9 d! q/ a, r5 c: e# ^4 w
        # 然后追加df- l6 q0 C) W$ T
        df2 = df2.append(orangized_data)$ u2 M+ K( O* }; G- c# K9 i$ F
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    + r5 w# |1 t. Xdf2% z: k. R* e5 |, a  O. X
    " F( z$ P. ^1 H
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 / B6 D# l- F  X4 S& S# y

    6 H' A8 N% n* Q9 H- m; b. E
    . [8 Q) U, j* g5 n, |- W% L8 l% t二、数据预处理% G* j, B  J$ Z0 r& X2 Z
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。/ {% @2 W/ r/ f4 Z4 Q+ P7 D: y

    ' U5 w& H6 n4 e9 _with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ( k6 t1 r& _' k# k- I9 Q; T) C- P    x = f.read()4 W  C  k  E$ i. _" C

    " A2 U$ i8 B6 p: C: N7 Sdf3 = pd.DataFrame()
    4 D6 C& X6 s7 x8 C. b$ yfor i in x.split("\n"):
    1 m& A- M& X' Y/ k3 A    x = i.split(":")[0].strip()
    7 Z( }& ~1 ^( k3 _' y7 e1 n    y = i.split(":")[1].strip()% R5 ~; x; P4 j* F: k' i/ T: q
        orangined_data = [[x,y]]; T7 C$ [4 X+ i1 y' G
        df3 = df3.append(orangined_data)
    & j! I& T7 `/ M1 w3 Q" idf3.columns = ["名称","英文名称"]
    9 `3 P( J; z! J' c- `* P; idf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)- \7 v2 M( I& V5 H) @/ ?) R
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。5 h9 i& a- o/ \' F4 k5 A( P# a
    ; r% S# g8 O# r( [( r0 L5 F
    df4 = pd.merge(df1,df3,on="名称",how="left")
    , ^9 K8 C+ z( S: ~* X& K& w: Adf4.head(10)
    % d% L: G% {% r! U; B1 I: c9 f' y9 k, r$ X  d( P& [# J9 G9 l+ g
    ( m  R: g# N$ U% n3 n1 S$ o

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


    • 8 p" i& ^/ Y) f0 o2 r
      : X% P" G+ s3 W6 w9 ^! \
      2 h1 Y# W/ v5 S) J, c9 f* s

    9 A8 j3 p6 r/ j6 l5 k2 r, `6 k& p; W2 g
    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-24 19:10 , Processed in 0.387152 second(s), 56 queries .

    回顶部