QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录2 e/ P7 O) S1 N, ^/ }  D! L. I) Z! N

    9 d; m9 |# x7 z  a# B$ M. h文章目录
    / K6 r5 K8 \/ q* Z
    " p% A8 f1 t9 o; n+ N- y% x! ^前言
    0 Z) ?2 ]7 F$ V/ w) ^& g; |* t0 z' i9 v+ G* ^: s; q) P. F  ^+ f+ u
    一、数据爬取
    & b& v$ m# `; M
    + A) g* u' h" j. d二、数据预处理0 }: v- K0 v8 i3 [5 J9 z! n
    * d3 U6 \6 s$ X( K# t
    ​前言+ J* ^6 Y1 U, n) E4 K/ Q
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。4 H, X9 M2 h3 v. A8 y2 b

      V  d& u: ~. p& Q8 l) w
    # [  H6 M$ x; e4 ^: U) U一、数据爬取% _9 [  B+ ?% H9 D
    import requests6 ~& N' R" I/ b( \1 h
    import pandas as pd
    # D* s" t% J' y0 F. T5 Pfrom pprint import pprint# C  V4 I8 }+ d5 @; s8 Q) S
    导入相关库
    , M& M- p! r$ x! f) N. _3 h! O! x  s- \+ r: X( [
    requests库用于发起网页请求,获取网页中的源代码;0 O; A' J/ m5 q8 Y; s* `$ g

    ' D) T1 A! L! d0 c, y( c+ p* epandas库用于存储和读取获取到的信息;
    " }! Z+ b0 _: f) D8 c; d; e) l6 r  @: F; M# h( p7 O' C
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;/ K* J( _& U  k$ ]
    2 \9 c, @  B$ M- u7 u
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609') ~7 X- \8 A* c
    data1 = requests.get(url).json()8 W5 x- p: P. l9 B2 a+ _, B: S
    # pprint(data1)
    ! o& {1 ]) A0 }9 k6 G1 v2 \+ p2 Y+ n7 l
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。7 d6 Y  g0 u/ {/ r/ B, U8 T
    df1 = pd.DataFrame()) X) C: Y7 A# Z# c& _+ h
    for info in data1['body']['allMedalData']:
    9 D2 g9 t& X! y    name = info['countryName']1 M# `- v) d/ G/ r  L
        name_id = info['countryId']
    / E+ t0 _  B6 x# x: R* U2 M    rank = info['rank']1 B/ {0 @; Q0 ?* B
        gold = info['goldMedalNum']
    . ^4 p6 J1 E; H" Y+ G) f$ L" R5 \$ [6 Y    silver = info['silverMedalNum']
    ) @! _2 O5 z( M  P- u    bronze = info['bronzeMedalNum']' n7 r7 Q# G5 G3 ^
        total = info['totalMedalNum']  I2 @, ?5 J7 r" Q( y% D
        # 组织数据7 A5 l4 \  H: {& z9 s
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    $ x* Q+ D0 h: C' Y    # 然后追加df2 Z6 D( J% v1 [/ C' K8 K5 a
        df1 = df1.append(orangized_data)) i4 p; ?, ~9 R9 B( `' r8 T
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    " Z9 V& ]' u  U, Z8 f, Gdf1
    ; [7 N% @: j) k' c7 s' U% j. ^) O: k7 @) C
    , ]3 z! z" M- r" r
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。5 ]4 f; b1 `8 b4 k% A2 \5 |9 [
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'( C4 z1 k+ W# m0 ^7 c
    data2 = requests.get(url).json()
    7 O6 Q3 w7 Q7 w3 b8 t#pprint(data2)& D6 Q7 k) d0 w3 e; J

    5 u; {; v0 S; O* i4 E3 B6 udf2 = pd.DataFrame()2 }& }2 E2 u" [5 Z
    for info in data2['body']['medalTableDetail']:! t' D) N, ^$ ]9 r; o' A$ M; v
        english_name = info['countryName']
    ) A* M+ q  e  l2 @    name_id = info['countryId']! b& l8 W/ I. b/ @8 h
        award_time = info['awardTime']$ U# m- t! ~+ ~. a+ B( f' X( z
        item_name = info['bigItemName']+ R# e) B1 V* Q0 y' K
        sports_name = info['sportsName']
    ; n; z, Y4 S$ v: x: g; F; G    medal_type = info['medalType']1 Q" m/ \" a+ _+ F! u( N
        # 组织数据7 g* F! d# x# S, j" J6 Q
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]( x* Q. J2 E. F. f+ h5 `) n( Y
        # 然后追加df
    % q0 l. F/ _: s: q& u# D    df2 = df2.append(orangized_data)
    ' L6 q$ ?9 N" V2 R& X  ]1 e4 Q; Rdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    3 _0 H7 T1 \0 l' @df2  j3 {  r+ Z% m/ c: v. a9 L

    / S; d0 d* Y! C. s2 g对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    " b9 B- ]5 T9 L& j' L
    + _+ f: c. m6 @) j, d9 T8 r$ I3 [, i, Z; S  T! h$ Q+ F
    二、数据预处理$ v3 R" x/ X& m% a$ @
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。$ y6 ]$ Y. W( L5 o5 |
    7 `* i3 v+ M5 ?5 y7 k  p
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:8 j2 A7 i/ C. K( h6 Z( z6 @  O
        x = f.read(); T: I3 z/ ]$ F- b4 x

    1 s! D& O( T2 c: K& ndf3 = pd.DataFrame()3 q0 w+ M$ c, t4 B
    for i in x.split("\n"):0 i1 Z  B) N; a/ h% B# d( i' |% u
        x = i.split(":")[0].strip()% f2 z' w0 ^  I" H
        y = i.split(":")[1].strip()
    3 C' Q$ [: ~- d) M/ L+ n6 k' _    orangined_data = [[x,y]]
    * o# u8 m/ I$ ^+ S    df3 = df3.append(orangined_data)
    2 k# u, _5 Y2 ]' c: z2 pdf3.columns = ["名称","英文名称"]
    ' W# r, R# G% k4 \4 {6 Y- Q7 fdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)& J: N3 F7 T6 y1 r$ A
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。* G3 D( e0 M* R3 |' y) ]
    ! W% J+ O- y/ _9 I5 n
    df4 = pd.merge(df1,df3,on="名称",how="left")
    8 @* T3 Z; \- q; Hdf4.head(10)
    ! @- h0 D, {! ^! f( V
    ) r1 R! P) p' c$ k+ Z5 H5 h9 c% j1 B  A

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


    • 2 t- @+ K- _2 S" p" |7 X4 ^

      6 d3 S% g  G, C9 o9 s( Z* r: h# g2 ^: H( j0 t* c7 t, K' G
    : Q! a! V; M, ^. e  A6 c- e

    3 A7 D% ^5 N$ Q4 k
    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, 2025-7-3 14:53 , Processed in 0.437632 second(s), 55 queries .

    回顶部