QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    % f* a. B" @* [. L2 D( B  E% U, x7 V/ v
    文章目录' \! X* p( S9 t* O

    ; }5 N+ W, \4 X* A. w前言
    , }# V- I3 d2 {/ A. @) l6 B
    2 X. ^$ U+ F# J' T: n1 r一、数据爬取
    1 o6 h5 Q) U* x7 G9 F3 s4 y; X$ }0 y2 ]- ~( F
    二、数据预处理, \7 J1 f& s# M( _4 \

    , H) @9 E7 g8 L  a​前言
    ; [3 _7 L9 I  S1 g) V5 S, I本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。2 w; O8 I: {) ~  n) L9 h& \$ t

    ; Q8 M3 S1 y2 G/ |9 t% {: \6 M
    一、数据爬取( l/ K8 a) T% |5 k1 g# J$ X
    import requests9 w5 y( v6 j* y+ P3 [
    import pandas as pd1 c$ ?/ x: a- S: t2 X
    from pprint import pprint' s  f) z, i8 M
    导入相关库5 |, \- @+ C* N% N* u
    4 [/ n! P) z7 U& A  f% i
    requests库用于发起网页请求,获取网页中的源代码;
    # G3 E0 O# d9 N2 L, \* F% S  W3 e8 R, m; ?- l
    pandas库用于存储和读取获取到的信息;
    ) U* H# X6 L3 p. i' F% S
    0 I- ~% w) d9 zpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;( }. N, L; O4 |, Z/ l3 V

    $ A) [( K$ |* a4 P, U/ c0 M/ furl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'2 [" p, c, ?- S7 C' u$ a' p
    data1 = requests.get(url).json(), U$ y$ d7 Y; N' h' \& }  y' i
    # pprint(data1)+ I2 n+ g! K; d8 H% }) q2 \2 r; t

    8 X* B6 [7 ]1 j, t2 S这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
    4 q5 ~  @# h% K& R9 R0 d# `df1 = pd.DataFrame()
    * y% `7 I+ P1 T+ m. Y' P9 [( Ofor info in data1['body']['allMedalData']:
    1 K4 `; s( t" o. F+ y0 a    name = info['countryName']
    9 M0 U1 a; @9 g" l3 M: |8 V2 y    name_id = info['countryId']6 w  N/ W/ ?8 |6 M1 Y
        rank = info['rank']; B/ c" l7 U$ r# x4 v% h- R
        gold = info['goldMedalNum']
    2 r; M7 L1 l' U    silver = info['silverMedalNum']
    , {$ E: G' X  q8 {    bronze = info['bronzeMedalNum']
    3 N/ a) g6 _9 a* o/ G* C    total = info['totalMedalNum']7 b9 ~2 {- z! t3 p( {
        # 组织数据
    ; m2 I( N' o2 b% H2 j. L, ?0 x    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]% N+ B: x4 d* y7 R9 n$ f* {
        # 然后追加df7 [7 A8 G6 q' L& p0 J; J
        df1 = df1.append(orangized_data)' z8 R# Q. @+ E3 z6 ?6 S- f7 t! a( m
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']6 }( c. s0 d* o* n& D
    df1
    ( a& W1 q/ ^+ k7 Z9 w  d' [
    4 j1 w/ T4 f$ v8 z8 E# q: H2 ]( T
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    ( \2 F+ i  W6 `* m8 ^) v$ Vurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    ) B. Q8 i7 `0 e$ F. A% t) y+ X) S$ ^data2 = requests.get(url).json()
    ( |. b' c# H, M0 R* L. `' y#pprint(data2)
    ) o3 L! u3 E* l" M. @( L; z: T0 y0 f3 ?" G/ J
    df2 = pd.DataFrame()
    4 d3 d" l( }  @6 Tfor info in data2['body']['medalTableDetail']:" z1 [3 x/ O, ]1 j6 o
        english_name = info['countryName']
    7 W; k( {# o( |6 ~+ q    name_id = info['countryId']9 e# X" U, n3 s0 l) s3 W" W
        award_time = info['awardTime']1 A4 a: |/ D- |; g3 f
        item_name = info['bigItemName']
    ; Z. v3 c1 w% r& u! N) F    sports_name = info['sportsName']0 ?4 ]% d* l, q3 o7 P
        medal_type = info['medalType']
    2 `6 |. w8 v0 ]% g$ F! D$ _    # 组织数据( E0 X$ h! ~0 a# s6 _
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
    8 V1 c+ n4 N# s# f: }! }) q    # 然后追加df
    2 m: @% P% |6 P8 H7 J    df2 = df2.append(orangized_data), _) M( X) {5 s2 }3 R- O/ w
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']4 S( y! p8 R8 f5 X4 p9 P
    df2' ^2 o* a3 R2 m/ ?
    ) i& ?; O3 i" h# E" r* q) U
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    . @5 ?( Z7 K9 g; b' g. v+ J% }: {4 F( v( W8 L% t$ O) G

    3 s- S  i; N8 [1 S$ j- w5 }  ?* X二、数据预处理; ?# m8 w$ Q: S
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
    6 n% y- R) z* f% b$ Z8 ^& m' `
      e; R: b% X! m! I! N5 l- M) Kwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    4 I' w. b6 ]# S    x = f.read()
    8 G& b) B) I( X  b# V0 L, |( |7 c& U. ?8 y- x
    df3 = pd.DataFrame()
    ; m! y( t' y" g2 j: p$ J3 Q  L; dfor i in x.split("\n"):
    8 X. G; `' y( \    x = i.split(":")[0].strip()
    2 \  y7 ?3 D+ I0 u) X# h    y = i.split(":")[1].strip()8 T& _/ l1 E) L! D& H$ B, U" R
        orangined_data = [[x,y]]
    2 p  v! O: U1 }: Y- }    df3 = df3.append(orangined_data)1 R$ g0 u$ F1 P# U
    df3.columns = ["名称","英文名称"]' c; Q# Z6 i8 @+ |) @3 G5 s
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)% A3 t" h( C) r$ o" j% h) ^
    表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。' x' h1 b, y% T  L5 o

    1 i1 B3 _% a3 ]# B3 {5 p0 w) ^df4 = pd.merge(df1,df3,on="名称",how="left")
    ( r& I0 T. g5 ldf4.head(10)# _% O: Y9 H1 x

    6 g( Q2 [# l& g5 K; M' E
    4 R6 J- q! Y2 q8 J, c- e) |7 {. ~

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


    • 7 K- i/ ?4 d9 _- h
      $ v# s+ M# U( q5 M

      4 y, C8 i; X; ^& p- ]! N
    7 ], h5 O0 `8 y* G  s( m- ^3 ~' u. p1 }

    0 L0 ~- ^$ y+ F1 ?) u- Y) j
    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, 2025-9-18 18:34 , Processed in 0.441874 second(s), 56 queries .

    回顶部