QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录! q" @4 P& ]. x" _) T- x- U
    0 Y% D$ g5 L8 _# Y: M9 \
    文章目录' H0 F6 }/ }1 r. U+ a7 `; ^
    % e$ X% a* e: M- R8 d
    前言9 y. E4 u$ T, W+ h- N# J

    $ o& C' ^7 P: l& U一、数据爬取+ c" O4 `. q  `- P/ K8 ^

    7 l& R6 Z+ H! ]$ W: z% r5 ^$ w; e二、数据预处理
    . V# e2 a6 U: _" a& _0 I
    : b( K5 l& ~+ K  V1 E& J  w, t​前言2 y; r( p3 U' i9 [# n& n; f, G
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。9 |, d5 Z8 c6 ]) ~8 z/ ^, K
    " L8 }+ T. I1 j* m! d8 J7 C6 Z

    + ~$ f% c3 F2 {* `% O8 ]5 D" F一、数据爬取
    4 Q# W. Z0 s, P0 eimport requests
    2 D) t8 ^9 s4 zimport pandas as pd/ u  m0 L5 z8 C5 d; P
    from pprint import pprint
    ; p& C) x+ D! `1 T4 a1 c% Q导入相关库0 t! B" b) d3 y( P4 F

      e3 \9 h# M" g9 Krequests库用于发起网页请求,获取网页中的源代码;. w, d/ m# g) u- R# c

    $ Y' J( k. y4 C- y6 epandas库用于存储和读取获取到的信息;2 i; x3 ~$ l0 x, S( l* O9 V

    8 J. F) x- N( Dpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    - _* U9 z0 p0 E! l, E$ d) k5 O; b( s5 C/ p: F3 h3 F! K
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'% q1 ]* r3 K* A3 I7 c! n
    data1 = requests.get(url).json()
    & [3 Q& p: ]/ y& E, E/ [' s- s# pprint(data1)0 X/ z5 Q5 n- r2 T- p! C3 A

    " a6 W4 S( k/ u8 W1 J这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。: a: T+ y8 B( `7 m/ u) G( ?! K3 o
    df1 = pd.DataFrame()& T% `. D  C8 M0 X
    for info in data1['body']['allMedalData']:7 G/ W$ w6 P3 R4 {. x7 _
        name = info['countryName']9 P2 o( k; D/ W6 |0 s) P; {
        name_id = info['countryId']
    3 t: r* `8 C2 h7 b    rank = info['rank']1 T! n$ r/ Z) \# K: H( E, J* Y
        gold = info['goldMedalNum']
    , O0 W  J% F# ~8 T; F6 Y# c    silver = info['silverMedalNum']
    9 x4 Q# U  m/ l: A1 q$ r    bronze = info['bronzeMedalNum']0 i: I8 C/ n4 x9 C, A4 d: [
        total = info['totalMedalNum'], A5 W+ j1 [3 h) M4 j
        # 组织数据3 }" ?9 Z/ I( |9 T
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    / r! }: H1 }0 p    # 然后追加df
    $ K4 f( R! B3 p  f    df1 = df1.append(orangized_data)) H0 x% h' N; T7 s- G4 v4 ?
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    . [  [8 p  @3 _7 J: G$ Udf12 S$ n% {  L7 u0 i; J
    3 H) `, L" v( Z0 [; ~. G* y

    ; m8 q+ M2 [& r1 C4 [9 H; J这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。. o! H' a8 o% x1 a' Q! p
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    2 _' p: ^3 R5 |data2 = requests.get(url).json()
    ( l1 ^, j* N0 V+ d: @3 e#pprint(data2)) x7 K  I/ o; C$ O7 t  y7 d
    8 U) _/ {$ q& A* w: K
    df2 = pd.DataFrame(); Y4 x7 O& j5 }  k
    for info in data2['body']['medalTableDetail']:
    - z' o' w+ s+ s    english_name = info['countryName']
    $ \7 T! A0 r6 P  y- l. `    name_id = info['countryId']
    4 P* l( \" g7 d    award_time = info['awardTime']) t/ B! M# C8 u; r- y
        item_name = info['bigItemName']
    5 C5 o5 r: }- m+ o' g3 ~    sports_name = info['sportsName']2 G& U3 W. }% B
        medal_type = info['medalType']
    % J, o% ^) E( m    # 组织数据$ R; p% t& m8 m9 n
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]6 U. H/ w7 O; O- Q
        # 然后追加df5 o7 K! }5 Q; q* g3 l0 O7 V
        df2 = df2.append(orangized_data)/ p4 [; T6 V0 V
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']" p: X) }7 Z4 m; g5 [5 ~
    df2
    ; u  B' t, t% P5 j- s6 k' ?+ T( @& b1 G: D: j) P
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 ; j7 i( i) L5 c5 {* [2 L# K

    - X, [  r6 Q0 r
    $ {+ t7 H3 m. q) \$ `6 H二、数据预处理
    5 ]1 G9 z. h( C. U# W4 q) Q由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    " @! e; s3 J0 Y7 S( B1 d
    ( `# q3 Y1 H: k! ~0 Y% ?9 kwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ( j. x6 z4 G) G4 O; a+ H5 {4 D    x = f.read()
    2 L! c, B& m  c/ U* S) d
    + B8 M/ B8 m1 ]8 r+ H3 Edf3 = pd.DataFrame()
    / D( o0 y; X- {' hfor i in x.split("\n"):
    $ x9 h6 x! ~7 V( X. k1 d    x = i.split(":")[0].strip()
    5 F/ Y! q8 r, j- p! N+ A& }4 x    y = i.split(":")[1].strip()
    7 E: \* L' V1 M    orangined_data = [[x,y]]6 b' u( x, C) r" t# q* _
        df3 = df3.append(orangined_data)
    2 W  g' c2 G3 k& h7 ddf3.columns = ["名称","英文名称"]% }+ I, ~( h+ _% i" l
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)8 X6 h3 U/ c7 G; t7 l0 ~5 f" T
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    & |0 Z. K) ^- K  B: n$ e6 s2 T) }, J4 ~& ^8 j. J
    df4 = pd.merge(df1,df3,on="名称",how="left")- S9 a" X" }1 R' m; S
    df4.head(10)  R- `* t+ ~7 [

    % W# @/ C, Y4 _4 _( F: X5 l. d% ]9 U( A* a4 ?0 f

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


    • $ |. S( L2 Z) ?9 R+ T1 _& C3 e% ?7 q
      : Q: ]' N- j" |
      0 ~0 K1 T& J3 _4 |

    8 m! a& j0 Q% a# A, W" ~
    3 ?* F- o; W' E2 g- }
    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-8-14 20:01 , Processed in 0.508607 second(s), 56 queries .

    回顶部