QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    + Y) p" I  Z& Q! Q" P7 j! c8 z& l- o- ]" T0 F
    文章目录3 m! H* G& t9 }# Y1 k2 f
    . ?, Y/ B- b2 Z# h' R% x: n
    前言3 z- f3 J( Y4 Q

    9 i' }$ g4 p1 s, u2 U" B! C' V一、数据爬取. W; _- _" e9 i6 a" ^

    : l! o' j+ a" h1 C! k4 T二、数据预处理
    - R( ~0 E* `2 I$ [! ]0 P, U! \! P; h% R
    ​前言
    7 C" n' I" P$ o6 G) A8 c3 J本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。% K5 P3 g6 D4 a2 I! z& T5 ^

    4 `3 b& T1 P0 v) a+ d6 I  p+ E
    # @( x4 o* V- H: M# J一、数据爬取
    1 o5 k5 z1 Z5 z" s5 H  K  `import requests  x* [4 T  [8 n* j* V
    import pandas as pd: y+ O% j% w/ _& ~
    from pprint import pprint' }$ e& }1 k! @( _
    导入相关库
    + u: ^) A, a" J! ?0 ?) J! a& a
      q7 [& E$ h/ A: |requests库用于发起网页请求,获取网页中的源代码;
    % `  W0 W( o: h
    + k, W4 {3 a* \; e. dpandas库用于存储和读取获取到的信息;
    5 J9 B1 I% w9 D+ p+ T
    ) K  q' N. v1 A: I( q' @3 |" G# qpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;5 T# a- |+ F' v$ b

    4 S% @2 o8 u2 x! s' N; Xurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'% @- q1 G; S/ M" @( I
    data1 = requests.get(url).json()0 R$ |% V7 ~( R8 K* t6 D
    # pprint(data1)
    8 e% V- `( O0 @  ^. ]; x: Y0 [3 w' j
    ! E/ {: `; R. |% v这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。" h0 q) m% {: f8 j8 ?5 G+ g
    df1 = pd.DataFrame()
    1 \7 U% ^+ k7 J, T) ]/ S5 n* Pfor info in data1['body']['allMedalData']:
    - U) b+ a, I; i* b% X0 a! U    name = info['countryName']
    . U" s8 A. N$ `0 x    name_id = info['countryId']
    $ m) [* F! a$ p  _" u    rank = info['rank']
    # y2 @1 K. f, o! d    gold = info['goldMedalNum']; @( p4 n0 X% w, a' e  I, {0 {3 K
        silver = info['silverMedalNum']
    ( T- u: H: h2 a% H' t% ~, _    bronze = info['bronzeMedalNum']
    4 o4 k( [$ d9 N  a9 y    total = info['totalMedalNum'], a- j0 J3 B+ e7 i  a/ q: I% h
        # 组织数据
    + @# l3 j) y2 R7 {* l+ f! ~    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    # b; G% A4 b5 J+ S$ h, {    # 然后追加df
    & ?$ G4 Q2 Y8 @/ P2 p8 z: E" V    df1 = df1.append(orangized_data)
    # Y+ J4 T- t  s# B1 P/ Adf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']2 N+ p0 A( C7 o
    df1. v: }  k1 U6 m/ w

    8 }) [+ I! N) m/ B! ~( l
    ! G/ L# T+ _" l9 o. J这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。, }: x' f' m9 r6 y/ x+ a0 x
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'  d/ i3 o& b, B3 M% k
    data2 = requests.get(url).json()  P3 ?2 c7 s+ W+ K
    #pprint(data2)% ]5 Y  X6 U9 F# D6 ]8 `0 M' o! a
    % n1 E  U+ h  c7 G. j. Y
    df2 = pd.DataFrame()/ u+ ]# K# w. G* T6 B- B
    for info in data2['body']['medalTableDetail']:% f8 ]9 G1 ~1 A, i( `+ u: ]
        english_name = info['countryName']2 S& h  l3 j3 q
        name_id = info['countryId']( k- N# P6 q7 m' f
        award_time = info['awardTime']0 C6 ~; A. F# w  O  u) q
        item_name = info['bigItemName'], o8 X! H' A2 R% J* i6 k; C
        sports_name = info['sportsName']& @/ y) V; t* g- e$ l3 F
        medal_type = info['medalType']$ U" p# j8 F% x/ A/ m  P( F
        # 组织数据7 W; K, P0 O. A- U
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]8 I2 C/ m1 S( O" \1 f) h
        # 然后追加df) X8 o9 t% V3 V+ N# x
        df2 = df2.append(orangized_data)
    ' Y$ f/ i% N2 Cdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']  V' H' y( y# m2 I! R
    df2
    7 V) J6 S' X# A7 a& v* R0 i* B# C% D$ T2 d3 c3 N" H) u$ |
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    9 e9 |' O+ v1 S
    6 N4 i3 _$ b) |2 L- e3 U( j$ S, T  I( I9 L( U! s
    二、数据预处理- z  L) ?: R) p1 y
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    ! I. h8 S$ c  K- q; r
    5 [4 S; R$ u4 M- N  _with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    * K7 ^& F0 m' L/ y, N6 a% l    x = f.read()# K' y/ e2 V; C! q7 N1 t/ ~

    5 F# i# P7 A) q+ W" kdf3 = pd.DataFrame()
      b" g1 `5 u. w) Mfor i in x.split("\n"):
    1 S: [5 B9 q* d    x = i.split(":")[0].strip(), y0 b: S  _/ w$ n
        y = i.split(":")[1].strip()/ r: v5 D+ ~8 C1 D9 b- K# k
        orangined_data = [[x,y]]
    ( p# L0 ~" `/ \) o! u' Y" `    df3 = df3.append(orangined_data)) E3 x* l( T$ V2 `- z4 t
    df3.columns = ["名称","英文名称"]
    - @3 a, I- k; `- v' M2 Kdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None). I, h2 Z/ m) B0 ]1 m
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    1 F3 i+ H+ \! M7 g2 M
    ( L, Z9 ]  ?; Y) y0 w. Fdf4 = pd.merge(df1,df3,on="名称",how="left")
    ; N) k& _( {- d. r& ^! ]df4.head(10)
    7 a. N9 _8 ^% ^$ y
    4 s' c' L  q+ y/ q. G/ Q3 A, H9 j0 Y
    6 d" v% g9 r) f

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


    • 5 C& ]" ?/ \, ^) O( i3 z* I

      1 t/ U; r( u1 f7 k. Y6 N$ L  C) U" `, F4 h
    " h- ^$ F3 V: e0 G/ R5 D1 G

    4 K; D) F/ Z8 ^: j0 y7 W
    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-19 02:34 , Processed in 1.868342 second(s), 55 queries .

    回顶部