QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录1 J2 u: T: K* I, k
    1 J2 v$ j+ ]+ U
    文章目录4 r4 ~- X" m7 v7 U) E/ s2 `6 n

    ( P; X$ E% W: f6 W前言
    0 H$ Y1 [" [, V: d0 p& Y
    ; f# s) l$ `( L% k7 ^- x一、数据爬取
    0 k4 t* C- s, |- r# \# o' w, c/ ]& `% a" X/ _; o  L  h
    二、数据预处理
    % l# Q6 S1 ~) F! C- S  v! l0 r' y) B( V
    ​前言
    & {. v. O% C* I本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。: l2 v' v: h6 p% i2 ^
    5 Q4 a% h% z! h  g+ Q: u+ ?" ?
      J+ q0 k' z; A3 _1 p' X$ P/ [1 I# n
    一、数据爬取7 m# E+ J( G* }" F* k
    import requests7 U; }4 `) @. `
    import pandas as pd
    ! H8 \4 o7 q4 C7 ]! ifrom pprint import pprint: }  g9 s- i3 _% m
    导入相关库4 a. p* w* L9 O1 s  T$ k
    $ |+ ~5 h) n. Z% {# f
    requests库用于发起网页请求,获取网页中的源代码;
    " C" H! {4 X/ e! g4 G% X1 H& ?
    2 P* V6 d) o! Npandas库用于存储和读取获取到的信息;9 B6 \9 _7 p% D2 N5 r
    : ]0 [& n* w& t9 b
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;- ]% r6 M/ J1 {# l! X- n: v

    # V" r6 |% c% j7 s+ P0 Ourl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    % C" y  R4 h$ udata1 = requests.get(url).json()
    ' y6 I+ V, c, J( z# pprint(data1)
    2 l/ E$ e! d5 ]  O
    4 y9 `' g! p2 ], ?! s这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    * N" v; c3 L- s+ y  D$ ~df1 = pd.DataFrame()
    ; I! ~# @: b" v- z1 y9 nfor info in data1['body']['allMedalData']:
    1 H) J* s- @$ R2 U    name = info['countryName']
    ) w& s2 a2 G+ x% p    name_id = info['countryId']
    . z" ~1 J7 f& ~: `; j1 A  ]    rank = info['rank']3 c( g  ^) O: L* J* u$ h! ~
        gold = info['goldMedalNum']
    + i8 J$ Q" |1 l' M    silver = info['silverMedalNum']' L' |: p5 f- C1 F$ _$ R' m4 K
        bronze = info['bronzeMedalNum']7 t2 Z0 A# A5 ?1 |2 p
        total = info['totalMedalNum'], u# o8 x+ _2 ~
        # 组织数据
    $ [6 U( C: S$ r( k6 z  p    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    5 y1 _# R! g$ h+ Y    # 然后追加df, y6 v' A) d' D  w9 `
        df1 = df1.append(orangized_data)
    6 |* r/ S) m. b- p* c7 s: m6 R/ Ddf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
    * O. k' |7 B8 x. G5 ^df12 t/ Y' o  c" i" y1 `& U# Q( v
    0 ]% a% K& W8 w9 `2 B

    8 O' f7 `" T7 G- V1 l& K0 q这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。1 R8 n( K2 Z$ @7 N  W
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'1 d# v# d5 D( z
    data2 = requests.get(url).json()4 }2 M. q+ u0 b
    #pprint(data2)( {8 H+ S& c% i8 h7 \
    " X/ U, l6 `# w1 [
    df2 = pd.DataFrame()
    3 Y9 E  G7 }/ lfor info in data2['body']['medalTableDetail']:$ y; r$ G" X& o1 a  ?
        english_name = info['countryName']
    ) j2 t8 Q& }, l0 H7 H" Q    name_id = info['countryId'], k1 X2 {) p. L( Q2 @( E
        award_time = info['awardTime']( b7 X: M3 p9 b# }' y, ~
        item_name = info['bigItemName']& A5 a" S" x8 H* F; }
        sports_name = info['sportsName']
    7 g( O& \1 X2 n" }    medal_type = info['medalType']
    4 l& E6 P% H5 i+ i    # 组织数据
    8 m" E, ]4 V" y8 W7 N/ |  `7 G: n, J    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    6 o9 y+ _; ]# o  b6 @: h    # 然后追加df, z5 C+ \- R* g3 w% A$ i& w9 D+ {, C
        df2 = df2.append(orangized_data)
    ) B5 w  Z7 r% w8 v$ ?df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']# a! A1 R) J7 |* U9 D
    df2
    . A0 {! x' O. r+ Q2 `4 J+ t( A
    + \9 d- A$ s6 t. p5 f) x对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    % u' Q1 p% R1 l+ N" G7 f! `% j# M8 E4 o. Y7 w8 r3 a

    2 o1 O- }) M, [3 _9 a* p0 j二、数据预处理! n# p7 L6 _6 I8 b8 ~# O- ^
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    & F8 L* b& K  r* z
      l& l. G  ?6 d- j# Zwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ! N' {6 Z9 G' [    x = f.read()- v- v3 J  w/ T/ B- ~# r

    2 \, n7 J# X, o' E7 H7 Gdf3 = pd.DataFrame()% m0 S+ A5 s! H& V
    for i in x.split("\n"):
    5 l2 r. o# S4 |: {. r# e    x = i.split(":")[0].strip()
    ( @8 N; m# E! o' @* T2 d6 i0 h3 D    y = i.split(":")[1].strip(): t4 n1 k5 e7 w4 J& H
        orangined_data = [[x,y]]. q) }5 @' {# b/ B" t- R" G- ^6 P
        df3 = df3.append(orangined_data)
    # j7 y- C$ k. g& q' zdf3.columns = ["名称","英文名称"]5 B% k" y: \( y) q: ~6 t: t* @1 U
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    1 x: \5 I. P& A5 J8 X8 _9 x! z表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    ' j7 N( j0 D3 x$ e# f1 V( d# m) A$ x$ b1 [
    df4 = pd.merge(df1,df3,on="名称",how="left")
    ! M3 h3 J6 t6 l6 M/ I! f# Edf4.head(10)
    8 _- F; G2 f& P( _( x* }: m
    1 C) f0 u1 j2 Y/ p4 M3 i
    * W4 X0 n4 e  M* ]# \

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

    • 1 R( g5 j' D3 B: d: M) r

      ' [' }' ?( g1 p1 M
      % j$ ?1 C$ E4 X' s) K% J0 d- [

    9 j1 ?; f" @0 _& k* q) R# F- x- @/ q& I1 X& r: 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-6-19 13:58 , Processed in 0.465700 second(s), 56 queries .

    回顶部