QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    ! t, }- p, n" x) g
    2 [5 D# v* z/ H* ?0 y2 g) ]文章目录* x6 i: a6 O5 ^  ^2 C$ i+ X4 j

    , x* M+ {2 x8 }前言
    6 q6 r, A7 Y% c9 L" x% F! x+ y% O- `( A
    一、数据爬取
    $ P0 O4 r+ F2 P) \5 n) D3 Z
      `4 p) c; [. o3 W) w. O二、数据预处理
    1 a, J3 y9 W' X$ h
    4 v+ I* k/ F8 A" c$ ?# N$ z9 r9 N3 {​前言6 x, ^0 u  P( Y. l
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。4 ?% n, b3 @4 a! u

    4 a+ Y8 M8 b# R  I2 g( d* ?
    5 ?- |) U( U; W  q8 J' k( a一、数据爬取/ m8 X1 B1 j8 _0 Y2 ~( d
    import requests
    / ~% l1 n# r, ^& P5 g, H8 himport pandas as pd. x  [7 r+ U, L4 @
    from pprint import pprint
    ( D+ T$ `- H, T4 @- V7 ~- K' V导入相关库
    . i2 K  y& w+ L+ c# e. W' V) ^6 I8 B4 M+ V- n% f
    requests库用于发起网页请求,获取网页中的源代码;
    ! f1 A, r/ Q9 Q
    % c  L- [+ L: n& Q6 ?" N6 }2 Q/ [/ _6 _pandas库用于存储和读取获取到的信息;+ R9 z  \8 y. n& B, f

    : t# Z* Z) `- ~! ^5 w* qpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;) V* J1 b: B% V2 K0 a
    ) m5 e7 [1 h0 R& v, @8 N
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'8 }; J: n; }! i
    data1 = requests.get(url).json()
    ' w" a" q9 O# i. _7 D# t5 d# pprint(data1)4 W6 S" Y) M! ?- W& L" U) p& k
    $ u) Q/ c9 i! ]4 O) ^
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。4 e9 J+ n& m7 r$ w8 [0 Z
    df1 = pd.DataFrame()3 C/ `5 b: G+ [- |
    for info in data1['body']['allMedalData']:; s2 k% ~1 j" X5 R: F- B- h! N
        name = info['countryName']
    ) b0 o  R( F4 t8 I# X! u2 [5 F, }    name_id = info['countryId']# }! C- J7 i. |7 U, o
        rank = info['rank']- v+ G, }: z8 v' W8 R- \( ^. N. D
        gold = info['goldMedalNum']
    6 v# ]! o1 m8 i    silver = info['silverMedalNum']0 W1 l" b1 F4 y) _* W
        bronze = info['bronzeMedalNum']
    ' ]: q$ z" u' i* r    total = info['totalMedalNum']
    - Q8 M- n7 r* p- f    # 组织数据
    % W7 A' `6 M/ d* s7 o' \+ \1 G0 J( K    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    ; @# a) T6 I  i    # 然后追加df
    3 g& U4 w2 _, m$ l/ l    df1 = df1.append(orangized_data)
    2 n" d* e3 K9 Hdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']3 S: N* E# {' j
    df13 x" b; k4 `/ c
      U0 z' D6 c6 x: C

    * q1 o2 ?/ h) h2 n. E6 t9 r  f这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。6 K2 E+ L, n$ \, q' O7 m/ Y- m
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    * E6 R7 ]2 j7 f. ~3 x; ?3 gdata2 = requests.get(url).json()
    5 L* q( o% v' E- s#pprint(data2)% j0 G7 `# k9 Y: X

    ' h  v9 F7 Q* Sdf2 = pd.DataFrame()7 `+ [! j* S/ [' B$ q" _
    for info in data2['body']['medalTableDetail']:9 g+ r' ^1 X- f. k
        english_name = info['countryName']7 L; K. h( a( C1 z) F
        name_id = info['countryId']! X" {, r& t9 \
        award_time = info['awardTime']" p- L; s$ s8 {0 Y" [. g6 @
        item_name = info['bigItemName']
    $ S9 a. L$ w2 j! l* s7 Y3 ]  A! a    sports_name = info['sportsName']! u( X1 X. Z9 z6 u4 i1 r( v, V
        medal_type = info['medalType']/ y1 O0 J$ ~/ O5 j0 S! U
        # 组织数据: S/ M& o: f0 `$ J+ c  L
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    0 g: Y+ y! n, H' K    # 然后追加df
      V8 l- B; C1 Q! x    df2 = df2.append(orangized_data); ?( m& Y& d3 }7 s8 g& G* k
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']! L" }+ N* d4 ~' X6 `
    df2+ i. i- {- V5 T. }, G8 o5 ]1 u- V

    + K$ i* m* i- D/ X  U对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 $ q7 h# e& i" O& v
    4 q& u" [2 x2 N( m' n0 P# c# ?/ V
    1 S) b0 Z& d/ d0 \
    二、数据预处理
    3 E7 y, |% `0 \& R  Z' O由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    * O' ~6 j# j. c0 [! y# {6 Z' R3 ?, f& o- q6 z% E! C
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:# p) C6 N+ O" d% W+ y7 n
        x = f.read()  M& V% T0 n" a: a2 [; V7 i

    6 d' z' ^: N9 Ndf3 = pd.DataFrame()  @- v9 |/ `! V
    for i in x.split("\n"):
    " O* G+ W. `$ q    x = i.split(":")[0].strip()
    ' d, r( C( d1 D8 d    y = i.split(":")[1].strip()$ `- B. `3 G9 U3 {/ @- k
        orangined_data = [[x,y]]
      }- S0 r) F" H1 ?+ R% M    df3 = df3.append(orangined_data)
    8 ]2 Z* e" _! c% {& @+ a4 ndf3.columns = ["名称","英文名称"]
    & z, d' ]  U, a& T2 a3 s* h8 T8 Qdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)  R& n2 F2 b9 J0 P: T& w8 `
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。/ a$ f0 [- `1 r0 i! b
    , d- y+ b  E6 p$ M5 K
    df4 = pd.merge(df1,df3,on="名称",how="left")6 a4 v! w  P+ s) ]4 ?- R. q8 `
    df4.head(10)
    $ |* X- u2 \8 A/ g8 j
    , W& S1 W" \0 x$ S& r% s$ G+ ?; Q
    4 W' N0 j' i% k' z8 y

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


    • 5 ~# x8 ^/ K! g6 e6 w0 B

      . F- t7 e3 s, I# g8 Q8 ^% g1 r, S2 h5 \( B, J  a

    1 A9 F4 G! t9 ]" x6 h' J
    . e4 H& i$ Q1 ?( w6 L
    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-18 16:35 , Processed in 0.408269 second(s), 56 queries .

    回顶部