QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录3 a9 p& p1 o) K( Q

    0 _/ {& k4 S! U7 R) K7 A( K文章目录
    1 o& ]( _3 G( o7 w) t" T  j& A" t/ `' v* C3 |% B
    前言
    5 _; a$ W) G# T
    ! R3 G9 k( ]3 D) Y' z一、数据爬取
    * ]& q8 p$ H; ?* k' r4 n5 \0 K" R( L% N- ^  Q. b/ N
    二、数据预处理
    " I, {- ^/ j, u& r. S$ i. ^/ S2 ~2 Y7 b- g: g. z0 C& r' j$ O; R$ w' h
    ​前言
    $ J  d* j' n+ U  F8 b- m0 r2 L. T# I本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。$ E1 O  y) d5 J: W3 N

    & {( ~& P0 |+ a* f8 w* z* w$ }" x+ [
    一、数据爬取0 Z8 y; t0 R. B  Q7 t
    import requests, c- @7 U/ [+ f" \- E: D" X  l0 L
    import pandas as pd
    , a& k- Y7 Z( e0 Q3 L( k! Sfrom pprint import pprint
    9 e+ Y% ?# V2 ?' l. h导入相关库
    4 L- q2 n" |5 P4 Q. v" i& y  U" |
    & t4 h" _( f2 E3 c2 \$ urequests库用于发起网页请求,获取网页中的源代码;( B4 u/ [; L4 w9 `' E' M) R

    7 r6 g4 A) u: }, [/ o; b: k) dpandas库用于存储和读取获取到的信息;
    - l. J- s1 c1 [6 D5 _0 j' b$ w% Y9 b& n' a( Z6 w; Y
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    $ j/ H$ {8 Y$ t  d, H4 `( g: N$ c; h8 l! X5 B$ Q  m
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    + _# Y/ W5 [  Q5 Z3 E2 mdata1 = requests.get(url).json()7 }; g$ l# ]- [
    # pprint(data1)' I, ~! @+ b" @% P5 R# J

    3 j/ i' L" \# M  {! q! m这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。! A: n, V* O0 R9 x2 Y/ C4 }! ?% W
    df1 = pd.DataFrame()
    , e* W9 m1 Y1 M& u! X0 nfor info in data1['body']['allMedalData']:6 u9 D6 c6 T) m3 H  M9 U
        name = info['countryName']
    1 \6 u' r% B, v0 ~7 w    name_id = info['countryId']% q. W+ l0 O; x0 b, a5 Q
        rank = info['rank']- q/ M; B( T' }7 k/ v
        gold = info['goldMedalNum']
    : l! r" a! _/ Z8 Y6 `3 v: ]    silver = info['silverMedalNum']
    6 P: v$ N- x4 X) x" {7 x$ B! B    bronze = info['bronzeMedalNum']0 y8 d8 p' D, Z& t9 s: I9 v
        total = info['totalMedalNum']
    + x6 c- n: S9 m: R5 f; o    # 组织数据
    - i5 z3 t/ a! g- F    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]7 ?7 y7 H8 e' m6 P, J1 K
        # 然后追加df
    6 [" H) r/ j0 {/ l5 m5 O# n: P: i( |, W    df1 = df1.append(orangized_data)8 Y4 X* s3 B2 ]8 O) R
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']; s$ ^2 n3 q- }* F; S% R
    df1+ @1 ^  i! {9 {  E9 |

    : A8 O1 ]: v5 h& j& P- n  \+ e
    $ N7 _; n1 c" P3 y这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。( ?) y4 {& K+ _: ^. j0 ^6 }
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    % J( q% H/ H3 W3 {8 wdata2 = requests.get(url).json()1 _4 W4 G  r8 t( a' t3 Y0 C
    #pprint(data2)* T( X" G' R3 R7 B4 P# Q) R+ x6 T
    % i+ H- N+ l4 C
    df2 = pd.DataFrame()
    5 ^$ o1 y7 x. F+ C# vfor info in data2['body']['medalTableDetail']:
    7 ?! N% f: d5 A6 n3 c0 q6 c    english_name = info['countryName']
    ; Z9 g' a% j& N1 e    name_id = info['countryId']
    4 u+ ^! g: N2 Y- `4 c    award_time = info['awardTime']
    / I1 z+ ^- R, ^& P    item_name = info['bigItemName']
    ( o1 B  w- Q4 `4 L# @- \" H    sports_name = info['sportsName']& ?6 K/ G' b% G# W0 c! h
        medal_type = info['medalType']- j: w8 d! q  e
        # 组织数据  {' p5 M- q2 x4 ]; H  h
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]/ x4 ~: b/ O8 r5 b! z% K0 P
        # 然后追加df
    : V7 j& i7 E0 B+ a; l$ m    df2 = df2.append(orangized_data)
    6 a8 _+ z2 b7 \" y/ y' bdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% l% e* d# J% w$ `/ v/ I5 R0 N
    df2% ]7 l' y! v# \7 J+ b

    0 E! P4 H. {8 G4 n对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    4 Y1 L1 U$ J5 J$ M
    . j1 S% c; X; q9 y/ i6 v) \- o
    * T7 \2 z1 H6 _* c7 _二、数据预处理1 O6 u- n* O8 ?) t4 s
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。& e0 l' K- `0 R6 `

    : p; ]& A0 n' V* v, v: _& Hwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:4 O* {/ w3 j8 d4 r: e3 [
        x = f.read(). }6 `: ]) Z2 ~7 c
    ' q; f% }/ N: S( W+ d1 a* w0 f0 e
    df3 = pd.DataFrame()
    ( Z' W" P) |) Y6 b, wfor i in x.split("\n"):- l3 A2 }  m$ `0 j6 K: x
        x = i.split(":")[0].strip()
    ; d7 K2 I; t2 n. s( Q    y = i.split(":")[1].strip()
    4 X# x7 J  u0 P9 N8 {% Y4 ^7 ?    orangined_data = [[x,y]]& g$ ?; N9 B/ ?; `  \7 v
        df3 = df3.append(orangined_data). k% T& \0 `0 H2 }9 q
    df3.columns = ["名称","英文名称"]4 h: y  V) O% B6 J1 t
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    3 L; D9 N/ d$ e: I4 E2 c: _8 U表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    4 ^7 J, c) ~. k) }0 H  t3 \7 w$ i5 _& I# x7 G
    df4 = pd.merge(df1,df3,on="名称",how="left")
    ( a$ H+ {% C1 Y: mdf4.head(10)
    ; F& k! y; ]; ^9 V, x' i2 {! p8 }4 ~- C  }  d! h

    " T) g, B% h, C) W

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


    • / m0 D5 B$ j5 q2 F& }, J
      2 ^1 V! u4 o& q' r4 g8 y5 F5 X
      9 q# L7 F+ h, q

    : h/ `& e+ G* R/ Z+ l, N5 I, l  u: V& a) |' b* {; T/ F
    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-19 03:11 , Processed in 0.399485 second(s), 61 queries .

    回顶部