QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    目录
    ; M" |% i6 g7 }  B3 p4 ~# [4 H) \9 t% [3 l  n$ l
    文章目录
    ; F6 l& `. ^" n. e: ?% [. y% k8 B2 ~7 t: W
    前言$ J7 ^, r' h' I4 ^- n  c% l

    ) \) Q. J  O3 \$ _一、数据爬取
    # ]  M: \4 Q  _0 ~. p! L6 R+ l/ S" F" o
    二、数据预处理
    / n: y$ l& s% E! p* H0 E  v
    : R* J( G6 P% @2 F& `5 A​前言
    5 W( P  W. i: O本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    4 I6 p' _- L8 a2 ~: r% H2 Z# F# y
    4 K% k, t  a' h5 M) S
    - O* D; `, F- `4 D1 N5 `8 m一、数据爬取
    2 c  b/ ]6 x% Q6 u/ f- N: Eimport requests
    0 j# e# m; b+ a% k' c3 Q- P, d% dimport pandas as pd! H! B6 K4 F* Z5 R# t8 L/ t
    from pprint import pprint
    & B) F9 k5 ^1 E! T+ {) \5 n导入相关库
    5 C3 v& K" t" S4 q* f( T( [/ m- T: R$ z+ y- G: l
    requests库用于发起网页请求,获取网页中的源代码;7 s" O- p* W1 a
    3 R1 J2 k. i0 i# ?
    pandas库用于存储和读取获取到的信息;" a- x$ v( y' U" e5 @) x
    , e9 T- d+ ]% {! M
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;& I, C" B2 n2 ^# Z) D" a. ]* E
    + H0 L: ]9 k+ W2 l4 G
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    " j; v/ {0 x' Udata1 = requests.get(url).json(); O, x1 s7 i) u( N7 L
    # pprint(data1)# x6 ]' a, m0 z2 f  A
    ' O+ i! W# x3 w% @' n2 u$ r2 _/ e2 ^
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
      v: j2 P' u$ c5 odf1 = pd.DataFrame()
    9 H3 C- X$ v, y5 afor info in data1['body']['allMedalData']:  r8 |5 x1 K9 b5 R" t0 G+ o' a
        name = info['countryName']
    4 ]' Q/ a& y' D5 c/ r: z    name_id = info['countryId']; Z* s6 `, b6 m
        rank = info['rank']
    2 Z4 _# d1 A0 I. T    gold = info['goldMedalNum']% k" Q4 z; n1 A: N8 p
        silver = info['silverMedalNum']
    ) \! Y% C1 b# u8 u. _  ~3 V$ X    bronze = info['bronzeMedalNum']
    5 W* Y- R# [) U; L0 l    total = info['totalMedalNum']
    / X! J, k# n- l1 f% W0 b* q, @    # 组织数据. V5 a* M% Y9 y6 L3 p
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]/ U3 v: l/ J: E- q1 }
        # 然后追加df
    ! h1 |) J) ~6 r; v0 f' m! o- @    df1 = df1.append(orangized_data)
    " Q; D1 E$ T  u% O: V$ ldf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数'], [) [9 P7 L8 {1 W& U5 u
    df1
    0 F8 K1 b3 V" q9 i% q5 _8 ~: ?6 w9 B9 h' Z4 K" {5 J0 N

    ' E) H0 a& c0 B* z( M8 ^这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    " F2 T) h' \8 X& B+ Eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'- {- S) F: j; B: f0 z0 e7 j
    data2 = requests.get(url).json(). p+ G. q+ q, @4 l# b5 O  t5 z
    #pprint(data2)" M$ J' h# e1 L5 p# J
    : B+ p0 _+ S- f0 K) c: h, E8 u
    df2 = pd.DataFrame()$ X  |4 S$ N! \3 M" x1 f
    for info in data2['body']['medalTableDetail']:+ k( m1 ], `- ?2 L1 b  n- s
        english_name = info['countryName']+ e  r) N+ l' h3 L  I$ D3 E9 O- |: a/ e' ~) K
        name_id = info['countryId']# d, ^3 `/ I3 F1 e$ \
        award_time = info['awardTime']
    1 n0 R1 Q  g! a! M" p& I    item_name = info['bigItemName']
    8 ?& H; W. |  K* k    sports_name = info['sportsName']3 U9 j, F: b9 L3 T
        medal_type = info['medalType']
    0 w/ g3 C5 H5 V* m    # 组织数据
    & {/ r& z0 b7 ?& I, U: Z8 A7 Q    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    ) P0 v3 A2 L* E; k* u    # 然后追加df5 ?' W+ ?" @+ @* z  c6 `
        df2 = df2.append(orangized_data)9 K, }6 I, `; v5 A" q/ i
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    7 @' J' g: O% x6 O( q& `df2+ n$ O/ [  _0 T' Q, o7 v
    , \4 ~4 [2 b4 g7 @! U5 S, [4 k
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    % ^( E! o+ A4 A) i* ~% X3 N* J% |8 w% I

    1 V/ y8 B- j' F( l/ X二、数据预处理8 q% I: p+ @! I5 N
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。3 p+ a2 q1 `, I% m1 {

    " X3 u' d3 N2 A4 Y. H4 xwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:0 H; f( _: ~- I+ _4 Z6 R) H9 B
        x = f.read()
    2 n  I4 R* J& K1 |# r6 R" F$ v( X% P$ a$ ^1 `& `" R
    df3 = pd.DataFrame()- c2 c* n$ Z$ |! q
    for i in x.split("\n"):* H7 e! m1 x! V
        x = i.split(":")[0].strip()$ Q) c4 K+ M5 A- w7 j
        y = i.split(":")[1].strip()7 H) R; T4 c: j' ]3 f3 a, `, y/ w( C
        orangined_data = [[x,y]]* ~# s* w  I+ ]6 h6 d3 x
        df3 = df3.append(orangined_data)
    # ]8 W+ u3 y2 \" S* ]df3.columns = ["名称","英文名称"]6 ?: ?. k; e3 s
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)& N/ ]0 c' l. G" C+ C1 ~
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    , ?! K% R- ~: N; K8 y# l* j
    $ a8 j; Y, l7 v4 L& tdf4 = pd.merge(df1,df3,on="名称",how="left")
      T* i( H) l( p4 ldf4.head(10)
    ( @; d' t) n) d) A& t1 O
    8 Q2 E( d/ N8 P0 t, p/ p( C; J/ y
    5 W9 o+ q9 }4 t* a+ G

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


    • 9 u8 N6 {8 T$ i( s" e1 e
      1 v& W/ N/ I7 L; E/ \9 O+ \

      ; G$ i# y$ ~$ g5 P
    9 d, M* a7 |0 @; h. G
    4 k. Z3 m* |( e3 b. u: ?9 i& [* z) w
    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, 2025-8-4 02:48 , Processed in 0.676954 second(s), 56 queries .

    回顶部