QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    5 \. `/ v$ A5 u) N) |8 ^, N
    # o& m4 l8 W. X1 y8 a6 ~文章目录
    3 s4 u$ T" {( d6 d+ X9 n; |! b/ Z9 s0 h( i0 s4 g% e3 r) K
    前言% x; N; v* }% h/ x. |9 x

    + r, ~" H. Q# k- V一、数据爬取/ U7 ^, ^' v& P* w: B* f& d' @
    8 I- c/ D  F7 Q7 ]
    二、数据预处理
      r9 ^5 o% j0 ~% O0 `* l& e8 d6 r3 Q3 ^1 A
    ​前言4 E& C8 v2 l) V+ r* f. N
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    1 \. W1 W2 ~9 D  ]1 e' D3 k( j) E; c4 F) ]) B& p  F& B

    6 @% d5 a6 z4 @  P" y4 S7 Y一、数据爬取! ~# b4 b2 K: o) S9 g
    import requests* c! U$ z/ S+ R
    import pandas as pd+ Z) ?7 w  b- i, V6 @; k
    from pprint import pprint
    ! L: p( c8 F0 T9 s导入相关库
    ! a2 Y, {+ K  h* X. `
    ( p! v/ U) S- Y4 U  grequests库用于发起网页请求,获取网页中的源代码;
    & ^. q- u8 v8 o# W7 D5 P
    , c  w2 K, t; Ipandas库用于存储和读取获取到的信息;+ V" h5 H1 N0 ?7 g0 j1 R  F9 [. {

    # c+ G' K6 ]+ N8 q5 ipprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    3 X9 R; z. L% z# y1 k8 S2 B
    1 M8 X" I' C5 J$ J) yurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    8 G" y1 f6 a* n) y4 ]9 g6 Q8 cdata1 = requests.get(url).json()
    ; X+ I9 O+ ]: `# k7 j+ Z# pprint(data1)1 v/ k; e. Z$ c7 e+ }
    6 w  @) m1 T8 m( p- ]& c
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。( C  T, r/ y& X
    df1 = pd.DataFrame()
    - G) H  K$ |0 n0 i# s% ifor info in data1['body']['allMedalData']:5 {/ D: r8 X; [
        name = info['countryName']% x1 a) T* t6 N9 t3 I
        name_id = info['countryId']
    ( I# @, \& b$ t. |6 M    rank = info['rank']- W% O5 x  ]( S0 M6 s  [) O
        gold = info['goldMedalNum']/ S. L/ S) f; ^
        silver = info['silverMedalNum']: {( D) u$ w6 E# z4 }1 o
        bronze = info['bronzeMedalNum']
    8 \$ [; t: m; w. ]) i! M( J    total = info['totalMedalNum']: N( ?: [3 o: p( W
        # 组织数据
    ( i, ~; t2 H# V  O) g( R    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]; I  Z% b/ N5 U# U6 b% F& H
        # 然后追加df
    5 P' V; e  D- f, h; r! b3 }' |    df1 = df1.append(orangized_data)
    - x+ f: }% J8 X* r. x; Kdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    & g: }3 b- x, B7 q$ adf1
    * X7 ]+ I- d- J4 [- \; S: x9 N5 K0 [

    : {: d7 W. d% k- h9 ^; D+ I0 j- G这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。7 W7 s/ X4 K" D' j
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'9 F! Y6 O; }, _+ x& V1 _( ]
    data2 = requests.get(url).json()* r9 N6 a4 R2 j  j
    #pprint(data2)
    ( I* C" j4 f7 _6 d5 ~# A# s6 R$ \; }9 w2 _  {% ^" \& h
    df2 = pd.DataFrame()1 ?: E1 j8 r! d- K2 c
    for info in data2['body']['medalTableDetail']:
      _8 b6 v1 `2 [: @& `: ]; [    english_name = info['countryName']2 G5 x; g: ]" X: R! A" W* N; O
        name_id = info['countryId']
    , n) N( C# K/ {" `8 m2 D& ~    award_time = info['awardTime']
    4 x6 x. M* N% |& v3 X    item_name = info['bigItemName']
    ; P1 |3 \% S6 |+ i7 W% h    sports_name = info['sportsName']
      W2 {) G) C/ K' ]# B2 V1 x) ~' ~5 M, d    medal_type = info['medalType']- S, q. ]6 U2 [! P" C$ d
        # 组织数据
    / }0 B( A4 A/ E' |; v. a% F    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    ; O5 f  ?8 ^& o$ c    # 然后追加df7 O5 M7 S0 `' I+ n/ G
        df2 = df2.append(orangized_data)4 O) n4 N3 U3 c4 X. B
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']8 n* ]' K7 h5 c
    df2
    - `# g: I7 z; Q* b6 M; E2 y4 |2 o8 m; e( k" P2 I3 r, P) E8 r+ l
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 6 F. k6 B4 b9 u8 }" ]) l* H

    * N3 @  v9 v3 O% d( B' g) l/ Z& F1 y( L7 z, O3 L/ H4 P# \
    二、数据预处理
    ; P& E1 X* P/ n* z: x: N: M由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    1 m2 u3 i$ g8 x: i0 V0 |5 ^( U) R/ e- @+ j- d
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    7 ^% N" ~2 K8 W4 m    x = f.read()
    * z# Z0 ~0 G5 @) n# S% Q4 [7 d; l& Q( c' P" [( @+ Y* w2 n
    df3 = pd.DataFrame(). w: O1 M1 J$ }$ A
    for i in x.split("\n"):
    + l* k! S" c1 l" Q    x = i.split(":")[0].strip()/ E" d; J7 a2 {
        y = i.split(":")[1].strip()
    3 J* N# A2 q' @9 m    orangined_data = [[x,y]]& q( _2 f: N' C+ y
        df3 = df3.append(orangined_data)
    ! Z1 W4 ^8 t  N% X; [0 K$ kdf3.columns = ["名称","英文名称"]
    2 P9 i2 T" q$ l5 u, ~' xdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None). M8 g- B2 \4 C' h' O% s
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    + G1 {0 u# [; u$ Q; k( L& M& W# H  c5 [
    ( C! n0 K& [! M- D5 Qdf4 = pd.merge(df1,df3,on="名称",how="left")
    - {8 |; v3 f! U/ ]! z' P8 [df4.head(10)
    $ H& g) S. w" I6 U9 L' O1 f8 M/ h/ J  F0 V' w2 v' G2 }9 a( ?
    / g$ C/ f8 q) y! P/ [

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

    • ; q5 y9 b5 h/ L1 \: Q3 }: Y

      ) s- @6 w) s) C* m' K5 c# X# o# y6 ?- W' N& v1 ?

    0 Y! e+ w8 m" X& q& o0 f) W3 q- u2 Z! m( F
    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-6-5 04:57 , Processed in 2.850442 second(s), 55 queries .

    回顶部