QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录
    1 O8 n' g4 f9 ]1 u; e. O1 a( _8 P1 E9 M) n
    文章目录
    : [. c; k) v2 Z6 t! E
    ; K$ o: Y$ w& Z8 B8 p; X! L$ g% z前言  y1 ^) x  _3 A: e8 z# I$ a
    8 y" C! M! T& R6 f8 s; Y
    一、数据爬取! f; e# [; |# V% S% F

    " u' A3 c0 |1 W二、数据预处理
    * Z. V4 b4 @# r
    ' ]: E  A" e" m​前言- N( J8 s. z6 e- F" f: m
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    + {6 T. s; B6 j5 Y/ ^( j
    3 u" \$ n+ |* N) N. r8 l3 v3 J& w2 q2 X0 @5 i8 p9 z/ j- F- G4 W4 {
    一、数据爬取, J: c% U0 k& Q* _, y
    import requests/ H% W; y+ \5 d: J& C% G
    import pandas as pd
    ' @' I" X( X5 F$ _  z/ Q7 [& {from pprint import pprint& q! J1 _7 e: ?7 a* @( K
    导入相关库6 b  J, n) Y8 ^5 B( ^2 h# Q
    + }# P9 }+ E; G; q( L# ~" y$ F4 ~
    requests库用于发起网页请求,获取网页中的源代码;
    ! r, b" e) {3 e  K- X3 m' R5 E! j
    ' Y8 T$ [4 P- ~/ [/ w  kpandas库用于存储和读取获取到的信息;
    ; c# i; _( o7 N4 Q& T. A3 y+ H! ?2 |
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    / ?% y0 S! T+ Z# f+ }
    0 A9 [- X5 X; O$ iurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    9 q* l+ u4 N7 j* ^4 Y8 V. W! |data1 = requests.get(url).json()- }$ I/ _; i1 Y) Y- h* B( ]
    # pprint(data1)
      `9 u: C5 x7 B% `+ \/ ]; \; c9 D5 [0 L9 e  E- W
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
      s/ j  m/ s5 H9 c3 a" udf1 = pd.DataFrame()
    - _# K* `. J+ m+ J4 B- efor info in data1['body']['allMedalData']:
    3 Z% I; l. g8 }, D    name = info['countryName']' o: l6 t& Q4 k4 j8 k. o
        name_id = info['countryId']
    & i! H5 n, g) k* ?    rank = info['rank']) H* s2 k) Z6 b3 Y6 B
        gold = info['goldMedalNum']
    , }5 [; _% @4 f1 c2 c3 @    silver = info['silverMedalNum']
    * s" {+ \/ L$ T7 s3 Q# l2 x; N    bronze = info['bronzeMedalNum']# d  H  V) n' L6 ?5 X7 y/ b
        total = info['totalMedalNum']
    6 ]6 T1 n9 S2 O) e: D' {    # 组织数据
    . q3 r1 U" O- j7 I6 E2 w    orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    / R) S# v2 S$ L/ d+ d5 m5 L    # 然后追加df
    : l( L3 w2 y) i% O8 j: S    df1 = df1.append(orangized_data)* w1 R# F  T" K" J  B' L
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数'], h; v/ r4 @2 z$ c5 [# I* m. R
    df1
    6 J* e4 t" c( f, ?0 S7 o/ l% o) H+ c, O
    6 l! d! q* Q: z4 L+ H/ E9 C, O
    这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。- U! ?, ?3 E2 ~/ Y9 E
    url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    8 m3 ^% {5 ?* _0 j3 |- ~1 ?; B7 Pdata2 = requests.get(url).json()
    ( q& `6 Y. |, e/ g% N! n4 L#pprint(data2): }0 @3 ^% K. n# N5 x: g% W
    3 j' ~, m" }, d& g5 ?% ^; Q
    df2 = pd.DataFrame()1 m/ B! o% g& e* _5 ^1 H
    for info in data2['body']['medalTableDetail']:
    1 J/ R6 N/ G1 v( b/ d    english_name = info['countryName']. p1 ~' l2 D+ ~, K5 s
        name_id = info['countryId']2 A' j) B  r& u+ A, U- m
        award_time = info['awardTime']  `9 o) Q3 A, d1 R- n
        item_name = info['bigItemName']: E4 r! x' H; H) K
        sports_name = info['sportsName']4 P/ P5 z! j/ `  f9 `
        medal_type = info['medalType']
    4 v% Y: r7 J2 W% Z' a    # 组织数据( P) h  i  D" N4 d
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]+ M; y7 b7 v/ g2 f+ Q
        # 然后追加df4 S3 {0 C3 I# M* x  d. i( {0 y6 }4 _4 A
        df2 = df2.append(orangized_data)+ v" Y7 O, K& B( i. Y( w1 t! d
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
    9 \) d( z& p9 P7 @9 ?8 ddf2
      Z4 q" F5 `' W* z' E) a! ?0 ]& W: a- o7 Q" ~
    对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
    ! R/ N0 n- q3 m/ l5 b* e) s( P2 W1 d0 \( W8 i
    + w  S3 `8 t  P7 B& M) S0 i) M
    二、数据预处理2 h1 u0 Y" U/ H
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。3 h3 X) w- W8 L/ b. S2 C' ?1 ~

    % d) Z* T# ~5 Swith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:/ h7 k8 I1 d7 f0 |2 f7 r
        x = f.read()( \2 w+ e$ B  F1 U- n

    1 w; p4 A4 h' Z8 ?9 b# j5 bdf3 = pd.DataFrame()
    4 t& s" R* ?2 E& Gfor i in x.split("\n"):
    4 q6 H1 c0 S- e7 ~5 ~. ~3 S( n    x = i.split(":")[0].strip()
    % i1 o( l* i0 S3 T0 ~% S5 j    y = i.split(":")[1].strip()# K- v& h6 Y' _& R, o! m6 v7 A
        orangined_data = [[x,y]]/ T9 ]/ x7 X5 {
        df3 = df3.append(orangined_data)7 ~* G8 q$ G) i3 w
    df3.columns = ["名称","英文名称"]
    + {7 X" c' e: W3 o  Qdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    4 {" ?% c4 x0 h7 K表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。- U; d& R8 O4 Q! D! v

    3 E* ~$ Y1 @6 A* ddf4 = pd.merge(df1,df3,on="名称",how="left")1 ^# }, d  E8 X7 q
    df4.head(10), d7 J# h$ t% j8 o" G% D

    - |* }9 P- j& W* n5 M) h5 e: f/ n4 p: A# P

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

    • - G/ m$ l5 X' T5 u9 @& P0 u
      . Y5 V8 b! [& C; G# k0 ]) y

      ) S( K1 o/ ~4 s2 W  J
    # i6 A9 I+ f6 H; V& j

    ! I( D" B( K. T3 z% }  U, Q
    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 12:36 , Processed in 0.361052 second(s), 56 queries .

    回顶部