QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    . E! k7 E- ~, S3 T, R5 f, U
    / ]4 l5 k3 Q9 K/ _; Q! Z文章目录
    6 L7 c' x2 F* I% f" R! D, Q6 ?6 o: z
    8 g) q* F0 M' Z* E7 D前言; v6 p) f$ F; L5 h! k
    ) N% D+ V# z& p- Q- B3 y# M
    一、数据爬取/ P3 C0 X4 b5 Y* R& T
    ; V1 }2 z, E9 ]" t' O, z" n; i
    二、数据预处理
    7 c6 k' ]% l: U! I# N) g$ o! d' g3 \& v
    ​前言
    % A4 w) ^7 @, S4 H9 Y2 P/ Q& _本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    9 ^: q2 G( i7 K) P5 @3 U9 g0 U) C4 _! r6 \8 j6 B$ G! z! c

    - {0 r! ^: `4 ^; Q9 ]0 m& D" n一、数据爬取
    2 q- ?% R+ Z3 C% wimport requests
    ( t* w8 f9 i7 h9 O# C. I$ s6 i5 C/ I: v/ Iimport pandas as pd7 k9 q" w% y" o3 P* G9 w# U
    from pprint import pprint
    / s% W- G, i$ c. D; g; z4 N导入相关库
    ( ?9 l) y8 w$ G2 a8 b- A& i9 p4 m$ y' `
    requests库用于发起网页请求,获取网页中的源代码;% a3 e* m! W; T1 f' K6 D

    % K: Y# q$ e7 \* I* ppandas库用于存储和读取获取到的信息;: @" v1 ~' N4 a3 v/ i
    : R, o9 S$ p! P& ]
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;& X; u" r( Z) j! @  j
      X8 {) Z/ H. Q+ ?' y6 W5 {! I" _
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    / B0 g2 r1 _4 ldata1 = requests.get(url).json()+ a, R6 a2 ~1 w* ^4 {. q, T
    # pprint(data1)0 Z* }8 s% r+ }/ l+ l. H' V2 I- R

    . J4 P: A9 E( x3 D9 p6 N这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。& W( Q  m  t( T
    df1 = pd.DataFrame()
    & ]+ y) n5 z; ?6 C6 qfor info in data1['body']['allMedalData']:  Q" J8 Z5 V  [) J2 }6 Q* F
        name = info['countryName']+ A$ g3 B, ^9 |. H
        name_id = info['countryId']
    # ^; j, V3 s5 h9 s/ W7 P! Z    rank = info['rank']
    : I# G1 Z' U: H2 P. X    gold = info['goldMedalNum']
    6 V& v  p4 f0 v+ t0 \0 i- i) I    silver = info['silverMedalNum']: Z9 m$ z. H# Z' I
        bronze = info['bronzeMedalNum']
    3 j% k' i7 @" W  x5 a1 x+ t    total = info['totalMedalNum']
    0 ?% N' n$ M6 ^) u7 o    # 组织数据
    : z! S3 @5 [* y    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    0 _" g  \& z( k0 D    # 然后追加df
    / Z- ?% O+ |$ F2 A8 ], x    df1 = df1.append(orangized_data)
    ( p( F, E% K) P) G3 C6 ^2 M) [df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    2 m- R) y3 \) n+ i3 T2 L+ ]df1& M  p- s  k! f3 I5 s8 _& t

    % D( `9 ]6 {, ]7 a, B% _% q4 f8 @$ m
    ) f, }- ?5 X1 M& d这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。6 x7 t  C# t1 u* g& L
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609': G  b; m# `: E: Z& V
    data2 = requests.get(url).json()
    $ d- p" C; e- K0 v#pprint(data2)
    " c( Q8 S6 [3 W/ f$ u4 {9 `4 E& L' W* L- I+ B' g  ^
    df2 = pd.DataFrame()
    1 o  j8 L7 V6 i% u& _& Rfor info in data2['body']['medalTableDetail']:) j) W1 ?  G( P! ~) h2 m
        english_name = info['countryName']
    3 b2 {- _9 t( V3 f5 O4 Z: T% h    name_id = info['countryId']4 C0 n# B! q& t! y
        award_time = info['awardTime']
    0 c8 ?4 A$ m5 W5 s1 U    item_name = info['bigItemName']; J3 H) \  a, E# B# F$ v( ^& a% o
        sports_name = info['sportsName']9 R" ]5 R3 Y' C7 s! W0 X2 ^# k
        medal_type = info['medalType']- p" E! L7 x! F
        # 组织数据# \/ v9 i1 a# Q3 A( {$ r- i) {
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    + @. `2 o- k+ W1 u0 u    # 然后追加df
    / W$ U7 @$ K6 o4 O2 E/ y2 S    df2 = df2.append(orangized_data)" _, \; Y, I. _! L/ c, T
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    $ I# N, e7 {5 n6 e1 ldf2' V! c1 F5 W' A

    % E* e3 P. G) n$ n对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 : Q# U5 X# L5 R! g" ]; C! [

    " a8 v- k- Q% ~/ l
    ! y7 o2 C' x4 J) P! v9 `二、数据预处理$ t6 p" n$ M1 A  |/ J' z
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。$ B1 T6 {/ M- e  ~, u

      G) I" e. H  O. V( ?' h! Qwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:7 v8 }" p. r3 u. D
        x = f.read()
    . ]2 Q$ G# `& _% O, t/ Q$ l& g! Q
    6 c; @& Q$ r# j$ `! R/ Mdf3 = pd.DataFrame()
    7 o8 v6 O, E2 @/ yfor i in x.split("\n"):
    7 \  Z/ J6 ?* o" l5 P    x = i.split(":")[0].strip()1 }# b% ~. i8 v. Q' @
        y = i.split(":")[1].strip()& z5 q+ T* _$ |
        orangined_data = [[x,y]]
    0 R& m+ k9 b, I$ N/ k    df3 = df3.append(orangined_data)! Q1 L7 k- ~! J% {# u0 r9 r
    df3.columns = ["名称","英文名称"]) B; `* U7 p  A5 t& K5 ?  c+ n8 X: ~* `
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None), a/ `) \1 u4 w- U/ Z
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。5 Q7 m3 }' f6 x  T& C4 R

    " g9 e8 V# K, o% m% m4 a2 ?df4 = pd.merge(df1,df3,on="名称",how="left"). e& Q/ w6 e3 D, \
    df4.head(10)- u3 K6 ~, k5 ?6 v& u

    1 H3 Q" B7 X7 X* m0 E3 y) O; q, k& N) M2 A

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

    • ' B: K+ p! T* V* @: n. I
      / p. P" R9 k" j9 G" p
      3 m9 _9 X3 r$ h2 X! e# @
    $ s: \3 b; L+ k/ ~
    3 Y" t. ?9 z; q; l4 w
    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-18 11:10 , Processed in 0.425154 second(s), 55 queries .

    回顶部