QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录1 y8 d* U! r* `& {# d' e
    , B$ F( H8 a8 @
    文章目录7 x6 m; a# \! Z6 u- O
    ( T% ~' g  v4 k8 V6 Y1 U+ }' z) s
    前言/ f) ]9 V' R9 F8 \( S* j5 F1 o

    4 L% C  M- B7 A, d一、数据爬取2 C8 F" ^/ ?! e7 |" z4 M; \
    * N* H6 X/ L) F0 h0 R- u+ D& h! r, J% \" h
    二、数据预处理6 l4 o5 M' m  f9 W

    % O6 g& O9 O; i" ~" I, {​前言+ l( v" G  y! B1 ?2 K$ Y3 H1 ?- g
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。2 u2 `$ f% S) b' K. [
    $ W3 x' u5 z2 b2 g, v

    ' q& e- v6 d3 s# |, a9 x0 K: {一、数据爬取  D( d0 p" _/ o! B4 W6 j% y: B9 Q
    import requests2 ~& h8 W2 F, E
    import pandas as pd
    6 x' v! B" T+ M# Lfrom pprint import pprint
    1 Y2 b6 g) N: I. @4 ]3 Q5 W导入相关库
    ; L  Q/ e7 a) C; J; C. K" f; O7 c/ b3 B  n2 ?
    requests库用于发起网页请求,获取网页中的源代码;
    ) n1 T$ F  J; _/ O7 T& o
    / C; A1 D8 H$ a5 r  j5 E& m) ppandas库用于存储和读取获取到的信息;
    8 ?- k9 g9 R2 @$ J: B8 j5 m6 X: Q4 B2 Y' \- `
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;5 B: l5 t0 `; ^% W' S3 ^
      H9 G- k; z& R7 K/ s2 m
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    - D' i; T3 j" Jdata1 = requests.get(url).json(). ^/ ]9 N2 _& S. v; E" U8 ^
    # pprint(data1)" V+ ^3 `2 I) n  }1 a4 b4 o5 B
    5 P* N, j# o/ i5 _! w- \
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。7 `6 I' |. `" L/ T' @/ j
    df1 = pd.DataFrame()
    " h5 W. i; e# @for info in data1['body']['allMedalData']:
      P& v7 ^+ F' u( p: l" a    name = info['countryName']. g" X! H/ Y$ S; m5 V* W) ^4 O5 z
        name_id = info['countryId']
    0 u1 `, [" R" d+ [7 S: Z$ d4 C3 B    rank = info['rank']
    5 e2 b' ]/ h! b5 n; d& Y    gold = info['goldMedalNum']
    8 h% O% v7 k. ~9 m    silver = info['silverMedalNum']
    # _- \0 [) K6 R" \; v0 o* m' Q    bronze = info['bronzeMedalNum'], `; ~+ ~1 T0 ?; L
        total = info['totalMedalNum']6 k% c4 I) {$ `, ?. l! ^  Q! {
        # 组织数据
    2 C' j9 Q. t3 H6 a: m. r* Y$ o* L    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]3 m1 n& \1 S7 [- d, m' j
        # 然后追加df
    ! e& _8 H- f, G6 P( R    df1 = df1.append(orangized_data)+ G; `3 X$ E2 N0 I- f  c
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']% M( Y; _) i; u& }0 @
    df10 X9 w, Y1 _* g9 A: t$ f* A3 S) E
    $ a/ c, d. W) h% p1 E6 ~
    2 \1 t/ g1 M+ c/ R
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。- Y, U% |: k5 A
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'  M4 C' Y( P% y9 @
    data2 = requests.get(url).json()  B0 @9 c0 q8 u
    #pprint(data2)9 R4 L- U; x5 X3 |

    ' |9 i" k6 f4 v% _/ Rdf2 = pd.DataFrame()' R) M; h$ b! ?* Q/ l8 \& U: t
    for info in data2['body']['medalTableDetail']:) m( D9 G6 H6 s6 X- G( x! c
        english_name = info['countryName']7 m/ [0 t- N% d2 X& e6 i
        name_id = info['countryId']
    " ?5 |  j( [% h  ?$ j5 j    award_time = info['awardTime'], S* `. ]# T2 v: ?5 ^- d$ {
        item_name = info['bigItemName']4 |. [$ Q& J  i! r
        sports_name = info['sportsName']
    , U( S" Y  J# w: }) n    medal_type = info['medalType']% b. U' r8 L9 A$ W0 h( W
        # 组织数据8 B& C- f+ J3 e1 _: U% U! r' v1 n
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
      ?7 F5 e6 M$ {5 v- `    # 然后追加df' _% u, t4 J- l3 u
        df2 = df2.append(orangized_data)
    9 v0 A0 L5 K1 R; s" Z( n0 R# i8 Qdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    5 h* k7 H8 h8 q0 q! p  m" o- s" F2 Rdf26 Y. \1 C! D, R1 h  B, y  T8 l
    ( A% R% i" c8 F# @3 {5 J
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    5 H& h& u7 R0 s  D( Y- N( c0 k; i2 A5 n9 Z" y! u

    5 a! [( _$ V3 w( p二、数据预处理2 B  F: u& F8 X& N. |
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。7 ~, F+ W- A( U  r( D$ f8 G& m- _
    9 I+ V; ]# y8 }* _$ o5 y; Y
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
      n& [8 w: j) \0 n4 J! x    x = f.read()
    2 H- u+ x8 `, a1 l' @( z! F7 v2 W
    3 z! J# R2 ~. G" u+ Udf3 = pd.DataFrame()7 j. E) j! t+ `! `+ _! Z
    for i in x.split("\n"):
    ) X$ E; j* t( z; G! q9 r) _    x = i.split(":")[0].strip(): i- ~5 b. b: x9 U" P
        y = i.split(":")[1].strip()3 Y# p; I+ |& O8 _. d7 ?
        orangined_data = [[x,y]]
    % y% H9 B# K9 P0 R4 C2 D    df3 = df3.append(orangined_data)
    5 l$ V5 i9 F) m) f) sdf3.columns = ["名称","英文名称"]
    8 D% ?: S* I6 Gdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    ' I" K- D) Q: r+ e表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    ! O4 m8 @; v# m+ X/ T, H- k7 @* q9 k5 [# z8 P$ {* v
    df4 = pd.merge(df1,df3,on="名称",how="left")/ t6 W2 L  ?1 @% m
    df4.head(10)
    + F  v% j' f- Q; M! i
    0 M  k0 q# [5 Q- ?" ]4 n- S& r3 i0 b" N' j; ]

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


    • % Y# Q! [1 O8 j. p3 ~9 R

      2 k4 h: F6 e" F6 w: f$ I3 g  _$ p/ ^, K

    0 D. h$ u5 Z, O& H- l: Q3 N8 }2 `3 S( N. A! m% 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-4-17 04:46 , Processed in 0.353912 second(s), 56 queries .

    回顶部