QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    ( Q% j2 w) N2 N" h+ y+ T% ]6 [5 w$ R
    文章目录  ^. S0 t, J3 L
    - x9 f. k; g) E: v# w. \4 m; |
    前言
    , R4 S( E/ J$ h0 x5 F4 U
    / P: O: \" I% Z( c: H# W* U: p! ]一、数据爬取% O4 q+ h: z& M7 W7 l0 z) ^' V- y

    " r$ u6 g2 s/ D% l$ u2 V) A6 q二、数据预处理
    / L# L2 ~7 s* B; N& P4 U/ k7 P+ q3 x4 r3 L" _7 A# Y
    ​前言
    ' y3 ^. n9 \/ K( W本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    % ^" z" s, K. U' I) I2 X7 s+ r5 b& D- Q+ j  F. g, w

    0 }7 M5 M$ N% J2 V) U- C一、数据爬取
    ) N0 [9 J+ c( F, \, U4 oimport requests4 H) r5 E" f: O+ {
    import pandas as pd( S* W" u. F' O: K( q( p. R" D
    from pprint import pprint
    . }% {! @' w8 J  b3 F导入相关库
    + A3 }: h# z* U5 J7 ^3 i( J. I1 f. v: M  ?
    requests库用于发起网页请求,获取网页中的源代码;) d8 y4 O; \$ B! d% \/ {  w

    + ~  ~. ?5 u4 ~; n" }pandas库用于存储和读取获取到的信息;
    7 x" g! F6 x# e% `
    7 x; U5 p; [9 hpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;  \- W4 \9 l" {, x, v
    # W% y1 Z+ ~% q" U& l( c
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    * j  S" Q# q% }' O' fdata1 = requests.get(url).json()
    ( R3 _8 I1 c8 Q0 ]. Q% C# pprint(data1)
    , k9 r( Q8 }2 e
    $ O2 j8 W8 W) M这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    - z* ?! p) q. z' `df1 = pd.DataFrame()* B3 p( t* R& {) v  f* j
    for info in data1['body']['allMedalData']:
    6 Z5 G& U) }: r    name = info['countryName']/ z0 {2 u$ H- r8 t3 N) Y* O: Q
        name_id = info['countryId']: v3 S# o0 C& \. b$ {
        rank = info['rank']5 X5 G9 n' z5 q8 `/ L3 j" G+ }0 ^
        gold = info['goldMedalNum']: m6 ^  [6 ^$ M( I! t
        silver = info['silverMedalNum']
    6 ^+ d( n5 b% i! v, E2 e9 H4 e    bronze = info['bronzeMedalNum']8 J* Y; s1 v  w9 }$ a7 C5 g
        total = info['totalMedalNum']
    ' W5 ?+ R. }! d8 v+ o; g    # 组织数据
    " v6 n3 A3 K# X/ ]    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]], D9 j& d# u9 R0 V0 f, s
        # 然后追加df. }9 x4 N, ^% Q
        df1 = df1.append(orangized_data), U8 j% K1 C: q; {' s
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']! A  j0 [8 V7 h& t5 q
    df1
    - d' x/ e- {- M) k3 d4 g1 w: x: i" ]3 c) ]) P  ~
    ! g4 G$ g: i# a
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。4 A0 I; a/ k4 Q- M( S1 f' o' M9 ?
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    ! j# J+ m! G9 Y( m( h0 bdata2 = requests.get(url).json()8 c$ F+ ^7 q& m' k2 U$ q' U6 a
    #pprint(data2)
    8 S) O7 u" t: B: ^/ {1 B& o& |+ ]: ?# `8 C8 u2 S( z
    df2 = pd.DataFrame()
    $ ?) y$ g! E: ufor info in data2['body']['medalTableDetail']:& ~, k8 w6 `% f( ]2 W
        english_name = info['countryName']$ G6 ^3 [! V9 K# G7 ]
        name_id = info['countryId']
    / }) |' G' E" y, I    award_time = info['awardTime']# b6 n* s( b1 G1 f
        item_name = info['bigItemName'], ?9 x) g7 u' o# x: V1 X
        sports_name = info['sportsName']
    8 [- t. r8 H  F' p& }    medal_type = info['medalType']) T7 k% g9 U9 Y6 n2 f$ j* O
        # 组织数据3 Y7 s# p: A5 j& y/ d! `/ G
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    : j% y+ y  z- z6 p# U- C+ [    # 然后追加df1 J1 j. p% G2 p. W3 H
        df2 = df2.append(orangized_data)+ x5 `7 T- k( w( u) r
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    0 k/ r* ?$ z, S$ Z* e6 Zdf2! w& Z9 \3 i( B
    8 U  G. s0 s) G
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 6 l& l2 x5 f, s

    4 S$ A6 n$ \. r. R2 j! A" L; J, p! J; k5 t# T; H) ^6 w
    二、数据预处理
    , X7 `# u/ e- T, g由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。' H( t/ e. s' c3 ~
      I: D0 M! n6 P6 m6 X# g  J
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ) c9 L% g  P0 N& s5 H2 I    x = f.read()
    / u0 p2 f( h; M" u! n( q! I! Q9 u$ g; [3 `% L4 l2 d( h# x: V9 W
    df3 = pd.DataFrame(): b5 K4 `5 D$ o. k: g, b' Z# S
    for i in x.split("\n"):: E. M3 [2 c4 m, a
        x = i.split(":")[0].strip()
    3 ?7 ?+ g# H- f5 u$ g    y = i.split(":")[1].strip()
    5 s6 I' A, V/ C7 D; B& @. J" v    orangined_data = [[x,y]]
    2 Z6 U0 Y  f$ ?/ }7 H    df3 = df3.append(orangined_data)
    ! l; o. C0 e, x, K/ l& Q% B! h# e2 Mdf3.columns = ["名称","英文名称"]' w! c" T! ~1 N( A
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    % b9 j5 Q3 A( p2 G, e1 R' V" o表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    + E+ c4 z( t' O; B3 O# p& K- S# v
    0 D4 r+ ?( i/ }8 x% w! Wdf4 = pd.merge(df1,df3,on="名称",how="left")
    / ^6 I- \" u0 \5 h' vdf4.head(10)2 y' l6 `$ S7 J" l$ y
    . j+ D. F3 Z9 Z: Z, _' G/ ]

    + w) b; g6 _/ Y) m, {$ H- G' u

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


    • . `1 A" B1 P' G7 ~

      6 K# l  h9 @+ S& i% n
      1 q. F' S& I- u0 X
    " j2 f4 u2 N) O! k0 m9 \# N

    7 Y2 F! B; \4 u( G, d
    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-26 16:34 , Processed in 1.195806 second(s), 55 queries .

    回顶部