QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录0 @: y& q: M4 {( ^" r* ^! }$ m

    * h; R' L$ K& P2 C% Z1 \# x文章目录
    5 z  ~: Y6 |' ?! J1 ^% ?& \
    $ w% o; a8 U7 t6 Y- y; N& j$ k6 V前言( q% x7 C- q. `( H5 t! n& b

    & s) w7 P7 H8 z一、数据爬取
    / T) |& k. i% p# l& }1 d! A
    ! P/ o6 B& X; O; O, [# I二、数据预处理+ g, O6 ?3 k8 Y5 }- j
    ( P3 ~. j( i+ g5 q
    ​前言
    2 p1 v" ]$ I' [本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。8 K# \0 ]: X. j
    4 i# B4 }+ A" I

    : F/ Z, y! w0 M! C8 h: t一、数据爬取
    5 i7 e! R2 B$ k1 ~1 aimport requests" v, U( }" }* C2 G2 A8 N) d% S  c2 K: C
    import pandas as pd8 r; |; n& n4 [% H4 e2 P+ \
    from pprint import pprint) D  Y7 L2 F& H( H9 P+ F1 G
    导入相关库
    * r! ]6 r8 C  \% v) w# V& J6 n
    1 _+ V) o8 `- ?. [8 |; {6 zrequests库用于发起网页请求,获取网页中的源代码;: v, B* K2 z. I5 A: P( U. Z
    7 U9 ?3 O$ J! B* l0 x
    pandas库用于存储和读取获取到的信息;) E5 r, j4 I# V( J/ |' q/ G. F

    2 t0 w3 S" o; ]# n) K+ L! Kpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;5 Q4 v5 \9 ~) z: v/ Y7 d7 w$ A# w
    , o- M! l) T2 ], d5 ^6 K
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    6 Q& u, t; e, N" \, f. Mdata1 = requests.get(url).json()
    3 t4 Z+ m( ?3 i0 G" ^( E# Q; M) i# pprint(data1)
    ( w- t( S! z/ _9 ?' G7 U# c5 h4 R' n1 P/ r# [
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。5 A7 l$ y7 W0 Q
    df1 = pd.DataFrame()
    6 y) P9 u5 p' c  f4 _: }for info in data1['body']['allMedalData']:
    - W5 |6 a3 d: V, A/ ]. \2 {    name = info['countryName']5 X" A2 t2 i- m1 T
        name_id = info['countryId']2 X. T  a, u$ A! A" d6 T+ B, |/ m: O" `
        rank = info['rank']
    / |& ~, J6 D. Z/ |    gold = info['goldMedalNum']+ S( p8 V* G& ]8 W5 k: Q0 @
        silver = info['silverMedalNum']
    ! G7 }& O$ q5 _+ w+ y- f# W+ s    bronze = info['bronzeMedalNum']1 W) f1 O# @5 |9 ^
        total = info['totalMedalNum']
    7 }- |, t: V0 ]! R& Q    # 组织数据
    * y: J/ E5 ^$ _. d8 }9 E    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]3 L5 Y' k- u# Q% @' S; f6 E: x
        # 然后追加df
    7 i, j" O  r/ ~7 b* K6 P+ V    df1 = df1.append(orangized_data)5 }9 |; G8 B( Z. \
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']6 A/ V: ?! Q3 q
    df1  v. G$ L$ }" q

    * P+ h9 K8 T- k3 Z
    6 j* `/ K1 T+ ^8 p  D这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    / e% _+ ]' W$ }1 [url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    7 d/ c* A: L; n) ddata2 = requests.get(url).json()
    ) R+ P+ E/ d( U% ]7 _: m! ]#pprint(data2)
    " n! H/ c& p3 ~* x: |8 `4 B/ o1 j7 M% n# f2 F* K* o6 x& U
    df2 = pd.DataFrame()
    ' o7 |; H# b# pfor info in data2['body']['medalTableDetail']:
    " ?& X( t" t+ A' {) l    english_name = info['countryName']: L+ P7 f" I; ^7 M
        name_id = info['countryId']* U% U4 w' E9 i$ z
        award_time = info['awardTime']
    - ?, i% @  i' j1 u% G    item_name = info['bigItemName']
    , v' G8 }) f1 O- X    sports_name = info['sportsName']* K; y3 L1 ]6 K8 Q
        medal_type = info['medalType']$ F. y' x7 e, M! O- `+ R: n5 \, K
        # 组织数据6 k# m8 S  Q2 S; T+ p1 T' }
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    % C  [. {: w, p+ B2 }5 r    # 然后追加df
    $ `6 `1 Y  U. r- i    df2 = df2.append(orangized_data)
    * B6 v3 a( w7 ^- v0 b- Cdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']' W: i8 j  ~1 O/ Z1 `
    df2  C% o) v5 U! q( y
    ' G! X5 @# I  j  E' m
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 0 t: O; W0 z6 n% `$ g8 c
    , I, }; G  \7 @4 _: b% ]
    $ x+ z7 i) s# S( B  m( H
    二、数据预处理" W/ u, ]6 E) c, y
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。7 {( |  S9 F4 M8 G; [+ ]
    6 T& a. ~5 Q1 m& E  c2 c
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:5 y: y+ U: W4 L+ G. x
        x = f.read()
    7 M+ A9 Y' q7 I9 [* a% O
    2 b9 f  L3 `) hdf3 = pd.DataFrame()
    % {6 B/ ~6 G  Q3 c- y+ o" Q4 jfor i in x.split("\n"):/ q3 F9 X% r5 J( f. |. ~
        x = i.split(":")[0].strip()
    3 C8 v$ ]# n2 S/ x8 s    y = i.split(":")[1].strip()
    . ^" n1 d' [1 l+ n" O1 L9 S9 J    orangined_data = [[x,y]]
    . M. K" |9 a# t; M8 W    df3 = df3.append(orangined_data)0 u+ \* @9 Y# @
    df3.columns = ["名称","英文名称"]
    / t$ e' \5 B& ?6 |. r! X# udf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)- ?/ D) f- G# _' H0 l7 x7 F
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    8 O" C  W, n5 j% R1 n. K8 V( ]& A/ G0 g. N8 `+ N+ \
    df4 = pd.merge(df1,df3,on="名称",how="left")
    : O+ ~/ y9 W$ z% X5 v& g7 v9 Mdf4.head(10)- U& _" A" w; t5 u/ {, `: ]0 L

    * f! Q5 u# s3 A* W9 h. B  Q3 k7 J9 Q! F) M

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


    • " q4 \9 e/ ~. c
      5 ]  ^0 M$ l9 m% T, ^. S! J
      % @8 u. d: M& B( j" D, t9 X8 V

    ) Q+ j3 n) E  D6 p& [& Z+ F9 {% V6 w* o* I8 v' T7 B
    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 19:00 , Processed in 0.376217 second(s), 55 queries .

    回顶部