QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录! z! R7 P- t3 K+ [# R, u

    5 X5 m0 p0 e4 M0 B文章目录! K6 ?( q4 c6 y. N
    1 x- q8 V) S' t9 B6 z8 p! K
    前言
      N. f5 M, }; `9 V/ O: K' s
    + P8 d9 B/ ]$ a/ A! d一、数据爬取! h. g1 A. O, w. K+ F

    ' j8 N7 Y& q* a3 _* Z- H) Y二、数据预处理+ y6 m& v. q3 ^& @: Z1 e# t7 \

    ! _/ E1 e# X9 f9 c+ f; r0 i3 K" w​前言6 |) r- P, W  |/ y
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    $ L+ n2 _& Z9 q# ]  J, l5 Q* V) U+ P  n& T/ T  ?- i* x* ^4 e

    1 j" G! F, R8 z一、数据爬取& K: H  T1 s: _
    import requests& i9 C, J2 `( r: S! v% o; E
    import pandas as pd
    , [" P) n" U  @) ~) k) H0 ofrom pprint import pprint) S! V& b  u/ Y( Z$ T! {
    导入相关库
    # w. n& o' q% ~" y$ l$ \  z' H6 z" G! Q5 F* ~/ D) p
    requests库用于发起网页请求,获取网页中的源代码;
    0 ^5 \8 k& e% J
    ; K! h7 M, y3 o. ?5 Q% bpandas库用于存储和读取获取到的信息;: _* B7 ]$ q6 r  T. `

    ! N1 k! z- h4 `pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;8 w$ @$ }( b% Z3 v; _8 J! `

    ; }; b9 [! X* J5 D& x* [" Eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'/ ]: Z' o' M, o3 k4 \- ]
    data1 = requests.get(url).json()
    9 C& k5 t) J! u) W' l. u: M# pprint(data1)
    8 A& A+ s# o# U/ Y+ d3 o
    + d: P7 |  P3 ~- ]4 i" S# Z) v这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    3 N$ ?6 u- Q% K* u3 k$ ^df1 = pd.DataFrame()
    8 S/ @! t$ b3 h. P" M- Zfor info in data1['body']['allMedalData']:, a& G5 U( [+ F1 X& d" n, L) S( V
        name = info['countryName']( X% j5 g+ L# F3 w. j% v- p$ \! v
        name_id = info['countryId']
    2 E4 u4 \9 r1 D, ?, i    rank = info['rank']
    & x' o) ]1 ^  }2 Q3 |: v1 X    gold = info['goldMedalNum']
    $ r; G" y* H6 H! {1 ?    silver = info['silverMedalNum']; h$ ^- |: k7 {+ q' H# U
        bronze = info['bronzeMedalNum']6 q( h; i& E2 _1 z2 U- _
        total = info['totalMedalNum']
    7 z* n' [3 e% V4 }    # 组织数据# Y6 S0 @: }# q; N
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    . @8 |& y5 u. ^+ t9 I    # 然后追加df6 `4 ~  X8 r! A% H6 F
        df1 = df1.append(orangized_data)
    2 J6 `3 d5 ?& A/ E2 }) E, e% Jdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    " t; d: K3 C! I* L$ t, ~df11 y5 F" ~6 s5 W

    5 v3 T' h% B$ W& i, l0 i2 m1 @% I6 O4 ]
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。' b6 E! T8 H1 n6 a
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'% l9 z% Y; E. @, Y
    data2 = requests.get(url).json()% u4 W2 R# ~0 L4 {" F4 I  D
    #pprint(data2), J0 r% q7 o& j) Z) |. z3 Q

    : s4 z0 I+ n2 _" d& {! ]3 m0 xdf2 = pd.DataFrame()" |9 M/ K  L9 P+ e& p5 s
    for info in data2['body']['medalTableDetail']:  s8 d( ^+ j- o
        english_name = info['countryName']/ Y" F) c# I& F4 }" M
        name_id = info['countryId']
    + y3 y7 [5 ^5 |+ x6 M" X    award_time = info['awardTime']5 Q# n/ O: n8 t) |. c, |3 @
        item_name = info['bigItemName']
    . z; Q) g! Y$ Y) W0 s5 {) I0 D    sports_name = info['sportsName']
    # H7 U8 L6 C% k. ]5 b3 U" G$ Z    medal_type = info['medalType']' R' F. s$ h1 A* E7 ?' A3 ]7 c
        # 组织数据: G7 k6 B/ ?! i$ ~' Y1 n) y& [. g: _
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    1 c; u4 m2 t! @' l    # 然后追加df
    + R! y' X: j4 U; l    df2 = df2.append(orangized_data), S) [$ l. s# l
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    $ N* u0 R" L. |2 zdf2% _0 J( G6 F' G. h

      ^! t1 Z! E( K' O& R) `. D对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 $ T& V3 k  g/ N3 @; M8 I( @
    . v, D5 W2 b4 @# w! l6 k

    " d- p0 A3 [, Q" M( A二、数据预处理
    # i# V+ ~6 Y4 \9 Q- a/ [由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。2 ]6 k0 D: `! v9 ^6 {
    # T3 o5 n7 b9 x. `( x2 E
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    7 I! M9 h) v2 w9 C* l' t    x = f.read()
    6 @% q8 N$ m, I2 Z8 H& G9 ?1 C& `
    5 A' \7 n$ e1 i" Y/ P: Pdf3 = pd.DataFrame()
    % y0 L5 u+ V% I) o6 j$ Q5 ffor i in x.split("\n"):
    % a+ e. N* z& s2 N3 S$ [    x = i.split(":")[0].strip(); Z1 H1 J" l+ j4 S5 z
        y = i.split(":")[1].strip()
    1 s& ?6 b1 E7 y6 W( D* C    orangined_data = [[x,y]]4 }7 N# [4 N+ {) K; J  Z1 G1 z0 G4 N
        df3 = df3.append(orangined_data): Z5 C0 x0 h$ V0 @6 M( k* L% [
    df3.columns = ["名称","英文名称"]1 B% u, C+ l: Z. B; ^
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None): Y4 G, X; J& }* w; V0 P
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。" K0 V, J' e2 F$ h/ S7 b+ w
    " B# V7 p9 s) z5 o9 w/ i
    df4 = pd.merge(df1,df3,on="名称",how="left")5 w, c, R; M5 l( T. A/ c( d" [
    df4.head(10)7 L/ y$ k7 a( }! S- `  Q
    # w$ Z7 v' E6 H1 R& c# o- Y0 L
    $ a/ u$ D- l& m- r8 H# i

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


    • 3 }1 i/ _8 y" ~" f; Z( c
      5 p: l* x  q# O( \  j, n- K
      & @0 t, g# A; l: y# r

    # J# b$ _& e0 H7 p1 E0 P8 P& }. i1 q2 [: s) ?% @
    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-1-2 13:09 , Processed in 0.409504 second(s), 56 queries .

    回顶部