QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录/ {/ s# g& t' p0 z4 T. K/ a$ t

    , W/ Q3 O6 C: I6 G文章目录
    5 x- T/ r, J2 M' {$ u: T, m! X6 A& X& @
    前言
    6 c" z4 U7 P* q4 d/ Z( L4 F
    ' ?# `0 i1 n. I( R* D一、数据爬取; k. P% h% N5 o* R

    * t" Z# V: S0 j2 S, }0 _( x" I二、数据预处理
    7 {5 ~; m' ^3 \( i. \% Q3 r6 Y" S3 d2 l, S# }- A7 e# ?8 a8 Y4 ~
    ​前言9 ?$ d- @$ U. d+ [# K
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。5 n+ l, q1 \* ^& X, @( X

    - C0 I, M/ m- ~4 ~& _5 P1 |* O) }( {; Q" S
    一、数据爬取
    2 ~+ T# J7 ~' ?) Iimport requests& B9 ]) A. T* t/ I' M
    import pandas as pd7 R: G: l3 U3 t& k
    from pprint import pprint9 ^# ~5 w: ^7 k6 u# I, z8 Y2 R
    导入相关库+ Q, z7 T& F( `+ z: v9 V% U3 d
      e8 I9 c. k# R' l7 S+ B7 [
    requests库用于发起网页请求,获取网页中的源代码;
    + W8 u( B1 q: D2 D5 z  `- `, [! Y' l1 C
    pandas库用于存储和读取获取到的信息;) @) u. j+ {& G" S. r
    % {% l/ L, T  F* Y6 C0 k
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    ( m# s1 a" ~8 {: N0 D5 U, {  c% n9 z: n# F- I( c- i
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'. [& U1 m3 t4 c
    data1 = requests.get(url).json()
    " [* d# E5 i0 c8 P# pprint(data1)
    ) s4 l6 o9 U6 z- x
    ) [  n" J0 v+ Q* J这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。2 W/ B, k! M- ^4 ]8 w/ S' k7 W8 Q
    df1 = pd.DataFrame()8 C: ~' V2 b& R& ]' x& }( G" j6 p! V
    for info in data1['body']['allMedalData']:0 l; _0 w  C2 h( C! i
        name = info['countryName']
    & z7 t3 S4 V! {) }: v( L: h: W* h3 z    name_id = info['countryId']! l/ L$ {3 O1 {( E3 y
        rank = info['rank']
    9 Z+ E; J, J$ o1 ^    gold = info['goldMedalNum']6 b# R/ U. k& L
        silver = info['silverMedalNum']
    0 I% _) y" A( G' b    bronze = info['bronzeMedalNum']
    % w& }# T" n  F    total = info['totalMedalNum']
    6 B5 C6 D. e$ I. D9 g    # 组织数据
    % Y: x+ U1 `) }( c5 m; F3 G    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]8 X% J3 b( D6 V( ^& g) L  o% y. e
        # 然后追加df
    8 Y8 O, X& P8 Y/ b    df1 = df1.append(orangized_data)
    9 n- |, G9 T4 s' n' ?8 fdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']( R, `+ }, V/ H+ d0 V* ?$ H
    df11 R  A3 u8 F& R8 `
    # I" {1 N% S6 G$ O$ V+ P4 u

    ) ], h  X4 T" [6 Z这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    3 ^& V+ S0 |: ?/ i8 A1 I, X3 eurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    , r. F7 \9 v: E+ G& H' @; Hdata2 = requests.get(url).json()
    ' j, C9 o. J+ |( G#pprint(data2)
    : H/ I+ z, H6 x2 Z4 q& M- v- w: ?! x4 i8 b- X( Y* ?; P
    df2 = pd.DataFrame()
    * [& {8 o) B8 X' O' j) Y$ Nfor info in data2['body']['medalTableDetail']:; }4 M0 c6 p) L+ K/ _
        english_name = info['countryName']* }6 {4 I6 e8 {+ l+ x
        name_id = info['countryId']( ?( y- y4 B2 K9 v( {4 G
        award_time = info['awardTime']1 n1 F8 O# D$ _/ d% r% ~' e
        item_name = info['bigItemName']9 Z. w7 N; E  ?0 S3 y! F
        sports_name = info['sportsName']' i( V) n0 _8 Z9 W  h  E
        medal_type = info['medalType']
    ! g% [% n3 P* q# X5 Z* W( R) n5 T    # 组织数据7 P6 T. M+ S* J9 v
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    ) E" J8 [/ `6 ~, n  \- J    # 然后追加df
    # C7 z0 r- h6 F8 H$ V9 F    df2 = df2.append(orangized_data)
    6 _% J  k& A/ f$ ]df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']9 ?. x. B# I4 r/ N3 i: M$ b% y
    df2" l# z7 p# {: s) |
    2 U  F7 _( r8 p, j- W
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    ; g' Z$ B0 E7 w) Z: ]& c) b# E+ |# f
    . y8 N& ?1 [. G( g: j( F
    二、数据预处理
    ; l) l: G) D9 x  L由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    7 p0 h$ g8 S/ ]& }8 \
    / U, M5 {5 \' `2 _  [5 `with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    3 O8 Y& B0 f1 h' U+ S0 D    x = f.read()
      r" Q( f$ H* L$ o( ?, F6 [1 R  F
    0 \% P/ C  u5 g* w& k& D2 u/ f1 Ndf3 = pd.DataFrame(), ~; g% d  y$ T5 k0 @! m) ?2 j
    for i in x.split("\n"):4 _  U  u2 ?4 _$ f! B) Z6 ^
        x = i.split(":")[0].strip()/ V1 W7 s% m( k
        y = i.split(":")[1].strip()
      \, z7 W/ f6 p7 E0 ^2 t& u    orangined_data = [[x,y]]
    8 j: [% i& c  W    df3 = df3.append(orangined_data)
    8 N/ C- t1 r0 hdf3.columns = ["名称","英文名称"]
    6 H3 L# Y% ~, t1 h- ]% Ndf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)% b  h2 w/ [; b/ J# O" o
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。& a: J+ J4 y) F2 L' M! y) a

    8 G( K- e: L1 c/ m: i$ Zdf4 = pd.merge(df1,df3,on="名称",how="left")' C0 I4 H  g- F
    df4.head(10)
    : E4 _5 W3 n- o, ^; ?
    / J4 ~7 R: F  n# k
    6 s( U; W2 t: e5 Y' q- U+ e

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


    •   H1 T1 V( L/ T7 V1 q6 z

      9 F" w' W' i, T1 e9 g
      5 n6 s, k, {& q! U

      ]% H/ e* B3 _; S
    ; T3 M, w: M% Y1 i
    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-21 02:16 , Processed in 0.380008 second(s), 56 queries .

    回顶部