QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    + e' t; U8 D% T; Z3 d. F7 v" D
    7 `- z& D) z' C文章目录
    4 W6 i- H) s8 U! T' Z. q# B* v  j6 A, F' ]1 S
    前言
    % J- U" l" R+ e' v$ i$ n, f7 Q- P  W5 T+ I5 O4 @
    一、数据爬取4 `! r6 L! @* s- S
    3 T6 U+ Z3 \+ Y
    二、数据预处理
    ! G( |) F( U+ L5 K: s. l- k# C) r! S1 V; h) }
    ​前言
    9 W4 w, \  \8 [0 F本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。; ^  Z/ W1 H3 J+ V: \

    5 Z+ ]; N$ o7 ~/ L  n
    " B, j$ X+ S8 P" E6 F% z' H3 _0 d* L一、数据爬取
    * q% \$ D* a/ T3 o& {" simport requests
    9 L7 r) |+ a" k! a5 cimport pandas as pd7 `/ O. a) Z0 I. @
    from pprint import pprint
    6 A1 c2 P% c. S. ?# m导入相关库+ m* J- H* m0 O+ G/ H0 F

    ) ]4 L0 H9 R+ q' ]- Wrequests库用于发起网页请求,获取网页中的源代码;
    ' g4 I* Q6 A6 R$ h+ F
    5 F0 w! |+ Q/ I# A$ hpandas库用于存储和读取获取到的信息;0 J. x9 O. V; g1 ^4 z6 S% f
    , i, a' N7 j  D  H, B
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    ' X7 E5 g8 w6 f
    : ?3 G% P( s9 K& R/ b4 M9 _, Furl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'8 k+ y( ]; b  u6 G3 H- P
    data1 = requests.get(url).json()
    . {' S- `. d  r% C; Q% M- @5 a  z7 X# pprint(data1)
    + f4 w6 G' w1 H& ]+ p. B# ]. C
    6 [( ^9 R; S8 v4 @3 X这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    ) A. K6 ^( D1 c2 w3 \' }df1 = pd.DataFrame()( e+ P2 T! q5 T2 L8 i: D
    for info in data1['body']['allMedalData']:+ @& s" v5 O9 t! `/ R* [2 W
        name = info['countryName']/ U: |  f! e7 C5 A9 b# F  W
        name_id = info['countryId']  H6 m+ K% q2 s) U$ R, y
        rank = info['rank']
    $ B) r: d8 Z+ J7 O    gold = info['goldMedalNum']
    1 Z/ J( F6 H/ B- W( r! h    silver = info['silverMedalNum']! u  H( i0 }, M; y/ w0 O0 Z
        bronze = info['bronzeMedalNum']! m2 B8 X/ R+ I/ S
        total = info['totalMedalNum']
    / p0 `6 n( l4 \0 f: d* f: }    # 组织数据
    0 n2 t8 J: Q! z+ M    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]# V2 x$ L, Z: J# I7 [% k
        # 然后追加df6 s: K0 }7 d2 S6 m0 z
        df1 = df1.append(orangized_data)+ H; K2 _0 K- [' r, g
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']% W2 e! V8 w4 H' L% G
    df15 i( j$ z% ^3 V. w; i% S$ x
    . e7 D" J( x4 X8 p7 V
    - E# c/ x; h! H7 @8 A. M
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    / N4 ^* y7 ~& M8 X1 w  qurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    , b" ]" {" B8 J' t# j2 H; I( ddata2 = requests.get(url).json()+ B+ ~3 O: k) q. Q2 N( `
    #pprint(data2)
    & l- n" U. l- P. ?* o
    , _( e& k8 ]& [! Ndf2 = pd.DataFrame()" I! _8 @# t; u' X+ N5 @4 c
    for info in data2['body']['medalTableDetail']:
    / l, G6 T2 o2 w    english_name = info['countryName']
    ! Q& c% B- ~8 B' L+ A    name_id = info['countryId']
    0 c+ ^" |$ ^) o0 V    award_time = info['awardTime']6 w% K+ t+ _" q6 N5 F' u
        item_name = info['bigItemName']# d+ J% _2 u, Z
        sports_name = info['sportsName']* y* G! H2 m) d4 Q* L* _: z  E
        medal_type = info['medalType']5 q" p8 X/ l( ^6 y
        # 组织数据
    8 e# E/ Q3 R# m6 u$ x    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]- Z* z8 l9 T# J9 u5 ~2 f* A! g
        # 然后追加df) @8 H8 E7 s9 U2 _7 `' H* Q
        df2 = df2.append(orangized_data)
    $ w2 ^! a5 U! e* K4 ?df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']7 s8 E) P7 z/ P  |4 X
    df2
    7 a: ]) l% o9 {) G+ z0 E* o7 |. I1 y5 n& i  `" I" k* v& H1 \
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 3 O8 k9 M5 J5 m) U3 R
    # l* [# t8 e5 Z4 x: |6 V

    ' y, z/ K1 R) V6 a; o* f二、数据预处理0 M4 L6 t2 B3 Y0 h; Q
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    % M3 b8 d' m! }; T9 ^: G$ P! [$ w3 Y8 t; _8 P
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:  t  Y$ l2 P' c5 N, _
        x = f.read()
    2 Z3 M8 D% y0 W+ r* ~% }0 n; [( u
    , ^! C, B% c$ s0 vdf3 = pd.DataFrame()6 z" w# s3 X& ^2 _% H( ~
    for i in x.split("\n"):
    7 T6 a% Q' W; }7 @1 M7 Y( I; h- K# m    x = i.split(":")[0].strip()- S' \% J4 A4 c) B/ g
        y = i.split(":")[1].strip()( [% j/ [% d  _/ Z- k
        orangined_data = [[x,y]]& h& _" @4 g. w8 ~4 @# j: e6 G
        df3 = df3.append(orangined_data)
    ! y) z5 A2 e4 \# V) d( S4 y' {8 rdf3.columns = ["名称","英文名称"]9 `6 Y- t8 G: R$ [" q6 S
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    ; N9 P  _: w: P5 n2 T' z表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。3 S2 W& _) R" [: d5 V3 [

    % }; x" M' p2 Zdf4 = pd.merge(df1,df3,on="名称",how="left")
    " M1 r7 o6 `' sdf4.head(10)2 x5 x$ Q: }' q3 |' @3 ~' C
    . S; b1 @% M) `
    1 G- x% W1 h9 r3 F( o8 Q

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


    • 0 Y& @+ l( ^& {: h3 g1 n# q

      7 K% A1 C' _* w8 L+ u" ?1 q# n7 j, }) b2 }
    : }- g% y. P; j1 ?
    $ x7 Q4 Y5 C5 y5 m" h0 ]4 Y
    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-18 07:57 , Processed in 3.272156 second(s), 55 queries .

    回顶部