QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    目录1 f4 ?  t( G( o0 _# m. \
    9 E5 j4 y" D# s' i
    文章目录
    ' c4 N. x( z: `3 T8 E. T# E
    & Q# m" E* F' b" V& i* N% r前言
    ; r2 m* b# R7 C5 z* s! A4 u5 U! \- E( W/ q2 `& a9 W' \. Y( p
    一、数据爬取" J2 o. x- S, M8 y* X" `8 r( S5 Y

    8 l- ^! ~8 v0 U7 I5 e" e  n  e二、数据预处理. r8 j: N0 [' h3 c

    4 p/ k5 d2 h  x& B​前言. L) R, d/ y5 w& U9 c9 @7 {8 t' C
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。( o1 b' q$ H$ P, u

    , I! K+ o- o) E( B3 `6 m; e1 A: i# F) m; C' w
    一、数据爬取
    ' U4 R- i1 [% G* y. j5 L$ mimport requests
    " t7 d7 f8 j3 Jimport pandas as pd
    / ?- D5 e  ~8 r( ]0 F$ {from pprint import pprint: t. j& [: q# h' o9 r( g
    导入相关库: J# S( x* k. J' e7 p
    / @: h: ~: J, Q. n$ m7 N& L
    requests库用于发起网页请求,获取网页中的源代码;. X9 Y& C' n  }+ P  A- q# W
    - d! z# ]1 _/ }3 u; y4 y
    pandas库用于存储和读取获取到的信息;
    + Z- }- I1 N6 H; o& x  x' t# i8 p/ u1 i/ H
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    + b" m' N$ S4 L1 M2 j( G$ ^' q/ N# @+ B  [3 [4 f
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609') Q1 @7 h0 f) r
    data1 = requests.get(url).json()6 ^# m, ]4 i9 H
    # pprint(data1)/ s% u8 |6 U' ^- Q3 J& U) B9 v$ x$ o
    $ E* J& z- v$ \9 b. L
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。2 P! U! y- X7 U! G" c, q
    df1 = pd.DataFrame()
    : B% `0 [8 ?6 {0 _+ ffor info in data1['body']['allMedalData']:
    4 l$ }1 i7 i* [, g2 A    name = info['countryName']
    : |; ]4 x8 d9 [" W8 m: L  `5 {# z    name_id = info['countryId']0 R: s( J6 a' n9 N# Y
        rank = info['rank']1 [9 w0 G3 ^2 X7 Z6 C
        gold = info['goldMedalNum']: r( w8 @7 d+ a% Z
        silver = info['silverMedalNum']
    5 p; y& I) Q' ^% W8 s" _/ W    bronze = info['bronzeMedalNum']
    * N3 c, {6 w1 ?( V) |0 `) ~    total = info['totalMedalNum']: i) j) N2 ?$ z* W
        # 组织数据
    ' U4 y/ I4 O( O) X' i    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    % x/ ?2 s; i2 e, d9 ]    # 然后追加df
    ' Z- ?: b& ~- M7 E+ Z    df1 = df1.append(orangized_data)
    & v1 A6 x' `/ M& S4 ydf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']( ^: Q$ W, K: [. _3 ~
    df1. I/ ?) {& B1 ^$ u' V8 v$ ?6 e
    & \7 S5 F" [2 o$ B7 {& v, G$ z2 x
    9 z/ N0 k' F* B/ s  B/ C/ W% U, U
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    ( t" l. m3 _0 M) Lurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'. }: n7 x' S: u. L
    data2 = requests.get(url).json()
    7 _/ x* o8 o% O$ P$ ?- x; n) \9 ^, |#pprint(data2)8 {! a+ x; a) j2 F8 a2 E1 D
    : g+ k; b! @4 |; g7 N
    df2 = pd.DataFrame()
    & i8 }/ q% p. H3 T0 S& W# Vfor info in data2['body']['medalTableDetail']:( I" r. i- o( e' U# e' o
        english_name = info['countryName']3 }+ |& {; V* \/ S1 H. f8 i. p
        name_id = info['countryId'], T# d! y0 i; u5 M* J) k5 E
        award_time = info['awardTime']6 X& n7 ?0 e( o8 |  Y) g
        item_name = info['bigItemName']- ~2 `& B: ~; e4 U0 i
        sports_name = info['sportsName']
    " Q& l6 y* j) |) b, l% n0 `7 ^" q    medal_type = info['medalType']
    , t$ k" S) L  x" [4 ~9 `    # 组织数据
    ( P& [* |- D; t7 W0 B) `    orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    6 w7 z/ s: M, ~" I" n8 F  D    # 然后追加df
    ) t% {# f$ h' {. A% w    df2 = df2.append(orangized_data)
    * ^, N( j: N3 `( |3 T" r. j" pdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']2 }8 h* o8 ^( s
    df2' A) y) k. I9 M& S

    - O, Q' h- U# c: n. f; n对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
      s7 f& i$ e: @, j9 s0 M2 E$ _7 M, w6 D

    & @% d* Z! ~2 W% I; o$ e! [. R二、数据预处理
    ( \+ J: Y' w+ P& b. R由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    # F) i4 x2 l7 P4 p) D6 S5 k2 j* n6 R7 M0 z* o. G0 Z  Q
    with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:) G( L7 _1 A9 f" m. d6 z' c7 o
        x = f.read()
    ! c# h' {' E3 i7 D+ T+ i7 a9 ?; @+ n. Z% _4 x& c7 \, a
    df3 = pd.DataFrame()1 u3 o* s& [8 @: |" p
    for i in x.split("\n"):/ u% A9 V& E, Q, f( X! _
        x = i.split(":")[0].strip()  E8 ^* P0 b' d& @. `2 A
        y = i.split(":")[1].strip()$ |. X; _9 h9 S8 `
        orangined_data = [[x,y]], V6 x& `9 e8 m/ b$ \* t' \
        df3 = df3.append(orangined_data)9 m  E; ^) z# ~3 D1 a* p
    df3.columns = ["名称","英文名称"]
    : ^1 G$ i. q4 u" r) ndf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)7 d# r. Z& I4 s* R6 F
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。* F9 A: S* E3 H. l8 v
    9 \( p. J  u2 q  N( X
    df4 = pd.merge(df1,df3,on="名称",how="left")
    6 K2 j3 D" c  r4 q9 ~  Xdf4.head(10)+ O6 u. D8 t, y. o( l+ [' H8 i
    ' j$ C% t* K. a0 l

    ' Z- h5 \  {  y' E2 V

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


    • 7 m- Z: \  K2 {$ q

      6 b8 L; q' [8 m; ~, ?+ ?, [8 b  c% I2 p# o+ j

    7 e" b1 W8 u& u3 [2 w# V
    * f& D6 \7 q( F5 v" w* n
    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 13:50 , Processed in 0.447893 second(s), 56 queries .

    回顶部