QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录3 I3 x$ A2 V, M
    ; L% [3 k* k. m0 @8 G$ ^
    文章目录4 M% r* u# I  l8 Z' P* W) h3 a5 q6 w
    & ]3 r! c. \! \$ G2 D- l
    前言
    1 m# l  o5 j  g8 k8 g8 I8 B
    . J; g" E+ L  I, j* u一、数据爬取, n% H5 P, N1 p! ~% t6 M/ P

    # n( p4 _2 |( \二、数据预处理3 J& q. a- T: H0 @
    5 V  i! P( D1 p. o! g, S! h
    ​前言
    " V- Y( _) E8 O  v本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。: {8 i9 E8 x1 ?0 [
    6 w/ B/ I# m" k( R* _
    4 T! u3 p9 ~) e% C
    一、数据爬取$ R7 d/ V: Z" G! m4 Y
    import requests
    ' b% q0 O# B+ k/ s1 Z6 `# \% Iimport pandas as pd; e( h! |, t- L0 b9 p
    from pprint import pprint
    5 c6 E' x  x  k: [( L导入相关库) G7 ?; V; G! Z  D) X6 l: }

    2 r/ y( @5 P' Y$ }0 n% erequests库用于发起网页请求,获取网页中的源代码;
    - G. P1 t: g6 h( L  v& q" A
    ' G) [/ C: U, k  C% Lpandas库用于存储和读取获取到的信息;; e' o: O, m( R: I* t- a8 P8 K

    ( {/ W5 r( _+ i6 O6 opprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    8 w4 ^7 Y& J' m! j. S4 a: M) z; C% O" z- {/ d3 g  @0 C! _, K
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'# E' S" e3 F# m5 p6 n% P9 s  F
    data1 = requests.get(url).json(); s9 t, M; ]% D# e2 _5 F) @
    # pprint(data1)4 |8 _. H  o/ x/ y2 A+ C, N: P

    4 o* ]. a6 d# |% W这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    / O8 g9 J% D) j0 Cdf1 = pd.DataFrame()+ ]2 t& P% r; i3 m; r5 T
    for info in data1['body']['allMedalData']:
    3 E( e! _# V+ a# B8 P    name = info['countryName']
    9 l/ s6 X& ?$ G# {$ p; O) q    name_id = info['countryId']$ n0 A  k( V- f* P/ ]2 `) n
        rank = info['rank']$ B4 {" }; x8 S8 A
        gold = info['goldMedalNum']
    2 E0 d, ?; }9 p) x. Q    silver = info['silverMedalNum']
    ' Z2 j' @3 n8 w7 O% X2 V1 C    bronze = info['bronzeMedalNum']( v# d6 ^" g6 i4 V
        total = info['totalMedalNum']0 W, P4 p3 S' Q! j. G- K
        # 组织数据
    , j* B0 o& g: L! x% [" B    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]9 [* v4 H6 T1 {2 Q
        # 然后追加df, [+ S5 r; N8 x" E: [7 _9 [
        df1 = df1.append(orangized_data)
    / s' q% |* Y! vdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数'], ?( N: {8 i" F9 d
    df10 u! V. H  L) e$ |) P! U% X, C
    " q0 c: P4 F1 b1 i% k3 k6 n7 v

    , I/ {7 B: j' o, b* z" o这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。" p- N2 H' ^  D6 K( Y1 {! {
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    * U! L5 O( @9 ?! }, V' @0 |data2 = requests.get(url).json()
    ! A3 G' e, B- A- B) o, s# Q; ?#pprint(data2)
    5 o) l3 @- C8 o6 W' {( f. B" L4 [+ q% S5 e
    df2 = pd.DataFrame()
    . a3 H( A( [" h+ }& D8 mfor info in data2['body']['medalTableDetail']:  [* d5 ?+ S: R) O+ v/ ~
        english_name = info['countryName']
    6 B& \0 E" h9 ?    name_id = info['countryId']
    ; h- E1 f6 e; Y0 x: E    award_time = info['awardTime']
    + [) ^9 ?$ r7 b( C! I9 _4 R    item_name = info['bigItemName']3 ?% }, o/ \. R. ]! \# D' q6 i, a! u
        sports_name = info['sportsName']
    , a8 n% P% b. T; h, }( @: R    medal_type = info['medalType']; A2 P% I& a* Y; I( ?0 h0 d* D
        # 组织数据6 m5 C8 [# W0 p1 o2 _
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]. X" I' F* x1 E4 c8 y+ ^: |# n5 O
        # 然后追加df/ {. ]4 e8 A  }5 B# @& j. p; H
        df2 = df2.append(orangized_data)
    ) j6 r' ]$ W! C# Y: l4 tdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']* `2 N  [8 H( t4 v4 q
    df2& K* @$ b2 N1 [/ x  g+ V2 Q

    + V0 U" f5 s4 u) w' s* ]  H$ [对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    - n4 u0 p2 k: P1 N$ H5 F
    ! E3 S2 ~: _1 z" W& v$ L
    : C* g! ~- u# w7 E* W0 ]. o二、数据预处理1 Q6 T0 Z# U" I4 S; B
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    * k5 w- a2 S+ V* @
    ( e0 n- p; R' Q5 ~0 k: awith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:, r& U' l- S) }; g( h! H- Y+ v3 L" D) c
        x = f.read()
    - L- F" F1 F: w  m) D' L
    ) i# ?4 \8 x4 ?7 w+ Qdf3 = pd.DataFrame()
    ! z; i8 a. H7 D# O: f1 {9 D  Sfor i in x.split("\n"):- L: V+ k" ^# n& F
        x = i.split(":")[0].strip()& ]4 z, K+ v' H% {
        y = i.split(":")[1].strip()4 ^) i8 y# @7 l; v% f/ a' B
        orangined_data = [[x,y]]& d( v( f, [  h) A9 t' G% s$ d$ e
        df3 = df3.append(orangined_data)6 m3 e7 H+ q3 |3 x+ u3 g
    df3.columns = ["名称","英文名称"]( C  r% o8 D" n  Q6 Q2 n1 \
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)- d" s4 @* O: U+ t% a8 z6 P
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。% b) ~0 A: F% l# ]/ t0 Y0 D" I& t. d

    4 ]/ G% R0 ?  L% r) q$ w3 udf4 = pd.merge(df1,df3,on="名称",how="left")
    7 U" V; Z9 p! O; Gdf4.head(10)7 z! ~$ o+ \/ a  M" t
    / ~' z  d) v- k' @# t

    * r- s' s6 n" M8 @/ b5 U

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


    • % M9 L% @' K) @/ t: n/ [9 [
      / u4 }+ m" [4 _1 }  i

      ! N; [& ?+ p7 ^" p: {' y
    1 ?. B9 O1 P0 a- b7 A
    . n. W  w/ x! ]& V7 U
    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-7-19 13:01 , Processed in 0.478330 second(s), 55 queries .

    回顶部