QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录! E  c- Q) m2 \9 b1 a# A% k* j+ g
      c, v, W6 H2 l  Z+ n1 _, b
    文章目录% D9 {6 W2 L% B! q) w

    : @4 W$ F5 {, {6 x6 Q! Y1 _$ d前言
    + y5 b9 d  N& V
    & E! O. W: q0 x9 B1 Y& N! k一、数据爬取
    " `* }# W  z) |, _. r$ W
    4 h* X. F$ @' c1 M# o( Y二、数据预处理5 Z  \, f7 \7 c2 O

    0 R/ S* @' ~+ ~$ f( h- q+ ]​前言
    ( L$ s$ y& S, U! y本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。7 _7 D6 }8 p1 Y% x% N9 t

      i$ W) d9 b% U5 z# ~+ h. z1 b/ r$ h, U6 f- o  H/ `& ]
    一、数据爬取# @$ |8 D* p' u. {2 m
    import requests+ ^8 X! A& P! s. _! x; t) k8 i% _+ s
    import pandas as pd" L! }6 ~* y  \- z
    from pprint import pprint# D7 a- Z% T+ I
    导入相关库
    " f4 F  i3 v! m9 a2 Q
    7 E6 D  p( g$ s* arequests库用于发起网页请求,获取网页中的源代码;
    ) X- ~! y7 a2 h# n
    8 |  P# t$ J- Bpandas库用于存储和读取获取到的信息;
    6 _. p* t8 \  D6 l8 N) e# `/ ~9 T3 r: c5 J* X8 B- L
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;3 r  q1 S% \% T# c# ^3 e% M

    9 V( ~/ U9 D' F  }$ l- n# Gurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! j1 W  x% H# b5 O: L* h4 d1 u
    data1 = requests.get(url).json(); y9 ?3 k# a3 a  p6 c
    # pprint(data1)
    6 t0 |) v: Q9 r- R: _) W# Y5 R' `3 ]# M/ H: j
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    2 r4 I' L/ O) V0 ydf1 = pd.DataFrame()' z0 K! E; ~* v' V* u& n9 \+ r* x5 o3 G
    for info in data1['body']['allMedalData']:, R$ E* ~8 q- `
        name = info['countryName']
    4 J0 [; A9 S/ Q' W' M$ I+ z$ ]& I; w    name_id = info['countryId']
    0 T% a- H7 Q4 R) e, F    rank = info['rank']
    " D% p5 h, z$ R    gold = info['goldMedalNum']
    ( x& q) B5 J7 L2 B! z9 s8 X    silver = info['silverMedalNum']
    1 u( Y+ ]' i% e) p" l    bronze = info['bronzeMedalNum']: B) K+ o3 f1 w& f; y- Z
        total = info['totalMedalNum']4 b4 t9 K5 t4 s* G9 o+ I
        # 组织数据( R: m& e5 ]8 X+ G/ z9 D. Y
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    ) P' X% g2 S# G    # 然后追加df
    $ v: a: z: L9 j9 ~( w    df1 = df1.append(orangized_data)9 n, p0 R- J& R3 _5 n; e" p  P
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    2 }/ q# s7 i8 o8 adf1
    , n4 |9 m0 c4 L+ b2 ?9 z1 Q
    ) x9 d8 t) V) @- z
    , k1 u, @9 Q4 g) x这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。9 ?) X, r5 [! c) r7 ~
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    ' e& y  Y! `6 E8 p- C+ ydata2 = requests.get(url).json()
    ' \$ _! K, r+ ?& u( n) o+ n#pprint(data2)
    ! e/ ]* O; P8 Y! K2 K' A: w6 y6 C: y- k* [0 n; h
    df2 = pd.DataFrame()
    9 ~8 l6 {2 W' j( P! x1 I1 C8 Qfor info in data2['body']['medalTableDetail']:8 l' f5 D6 {( H* j6 O
        english_name = info['countryName']
    0 @$ ]: n' \8 m7 Y, w4 s+ S2 A    name_id = info['countryId']* z" c8 n' I% v% g' p% o- P
        award_time = info['awardTime']
    # U$ A( z. V( Y7 k    item_name = info['bigItemName']3 [/ m2 n0 i" @! G
        sports_name = info['sportsName']# A( K( i6 y: b0 n# A9 G: E
        medal_type = info['medalType']$ A3 V2 _: l7 l" z; H$ l2 J
        # 组织数据
    / ~' m+ c  O, u- I  e    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    % L2 I3 U/ V9 e8 J    # 然后追加df; p9 F  A. l' Y0 a8 h2 ~: P! e# x
        df2 = df2.append(orangized_data)! Y- D# ^3 h1 J
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']* w1 G& e3 z, s& }1 D% x
    df2* @9 I5 \9 @/ W# {

    ; n' Q! Q5 {' M2 B& ~# U对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    6 X1 a3 G$ k2 `$ n' p5 i* J4 j: [8 |0 N5 L& \  m+ X

    + s+ d& o. `6 R: j7 b二、数据预处理2 C$ ^1 O: U- ~: ]  m" q
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。" u9 b% `8 D9 U2 s$ q5 @

    5 I1 O5 p4 B! X) i1 h6 n7 t5 nwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ( t: o! c8 |& j. g0 e4 X    x = f.read()
    - h& ~9 _: K" M
    5 b7 ?, V  T5 G" Tdf3 = pd.DataFrame()
    9 E' ^/ V' k; c% K1 efor i in x.split("\n"):- K- @2 \4 |6 o' ^
        x = i.split(":")[0].strip()
    ( m, U# Z0 P: i    y = i.split(":")[1].strip()2 m- O) K- K( T0 x0 V5 A$ Q
        orangined_data = [[x,y]]
    8 b4 e6 w/ D/ P, x6 q& T2 t& h# S* F0 H    df3 = df3.append(orangined_data)
    ; B  C2 y" R- v  p+ j2 H5 Odf3.columns = ["名称","英文名称"]
    ! `! l2 |( j. E. ddf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)+ ~* J3 A2 E. t9 D3 f$ R
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
      Z& C" E" F. h6 u: z5 e
    # P. Y& c/ x; I% gdf4 = pd.merge(df1,df3,on="名称",how="left")) y* c1 j( k9 L5 z7 M$ C/ A6 P
    df4.head(10)
    / p. v# U- T# \* o/ k
    6 X, j7 \6 A, [: p9 F# y3 o+ f5 B& z9 y
    $ J1 T# y% C% z

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


    • % V# i8 X9 f, N; R$ h# x( b
      5 O* y9 K1 o7 B* F6 I

      - R: b& [  C. E2 K% v1 y
    $ v9 R# M# d, W) N& S2 s* `5 ~

    % W# j$ @% H' k3 w" J
    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-9-2 05:34 , Processed in 0.500235 second(s), 56 queries .

    回顶部