QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    . ^! S9 U: {  f; M
    + [  C- ~4 _8 m) P5 h8 C文章目录( v% `8 X; I& r/ F
    " `- G* n- X! _' a
    前言
    4 p: f5 @& z* ?: f  U, n: ?* b
      m- T" f0 ~5 g1 |1 l一、数据爬取# w6 v4 f( h' o; {2 L6 K. Q) i

    8 g$ B1 s# {2 M0 ?: @: @# Q二、数据预处理
    8 z! C3 z+ p4 o5 O5 V0 \. N3 W4 Z& M5 c6 V8 S4 [- t
    ​前言4 a  q$ t0 u0 h1 L; D' W
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    & q* o3 k5 F: I  d; Q
    8 d0 l' O6 N9 a9 W1 V* s. C$ }2 V8 j
    一、数据爬取: U% _/ u6 {& P/ v2 ?7 I
    import requests* d" b6 ^2 ?# B+ c( s
    import pandas as pd2 t( b* ?3 @. o* C
    from pprint import pprint6 F" G& i: @2 ?
    导入相关库- ]6 A9 |. ^. W7 L* ?. K
    8 W9 P8 P" E, Q' R
    requests库用于发起网页请求,获取网页中的源代码;& p$ M& _5 u( Z
    ! F1 W# a2 h+ ^* y( Z8 O4 S
    pandas库用于存储和读取获取到的信息;
    * ~5 @4 I/ p: M# M4 g' t0 b( y0 \5 c9 o- ]( ]
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    + E1 l: W4 N9 f& h2 Y- P
    ' M+ k# |$ G3 ?% Kurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    7 ]* ?. x8 E6 T4 q% mdata1 = requests.get(url).json()' w9 |7 ], g6 G. i5 P( v
    # pprint(data1)9 Y2 r/ ?5 v4 O; G8 e

    , `" r  D# Z" R# w, h: R9 _这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    + Y$ @- P- Z+ f3 I) b( \df1 = pd.DataFrame(). Y: k3 q1 H" T+ b, v
    for info in data1['body']['allMedalData']:9 y2 x1 Q, p2 T2 @' d( }, ^/ d
        name = info['countryName']
    + z$ a  r" C+ K# `; r9 a5 h* G/ x    name_id = info['countryId']
    , R7 @* L# u8 @8 {    rank = info['rank']
    ! |  M2 m3 Y! e3 U6 _    gold = info['goldMedalNum']
    ! W1 E" W6 a2 v. s( ?    silver = info['silverMedalNum']
    " N+ W6 d& \6 e% i9 c7 C8 j0 Y    bronze = info['bronzeMedalNum']
    : ?: n- ]- f3 B! T0 e1 `    total = info['totalMedalNum']9 F7 O( u6 o% a2 [, k
        # 组织数据
    5 r) |' ]( f) L- t    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]' T" `7 F, ?  d9 e
        # 然后追加df
    ; l7 X9 d0 H9 n1 ]6 y9 O7 N    df1 = df1.append(orangized_data)7 O6 O: n: L/ }8 E- [' x: {
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']- ]" A' A, y1 i
    df1
    ; Y3 z* g' {$ @5 B  E
    ; O* S2 J; H; C% C' ~/ X8 s8 p5 q* W# k; s, v- a% Q# p: x7 J
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。. U) O/ n6 \- o, x- @4 B" u0 S$ A
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'0 b" h. m9 D9 c6 E# z8 e. {+ u; V
    data2 = requests.get(url).json()# H! p: I+ |. C6 }; k
    #pprint(data2)
    7 j9 ?0 b  A* s0 k  O+ v( F
    7 d. d. G  r" \# h0 ydf2 = pd.DataFrame()
      I  B3 k% M0 |7 ^" Y# X  H0 lfor info in data2['body']['medalTableDetail']:
    0 g+ n9 y6 }! o$ }& N4 H0 t1 J) ~  b    english_name = info['countryName']
    / s4 [1 i6 h1 T5 o    name_id = info['countryId']4 z  ~/ q2 \6 m' W/ X; k: t, N
        award_time = info['awardTime']
      X# F0 V" m: O9 _    item_name = info['bigItemName']
    4 T& `0 i, ?0 k# s5 p+ r9 G8 S    sports_name = info['sportsName']  C* c# p6 y. }+ ?5 m
        medal_type = info['medalType']
    7 G& k0 `3 O( y7 N/ U6 x4 v9 W    # 组织数据/ q4 I; {! v# g, X* x
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]8 G( A& Y2 X) U( d& M5 w6 s$ t% Z5 x
        # 然后追加df
    % P  b8 p5 ^6 G9 W4 m! A    df2 = df2.append(orangized_data)' ?+ @1 W: Z. ~* Q1 }
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    # U# H( f/ _  L- a9 }/ N5 R5 t8 S# E: ldf2
    / ~1 }9 A: Z: B3 U5 ^8 C! S& W( a0 x
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 - @4 E( G6 p% B8 R) Z6 }" u$ B3 z
    : m* M, X, L: r7 C% @0 V

    , [) S+ t/ z9 F3 P二、数据预处理* G, ]6 S3 q4 F1 `
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。1 x: ]1 O( A4 N; V" R: d
    4 g* f) k5 n8 G& y5 o3 k
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:4 d4 |0 k# m1 ]4 s
        x = f.read()9 m* W) u8 v' y
    3 b7 o# B! L6 K& S7 k7 d
    df3 = pd.DataFrame()
    + z! @  |  L) X5 Tfor i in x.split("\n"):
    ) l/ Y- d+ ~  b1 b( H3 f0 q0 s    x = i.split(":")[0].strip()
    # l, G3 [, `1 a# W& w    y = i.split(":")[1].strip()/ X, v* G+ o1 ?8 P  s1 T
        orangined_data = [[x,y]]
    # |3 P/ e( i: |2 C! j0 P1 n    df3 = df3.append(orangined_data)+ m6 a  z6 X' d$ }/ o+ U) l8 \- _, T
    df3.columns = ["名称","英文名称"]
    0 P8 q+ |2 M7 M0 C7 J, Fdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)3 {! O0 W. B5 m4 R& @* n- O0 N; z
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    2 y* g1 u& |& z! t* ~7 N- x! @6 @6 z3 s
    df4 = pd.merge(df1,df3,on="名称",how="left")5 G. @! `$ I3 K) h3 P( ^8 g9 B5 j- Y
    df4.head(10)
    : z+ L, d5 v/ q- W3 o) c) N$ p
    - ^. o8 e9 G. a% t8 k) J$ E, D0 Z' D7 ^3 d6 z& f9 H1 ]

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


    • ' }5 E/ f, ]% R

      $ C+ ^7 {1 J6 `5 u$ M/ t$ p# A* J0 _) `8 R/ e5 }- [
    ; [$ s' b0 C1 F- n, }" Y

    . R: r# ]/ H* e3 o5 G- t% i# U. m+ z
    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 23:14 , Processed in 1.712665 second(s), 56 queries .

    回顶部