QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录5 G, G! _# _6 w; E2 e1 X* H
    / D! T; w$ |- h# D* D
    文章目录
    . ?4 J) H9 w% q# @+ ?. S) P. ?( a0 _
    前言
    6 ]' H2 g: R& y. e' [
    ; s: w1 ^4 t7 F5 j+ h" n: o4 j一、数据爬取  G7 Z" e/ ~) i+ T
    8 B  S8 C' R: f" N
    二、数据预处理& |" R0 ]; K8 K' s- h

    2 W- G: k6 y8 {2 N' E​前言! |2 u8 N  ]) u# Q! h9 Y2 y
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。1 Y/ e3 B. o1 x0 E# [' L
    - f7 X2 i9 Q& _2 o
    * t7 b( k& M/ d$ u
    一、数据爬取
    ! h* q6 v# c; [  [import requests3 B- Z* l; F$ I' G' ?
    import pandas as pd
    # y. X9 ~9 A- b! ^. sfrom pprint import pprint
    ) E) O6 }) X0 P1 t) H4 J5 f+ V导入相关库2 H" {+ _7 L, Z+ x# Z) ^% c$ Q2 c
    - i/ J/ H. @9 S; P  l; @
    requests库用于发起网页请求,获取网页中的源代码;
    / B) t' N% [7 n" l! m
    ! M6 T$ i6 m, X' v' |" M* Jpandas库用于存储和读取获取到的信息;
    ; [+ w( o0 \5 N) u
    , V6 m. }3 d! L. a8 L& P0 M  Y3 Jpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;: y: d4 `: l, L" K' E% M

    9 I, j3 v, j# b( ]url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'% C) [3 p  S' ]+ \$ ]3 w
    data1 = requests.get(url).json()
    ; r  D; r2 d6 o- B, }# pprint(data1)
    & Q. L& a) y+ y# r9 L, Q
    # X; o6 _7 j/ b% c: f/ d8 J这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。0 i/ V7 j7 w+ R( X
    df1 = pd.DataFrame()* R1 {% K- o, P8 c' Y. Z6 x4 s
    for info in data1['body']['allMedalData']:7 x" ~" C5 d: Q/ E; ^
        name = info['countryName']
    8 y( v% i1 j; m/ g# |, D8 d    name_id = info['countryId']
    + H# t- }: P. d  T    rank = info['rank']( `) a% `: x8 ]. }8 W
        gold = info['goldMedalNum']
    # B7 \/ l; \& G    silver = info['silverMedalNum']
    . g- n" _' H% G# S    bronze = info['bronzeMedalNum']3 J2 X0 R' f4 `9 b' b# q1 N' o; _  m: Z
        total = info['totalMedalNum']- D# h/ u; G2 s9 ^- ?/ M
        # 组织数据
    ) P) L- k2 v% t7 t$ Y; v    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]7 O; N# w& |( e- ^; L9 p
        # 然后追加df
    : f. A8 \' x: K. ?    df1 = df1.append(orangized_data)* O. D6 W! E0 U) O
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    " c. E. u4 L* d! `$ Tdf13 |0 k% s0 n5 E0 v
    ( K5 q1 F0 M" p4 B1 I6 T
    / H/ f' t$ u6 d8 I% _. k- {# Z
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。" F( y5 Z+ S1 K2 j; T9 K
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    6 q; x7 x6 ?# y* g# Zdata2 = requests.get(url).json()5 _" |+ [( c) X$ t' V; K+ ^# U
    #pprint(data2)
    ; y" Z2 g1 I" [4 a/ P0 V
    7 f# W9 j/ B, a& zdf2 = pd.DataFrame()8 m2 R1 h7 E9 e9 H( d5 F
    for info in data2['body']['medalTableDetail']:* a& y( A  ?+ m* N( r" r4 p  b
        english_name = info['countryName']0 Z$ K& h/ U4 ?4 T
        name_id = info['countryId']
    # \( k  ~/ A2 R; {: S: d2 k    award_time = info['awardTime']
    0 e0 W% y& t. t    item_name = info['bigItemName']
    ( ~9 q* X& {( k* z    sports_name = info['sportsName']1 B5 k- Q8 N. t+ X* y7 ^
        medal_type = info['medalType']
    7 _" q" {% u$ C" H* X    # 组织数据
    7 K8 P$ P. Y2 H7 g    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    , _0 a9 u8 Q! ^' f    # 然后追加df
    # [2 F+ M1 s! v; K' y    df2 = df2.append(orangized_data)) m9 b9 a5 i1 d# A6 W7 {
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    8 X- Z9 R/ Q. i  J3 V- a7 M, ^2 adf2
    : Z) r8 ^; M. w7 ?, y  l8 S3 C! x5 N' i& y' O# Z+ p6 S
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    % x3 E8 b6 M8 V( ]; I# G: v; a6 y
    ; v- o6 P8 O# f( N( {( _! M
    + ?/ M  X5 z* c! I' W, A二、数据预处理
    5 x# q$ @, M2 j. s) Z由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。* C: U* O  f$ b+ `; N0 ^
    # X$ N; d, `* W& z) f
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:+ t% H9 M8 }3 g6 }
        x = f.read()
      {" D& l$ w4 f; f1 v0 W
    1 S1 Y" z6 t( a1 e! N- d9 ?' t* _df3 = pd.DataFrame()
    * ~2 \  Y9 a6 t: H, V4 Wfor i in x.split("\n"):
    2 V8 e* v: b/ V; I1 l+ `) Q    x = i.split(":")[0].strip()
    , `# }: G+ v, m, U    y = i.split(":")[1].strip()
      {) H9 @. G% M9 y( |+ F    orangined_data = [[x,y]], G. B: w$ Q1 U  A4 e+ r8 L2 w. g
        df3 = df3.append(orangined_data)( k% N" _  e. n5 S
    df3.columns = ["名称","英文名称"]0 U& R* Y* q1 @  k' A0 I& v
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)6 I: \$ N# S7 v  b0 @/ R
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    5 `/ R0 P, o3 n* t  o7 w
    # c8 }- e" p# o1 L* n) U6 Jdf4 = pd.merge(df1,df3,on="名称",how="left")
    $ F! F# h& ^3 U  m& D; N) k5 q( zdf4.head(10)
    ! y; s  l. @. k) T
    4 X) C$ Y& G$ Y* Y' m* Q' C- X
    0 R: Y+ a+ u- A' R: h

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


    • ) w3 `8 i. p* n! a) M; m" |( i2 q

      # G% R& h2 X& I9 d2 \' m0 G: C& m3 D4 L+ O9 q

    - V5 u3 I; n7 b7 \1 W9 |3 e* H# Z5 c$ K9 |% l- a3 }% J
    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-10-25 03:40 , Processed in 0.889299 second(s), 56 queries .

    回顶部