QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    目录2 n  B2 n2 Z: X+ W4 w& q/ Y

    ( }: b: `! [& o: ]$ }# l) m文章目录
    5 n' k1 Y8 O7 \
    ) h2 A* g; ^, ]7 Q- M前言5 v, S" j8 e# U$ _% ^. q0 ^7 D7 E" u

    5 S% |  l9 L' F3 J7 _: R一、数据爬取) q4 w  G  i* w4 Y1 V, \
    8 l& e0 l0 C8 W* S5 n
    二、数据预处理
    2 ^5 ]' H' p! L( D& ^* U8 f" h6 {/ k
    ​前言! S- b2 a6 [9 b, ]% }. Y. w
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    6 {; ]2 F' F% P  U/ {1 q. `0 G2 w; u# G+ v6 Z: S, f2 c

    * i7 m4 a. {! c- K) q一、数据爬取4 _# P5 }9 s% N7 x2 U
    import requests- v! `1 o" ~7 _+ R) s# C8 z
    import pandas as pd  ?4 o* ~- ~) _# g. R) c% `9 N/ I" J
    from pprint import pprint
    ; @# h4 u) \: S6 D导入相关库
    , @7 B' L8 N) g; f8 Q& l3 `4 p. n- q$ _- C
    requests库用于发起网页请求,获取网页中的源代码;0 m5 Q. r" p2 D, p. ^' |7 M* \

    % ]! `/ U" o2 A/ N6 B% S- U! _. upandas库用于存储和读取获取到的信息;
    ; t; }! V! x1 v1 q
    9 N( V, P* M7 U/ a3 A6 kpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;. X8 o: H* f% f, W
    1 \3 F( Y7 l, j% v
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! ?; A) a; ?& v' y5 I' |7 P
    data1 = requests.get(url).json()! Y  [1 I4 L* M+ @0 z
    # pprint(data1)7 j3 q1 P9 m( ^( ^4 ?2 R9 a% I
    , u" y' Z4 ^. N' ?% X
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    4 u* V, _2 l/ G8 c4 {+ p3 w5 W  qdf1 = pd.DataFrame()
    6 t6 f. Q6 O9 X4 b7 y- qfor info in data1['body']['allMedalData']:
    # o, U* V1 B+ S: e0 L% q    name = info['countryName']3 ^5 O* u( ~8 ~! s  R
        name_id = info['countryId']6 T5 Y; X# y% H' F/ R( V5 g
        rank = info['rank']
    + z  g* z- \' y, |& a/ f4 o# j    gold = info['goldMedalNum']6 G3 y/ |) S% ?6 R) u0 Z: V
        silver = info['silverMedalNum'], O2 ]7 t1 |/ I9 X; Q
        bronze = info['bronzeMedalNum']
    0 T. @4 w; U) g$ S) E& \7 R    total = info['totalMedalNum']
    . b% s" P! {  A1 [7 ^. j    # 组织数据/ v6 Z$ v& }7 U
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    0 Z8 q8 U; I& q& p    # 然后追加df
    * u. k/ A9 S% l) C, r" }    df1 = df1.append(orangized_data)  y  l  I9 a- ~) }
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    2 u- [" X# W- W1 {df1
    1 }0 R5 {0 ]% E# j/ x& }$ @. T
    + H$ D! }1 S  S1 J- A6 |2 H/ g" A  H4 {! \
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。+ Y; a. q; I: T( R
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'% N; I1 I; X1 a
    data2 = requests.get(url).json()
    6 {+ V2 W' Q# }& e/ x- o, z! `# j#pprint(data2)) T8 q1 |+ M" p/ N! `/ D/ v
    . {* q7 X2 |/ ]3 P9 I
    df2 = pd.DataFrame(): N  |/ O- f" ]. A, i
    for info in data2['body']['medalTableDetail']:4 E+ K7 c; e# G* G6 P  E
        english_name = info['countryName']* P( G: u2 c9 N! ^% m- Q
        name_id = info['countryId']
    ( z7 F" n5 s3 F) Z    award_time = info['awardTime']
    2 a; Y8 f4 U/ J5 ^) j% h6 P  o    item_name = info['bigItemName']
    4 q9 ]) |0 [- w4 e1 a    sports_name = info['sportsName']% _' X- v7 i9 N* X; }& N
        medal_type = info['medalType']- B- r6 c9 t5 R- b
        # 组织数据
    ) ^7 |) }  ?& }" ?    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    % b% ]; t0 T6 [$ [    # 然后追加df
    2 w* q4 y  J# M    df2 = df2.append(orangized_data)% @. B! \4 B; i4 ~; c8 \
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% f/ o/ v4 z  G# H! n$ `5 z
    df2& s6 J3 ~3 x7 n1 \. n% P+ b* ~

    # p& i2 K8 w+ s( Q2 R& }对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    - q% b& T! F! ^7 O# Y  Z- w$ \7 n5 L
    + T8 P$ S+ k9 q! v2 x/ l3 ~
    二、数据预处理
    % v; a5 o1 d* }6 J由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    1 W; P6 _$ d& H% S1 d* p) u1 \- o" |6 u$ O' F' A% B7 |! h$ h
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:3 H5 X. _/ g" D2 B0 {
        x = f.read()
    & m4 J$ \  d/ A* v2 j: @
    0 R4 [' f* n2 w) Z- C+ L5 udf3 = pd.DataFrame()  u/ a2 L9 x& g  c* F9 t
    for i in x.split("\n"):
    ( E- K  t- w0 _# l3 f    x = i.split(":")[0].strip()$ a1 E8 @$ E" h5 Z  Q
        y = i.split(":")[1].strip()
    , R, X+ i. ?: ^1 [$ _( V8 d: p    orangined_data = [[x,y]]
    3 p) H6 n  {9 K! k; q# x    df3 = df3.append(orangined_data)
    / K  F. y8 Z& C: Z4 fdf3.columns = ["名称","英文名称"]
    6 T' c6 _" _% Y6 O4 d! ddf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    + x0 G, Y4 p/ ?# C* _3 ?表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。$ b4 L, T- V) _* Y& d3 G8 B9 K% e/ s6 {0 ?

    " X. ]* R  b0 `4 D, |/ R8 _3 Idf4 = pd.merge(df1,df3,on="名称",how="left")
    ) ]% C8 i7 a+ l& Edf4.head(10). _0 J3 r9 {& n2 ^# k% f

    ! }  w' r) B3 k1 Y5 `$ b/ N
    : d1 A, j6 t$ a" ?

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


    • # E7 f  C) m: K4 V) J  I

      8 F) ^" N6 \! Q* \" X$ I9 ^
      + L6 {& s  _! ]4 k1 J# T
    ) q0 U% H3 N0 Q0 I
    , h, U+ ]/ J! M
    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-4-18 09:28 , Processed in 0.494062 second(s), 56 queries .

    回顶部