QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录3 B$ j2 Y1 f  t* B0 |2 ^% d

    : P8 J% M4 M. a/ p4 G- s) F: P3 w+ j9 w文章目录
    3 n  E% N* Y* s/ ?2 B
    $ _' D$ M1 S" \- ?) D前言
    - M6 ]  c2 d& n4 U: G; n  Y" I( }5 f1 R0 v- B
    一、数据爬取
    ! p" R- c1 Z& I# K& {/ S3 e
    : V: A0 d" O7 G& f二、数据预处理
    - X2 I# Y" ~: @" |* N$ `% Z5 t. U$ s! Y
    ​前言
    0 [: V2 O/ Y& u本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。) B$ o( o7 [9 \! S" ^6 _3 \4 c' ]2 s

    ' c- o6 R, |" A/ E* y8 I2 e
    2 J) \$ Y4 p3 Q, i一、数据爬取
    : v2 u( ~' E/ \) M5 B4 Ximport requests
    ) W2 `* R# L- L! o8 Y0 I2 O3 Nimport pandas as pd
    ( H% O2 [3 R; i+ I2 G( d$ ~from pprint import pprint
    ; R4 W5 x+ k! K( Z导入相关库
    6 `" C: X+ g' d, q1 `0 ~4 B7 Z! V  c. U
    requests库用于发起网页请求,获取网页中的源代码;
    + k- t. h: i; R0 k) g2 ]+ k3 s! w. d+ i+ ]0 L; o* ?
    pandas库用于存储和读取获取到的信息;
    & W- s6 _$ O% }- [' }& x5 ]* q6 }8 F4 \- L; A( _2 ^
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    * p; n+ X- u* \: Y2 z3 R* P+ |$ q# J0 h0 c& ^! v
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    4 p; B+ m! V/ v( o% `% g4 u  rdata1 = requests.get(url).json()) n. N' E1 j% C  i
    # pprint(data1)
    $ u/ \* b: N; z$ F( K
    . n4 O2 [" M3 H  T6 n) Z5 c3 Y这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    7 H2 s3 ?6 d+ Gdf1 = pd.DataFrame()3 j: Y, P. s! P2 p
    for info in data1['body']['allMedalData']:) w9 G: A/ f0 U! ]0 p
        name = info['countryName']
      q; y# f, f& v4 S    name_id = info['countryId']
    $ t% a) Q  {* c$ t    rank = info['rank']
    7 ^9 G) o' ]+ B& R/ k    gold = info['goldMedalNum']" }/ C  F: t1 b5 F' R/ r
        silver = info['silverMedalNum']* ~: c5 [( a* k: v+ L& C
        bronze = info['bronzeMedalNum']6 F6 x% f  p% L" y% S% n' K6 |) k- @
        total = info['totalMedalNum']; ^7 D- C( P  r5 ~" c5 q
        # 组织数据; L* ?, z" X& f* L
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    " y, z) j; f- P! b9 O! O: l5 t: H    # 然后追加df
    4 ^& `! O0 ]3 u( ?$ ?    df1 = df1.append(orangized_data)
    ! H' ^. i4 s& U3 m6 a! x5 S% r1 Edf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']. _/ V; h9 D4 H7 }9 N- Y
    df1; K; K7 C( x& L! d) c7 h! ]

    ! C) ?% P- k3 J$ A, \/ t, X
    & f' n2 v. e+ v+ g! A7 D这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    ) d. K3 I7 h7 X" s; h, ourl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
      h4 v& N) K" F+ _' s1 T3 ddata2 = requests.get(url).json()
    ' B- D# B3 z- ?3 h6 e#pprint(data2)
    2 O5 r- Z1 l$ c$ r; `9 n! U
    % i  }- c( g* c0 o( Tdf2 = pd.DataFrame()' w4 X# b6 v! u* k  C7 c
    for info in data2['body']['medalTableDetail']:
    5 C4 }! [; j# P8 w    english_name = info['countryName']/ B5 A' m# q8 M& a5 ~8 H! ^  t
        name_id = info['countryId']
    9 x6 D5 M# g. n, I$ ~    award_time = info['awardTime']% K3 t4 T- w7 H5 u: `; O# i0 Y
        item_name = info['bigItemName']
    & n4 P# y3 F$ P) y5 a3 o    sports_name = info['sportsName']
    2 C7 R  k- _* u% w9 O    medal_type = info['medalType']
    ! c0 h5 T( U# `' k! X/ ^: K    # 组织数据1 D8 Z( {) k# C& h( `5 v9 u
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]5 s) f4 G% d& R4 L: U4 w8 F
        # 然后追加df/ \6 {0 O8 C9 b# R: s; D" M7 t
        df2 = df2.append(orangized_data)
    % l  c8 c2 k. P# ?# hdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% u: S0 N) V; R! O2 A
    df2
    , e, g8 Q% w  k& i5 T: N/ S$ Q1 b3 V# m  [5 Y. c' F. H
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    / a6 [4 J$ m/ @1 f4 s9 E% X* L# b" x+ g1 d* n" Q
    ) H1 U  Z/ m* K7 z
    二、数据预处理
    : N# C* J8 C0 a) D0 y由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    : l: ^) |* L1 `, R) H5 |# h, e, ]; ~7 ^2 {  G% w. }
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    . r+ l( b5 i6 k& `3 t- s' w    x = f.read()
    9 M3 c# ^: |+ x, F) ^' F8 G. J/ e8 H+ ]: I
    df3 = pd.DataFrame(), i& |0 {" t) I: Q% W
    for i in x.split("\n"):/ b5 A- c2 J0 k8 p1 ~% F1 u4 E
        x = i.split(":")[0].strip()
    ' Q8 s* J, h# M) e: ?. ~. n    y = i.split(":")[1].strip()
    1 G$ Y9 q2 U, Y! }    orangined_data = [[x,y]]
    ' g5 n" o& Z# A  J! d: x    df3 = df3.append(orangined_data)9 P: C! {9 V8 T4 H* K
    df3.columns = ["名称","英文名称"]/ z+ j0 P2 s2 |3 I" N8 M- r( i
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    , H2 `( I+ j6 W2 r- z, _表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。) |5 ~( \1 |/ i9 k; U
    + a. Y, K. R8 n/ Z2 j0 ~( A( d
    df4 = pd.merge(df1,df3,on="名称",how="left")
    & T7 U6 B+ R3 ~- d) wdf4.head(10)
    # I4 `  a9 l8 k( b& [8 M- [) \+ n. i% d  y8 i0 p  Q! {
    4 p. w+ c- U# ]) U, ?6 z

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


    • % _- @& x2 f* H* K% [' Q5 o/ l; n8 q
      7 t. h! k7 h+ m) h. S

      9 E2 ^: X' @( ~9 l* P  {; Y& C# w9 ~! J3 ^; x
    % V% O2 ~( {" k8 S8 P

    8 E7 S7 T# n/ L, k* n5 _- k
    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 13:35 , Processed in 1.921471 second(s), 56 queries .

    回顶部