QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    1 ~) a3 W3 }2 s# j6 e, v
    8 C; D4 z/ ^( e- J文章目录
    5 u" q9 N' e: B$ ~+ x( K( M+ F: e5 [  F
    前言
    . R: D$ U4 S; X, f3 B9 f. N3 G8 Q
    : N# M/ m! |2 ^) f) C& F一、数据爬取# [# g0 \8 {/ h- b

    ( U" q8 k- [7 z9 N; {二、数据预处理. J6 k( H- Y) J
      `; i) Y( v' r% W
    ​前言
    / a$ T2 n, \" x. {; g) m6 r0 B/ u本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。/ x. ^; M' a! H

    / X+ x7 s& |4 G8 P' M/ e$ p1 }1 P8 D
    一、数据爬取# a. Y9 J% U& N9 E7 p: w
    import requests* \  b& z! Y) S& E; _  j. t- p
    import pandas as pd
    8 _: F" l0 G/ `  Q/ p6 U5 I& v; o7 Lfrom pprint import pprint& A9 [  @+ q0 y3 R, }0 I
    导入相关库
    5 G% d2 Y9 P3 _8 l6 ]4 J% ^( b4 _* s" @, _. C
    requests库用于发起网页请求,获取网页中的源代码;; h/ [$ c5 ~9 e0 y! ^

    ; P. E; p0 S9 N8 `& N5 e' apandas库用于存储和读取获取到的信息;
    $ [' G5 @8 W$ X/ k
    ' T; b" v  o! n  J' z7 C( Lpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;( l- A7 P) M, J0 _  Q3 Q

    ' F& {; F9 y% a8 ^, eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    0 R' U% [% Z- Q# N5 a! y! d& I: k- o+ Pdata1 = requests.get(url).json()
    . Q9 y& x% z% @+ t2 g# pprint(data1)
    - _# v; h- E. h! @. T$ }" b6 Z$ h4 L, G" y1 p
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。' P6 y9 g7 J! o* b# S
    df1 = pd.DataFrame()
    * g6 }, t. `( \- w, hfor info in data1['body']['allMedalData']:7 M& w6 {& E  @2 |# Y0 D
        name = info['countryName']
    $ D: l) s" c+ Z& A, C    name_id = info['countryId']/ s0 {! G7 @) ^( J' h
        rank = info['rank']
    1 H/ z) G/ Z" L) l4 @& J  H4 V# R    gold = info['goldMedalNum']
    2 `& A( Z: ?# ]7 D) g    silver = info['silverMedalNum']
    7 D) h' y+ A% z! J9 V    bronze = info['bronzeMedalNum']
    $ i" m" q; X( H    total = info['totalMedalNum']( @% c2 W/ e" _- Y
        # 组织数据  ]3 i) C3 ?( I5 x
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]$ ^/ Q9 q8 O9 v
        # 然后追加df
    3 z* g0 \& ^6 `( G2 |# I0 d    df1 = df1.append(orangized_data)
    6 L& q3 ^5 d% p- T6 ndf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']) l2 p# t' j; c( j
    df12 d2 W9 n9 K" [
    " U, m- Y8 `! d; m. M* H% P, q
    1 Y" g+ k; A( h9 ^" b2 K
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    9 Q% M7 `7 \" b6 @" O+ Burl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609') v4 r8 w: x1 A- Q- E+ z3 K
    data2 = requests.get(url).json()/ N3 X' {6 M5 S7 c8 w% a0 V) A
    #pprint(data2)
    / W# |2 a4 q& I0 l! M% U2 N3 N; u/ R; g9 p
    df2 = pd.DataFrame(): u& h  Q: y/ O* g
    for info in data2['body']['medalTableDetail']:6 C( ^6 N3 a6 K6 j5 o2 D
        english_name = info['countryName']
    - d8 H4 u' n) `; R3 s8 U# ?    name_id = info['countryId']
    , Q0 O# Q2 i3 P# {2 ?* a- ?: O    award_time = info['awardTime']; |8 X  s9 \- m7 X6 ~- k$ L7 I
        item_name = info['bigItemName']
    & ~  K6 ]1 x9 Q5 o    sports_name = info['sportsName']9 _$ w% e7 v  M4 S  _. V6 L& H* G
        medal_type = info['medalType']
    0 @* N) f6 M, w% y    # 组织数据
      H7 D9 Y' v5 e  x" B* `, D% U& ^    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    . q' s* D! r! d- M8 a: ~    # 然后追加df9 O3 M) f9 j+ }  E- e
        df2 = df2.append(orangized_data)
    ' ]6 Q- @* m. L! Udf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']6 r, \- S  h$ {5 K9 Y2 }" u7 c4 O
    df2
    3 `: F; w6 H5 v- @2 v& Y) j3 G- \1 E+ h# F1 s
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 - B* L8 @2 ?% G* G! F

    " g2 k" G0 ?; S# S: E: s1 ]+ G* l7 o7 Z! M1 ~
    二、数据预处理
    ( ^4 ^  q7 r$ `, |4 t8 ^由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    & b! c- X- I. Y7 @8 u7 J' \6 W; h3 g# L" M% F) _" x7 G9 W* r9 Y
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:. _! Q+ j! a* w& v& G+ I
        x = f.read()6 E* S0 S* [+ U

    0 o9 X- v/ E7 j2 n; ^: q9 N4 qdf3 = pd.DataFrame()
    9 e: f+ Z' p' |for i in x.split("\n"):& _) b0 B% v* ?1 g+ n8 B4 V
        x = i.split(":")[0].strip()
    ) D6 X0 e) M# \% b* S    y = i.split(":")[1].strip()
    , j/ M8 J) D: G! \+ C    orangined_data = [[x,y]]
    3 V. G7 O0 z- g+ F, ^) j    df3 = df3.append(orangined_data)
    / s* s; P: Q5 M+ K4 S* Wdf3.columns = ["名称","英文名称"]
      W* v1 d; R  j: F& q$ Y+ E  r: [- Vdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    * S' [2 z) s- A9 h0 z$ M) i6 W( \- W表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。! J9 S) r0 a% }
    / {8 I5 o: F7 @* F- b5 j
    df4 = pd.merge(df1,df3,on="名称",how="left")7 b; f3 N8 h4 {' j
    df4.head(10)0 v1 S7 n/ n2 E! _  n$ u0 X% {3 h
    . ^+ M9 g8 y- e, s  V7 C( s) X

    # G' X) m" h: l+ _2 [

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

    • 4 R4 v$ l  l$ [2 i, F5 s) i# w0 B* l

      ; A; b+ U8 p# p% R. P- c8 n0 S9 a# }. H5 t
    5 M- V/ @; j, i+ s) ^' ?

    3 T" Z# c& ]" A2 V; ^
    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-1-2 17:16 , Processed in 1.040703 second(s), 56 queries .

    回顶部