QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    * Z0 h# a; v' q9 W+ ]" D( G
    3 }4 {- c) c3 y4 N1 }* L8 S% I文章目录- ]* G, q" _3 h: O4 n0 g6 R. d

    # S+ B8 ?. a) _0 a/ e4 _前言
    " d4 t- o$ R7 b0 R% R8 w& m0 _7 f0 n) d& [) T( V( `
    一、数据爬取
    ; G- q3 k1 ^- w  F- {& X! ]* Q4 I* w0 Y5 g2 I$ p
    二、数据预处理! {0 G' z, r8 b6 G7 @

    ; J8 C4 V/ K6 C+ U, W/ z; o​前言
    8 K) [+ K4 ?; h, u- y本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。/ ~% f4 j7 [( }( N9 u

    ! E: A& M, A* {, _/ Y5 `0 X- E& M% r9 c/ P: r# m; q0 U8 y
    一、数据爬取& B2 i. i2 e7 m( A  L. @
    import requests6 H7 i$ w' [7 g9 {
    import pandas as pd
    * N# I: {' H; M( T# b" bfrom pprint import pprint
    + S  H) P  A; N2 a/ U+ Q, m9 t) I' _导入相关库# S8 V& P3 _/ Q& Z/ N; F
    9 A7 K, S% `( R- C3 P2 B* E
    requests库用于发起网页请求,获取网页中的源代码;; V* B3 d+ @7 I' J7 K( B
    ! }! g1 D6 a6 K7 ]
    pandas库用于存储和读取获取到的信息;
    3 `/ M1 U& F! G+ E5 N8 C
    9 }: o. U# `& {" C2 C) t9 Cpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;% n# W9 ]) G, e+ x6 f. u* \, K) {2 \; b

    7 |# r8 [3 t* J' T( h, T2 Gurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'- y" O* Z) q" x5 a3 C& g% s! F: l$ r
    data1 = requests.get(url).json()- A. h+ D2 h/ s1 F
    # pprint(data1)
    5 |9 J$ ?( U: _$ u9 y
      ~; F' F$ Y, _* u' k) `9 I这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    1 S, F# k. C4 q& K1 _4 R2 Kdf1 = pd.DataFrame()& |6 x. e$ e3 U% d7 X- }
    for info in data1['body']['allMedalData']:4 q, O7 k3 {+ V6 R/ T
        name = info['countryName']
    & P) C  A2 v$ l7 i- F    name_id = info['countryId']
    4 G) I3 h, Z0 K! M    rank = info['rank']+ u& x3 w. x% Q' {% [. S' I, W
        gold = info['goldMedalNum']0 K. ~0 p6 [# x3 f! P9 }
        silver = info['silverMedalNum']5 N/ r! X: p( F! a
        bronze = info['bronzeMedalNum']9 a6 n$ m& m; l
        total = info['totalMedalNum']5 r2 E, e) j1 |7 {% i; ]1 v& i+ k
        # 组织数据; v' U/ i* i  y+ d/ Q) \9 c
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]3 a: K2 |4 \. r. U
        # 然后追加df( x7 S% D' c+ K0 r5 }- D$ ~  G
        df1 = df1.append(orangized_data)
    0 _! F. G% W1 q% y- @7 t, Adf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']7 S1 R, c: `/ ~. U+ q9 O; k
    df1
    0 w+ V* R5 @7 J$ M3 t- |) `3 z& M* O* _0 @) |! ~
    + n9 x2 U% G$ q8 f/ L% }
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    * Y& ^3 j  h. Ourl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    6 X' F6 |2 C2 a# e& ]data2 = requests.get(url).json()
    # Q. u. J$ B' r8 [  m#pprint(data2)
    + ~8 a, k9 n8 R4 g) S) B& ?: H  z# U; M
    df2 = pd.DataFrame()
    7 M6 q+ z8 P/ w5 w7 k8 sfor info in data2['body']['medalTableDetail']:
    # ~, v3 U5 W7 @& l; U& X: M& ?    english_name = info['countryName']
    8 x* ~' a2 S0 t7 F. x$ c    name_id = info['countryId']
    ' O) _2 y* y4 p( _( \    award_time = info['awardTime']; x/ L1 |& `7 ^' P# H+ V) k+ \/ H
        item_name = info['bigItemName']' N4 a& Q4 ~- q  w) k, G6 ?) s
        sports_name = info['sportsName']: }- H% R  V' |) l1 i
        medal_type = info['medalType']
    5 t' j0 P4 w! c) ]    # 组织数据
    , \  G- }  G/ B* m4 i. Z  k7 U" A    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]: [7 s0 v9 b' Y6 k+ P* g
        # 然后追加df
    / J! Q- @: w5 j( M+ g0 j" q& S/ ?  F    df2 = df2.append(orangized_data)5 T% @0 v. R5 J8 R$ R4 H
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    ; t0 t6 y( J9 kdf2
    + V) o; f8 K8 ?  A- W& d* K& p& C: v, g+ o; M& ^) p
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 5 _' h* w% `8 {8 G0 X
    ; \; k# W: {  R5 n* ^3 s+ ^: m
    ( l6 E2 c. E* S+ _# l
    二、数据预处理4 c1 U6 d3 `+ G! O( r2 _* z' ]
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。- y3 A% A3 B. T% ~+ N" m4 k) z
    9 A# z+ o9 r  w) F7 X1 L- I2 i
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    " y) s! k5 i8 s" m4 m    x = f.read()* F$ w' v, l! T+ R/ G7 i- T
    ( y( I9 L0 C8 G
    df3 = pd.DataFrame()6 T& v! a6 S, |( B: J2 [+ n
    for i in x.split("\n"):6 L2 ]; `$ u& j4 ?" z
        x = i.split(":")[0].strip()9 ^, p1 F2 N1 c* I% m) t. t) f. e% y
        y = i.split(":")[1].strip()
    - o9 V9 R2 Y  j! Q8 j- u6 b# k    orangined_data = [[x,y]]# ~, _7 c. Y5 E
        df3 = df3.append(orangined_data)
    & G, a4 V3 |* P, Odf3.columns = ["名称","英文名称"]
    8 _1 \+ i, `, n/ x6 F; S* G7 ddf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)& x5 }7 W* s  L* r
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。$ l8 M5 x$ o% I5 S- r
    + _3 z. Z0 `( Z: y
    df4 = pd.merge(df1,df3,on="名称",how="left")
    # K1 V  h, j* @) D: Bdf4.head(10)0 z" x/ I/ {; C2 U/ e% A
    ( U+ q# H4 t7 ^) `! |. h: j3 r4 M
    2 Z: z* ^# w  P1 X. |' C' _

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


    • 8 P# U! q1 v0 `" v  l/ e

      : ?8 O- o8 a' D* y% o
      5 l' m) z" L% N& v

    7 x# u/ d- a6 ?0 |( ]. i4 V( a: K+ u. ^( y" w0 }9 Z: s
    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-9-1 08:21 , Processed in 0.607251 second(s), 56 queries .

    回顶部