QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 22:35 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    目录  G6 M2 F7 {  y8 S8 E

    0 P/ w1 e0 v, G: q( M- P文章目录
    ; u) f3 `1 ~% _- b2 D9 w/ X9 n4 C3 p' J0 m% h9 a6 J
    前言$ b$ t3 Q) R% r+ A) o! i
    / L' A  g! F) w3 Q- `" P3 _, _0 }
    一、数据爬取% n; g8 u: _+ q$ o' w4 E
    2 x$ U9 P  T8 m4 C  G
    二、数据预处理1 v6 ^( u. f" [/ ?/ S2 n, d/ g
    6 z3 g8 Y3 ?/ j7 A# S
    ​前言; z' z! W& Q" B/ G! c& P! z
    本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
    $ {- q! L5 r2 ~; T2 m$ P
    " _/ h$ e9 M5 f/ t1 t" P. r  U7 h; c
    一、数据爬取
    6 I# ~" ]0 _4 u1 ^! Qimport requests% a2 _$ a% ]3 z- c. b
    import pandas as pd
    0 w5 J2 t0 [7 a5 X  a, ^: F: Xfrom pprint import pprint! j$ u) t( b; h7 z( U. N* ?
    导入相关库: x& J  S/ W6 K. S4 w3 k- s
    7 n9 i& T: ?/ f& S" V
    requests库用于发起网页请求,获取网页中的源代码;
    - k6 n+ u5 m9 {7 I  a" P
    / V( _" ]  n! W9 i4 U% N  A; ppandas库用于存储和读取获取到的信息;* F' f5 a2 S6 G7 @) ~# F% ^0 N
    " n; h  e- ~" V' D0 N
    pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
    3 r2 q1 C/ g) }# b6 S1 e; ~
    1 J! ^4 |9 A* n# J" \, s' G8 O( Yurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
    : Y$ B: T' `$ z2 `data1 = requests.get(url).json()
    8 M7 z. a* L9 v# pprint(data1)* D/ G  C4 d( c: E: {3 p; J
    8 T1 |$ @$ A- b9 _7 `
    这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。/ b. `1 ^$ P- T, U
    df1 = pd.DataFrame()
    ) L% V) B& j3 s( {9 lfor info in data1['body']['allMedalData']:
    6 Y! r' J  q4 x/ T    name = info['countryName']
    1 P6 t  U1 D( f  f& e- _    name_id = info['countryId']
    8 e  Q. v/ h0 s( @8 \' j    rank = info['rank']$ |" z6 p( @9 d' [8 q) g
        gold = info['goldMedalNum']4 H- Q9 O+ k. g" ?: t1 D/ r
        silver = info['silverMedalNum']
    # |4 n+ n5 x+ Y! k( e1 O) X    bronze = info['bronzeMedalNum']2 ~# J, x4 U2 X  j: D( A
        total = info['totalMedalNum']
    % w& \( ~$ ?& _9 B# x, ~, ^9 k) l    # 组织数据1 z6 _2 o" i( V: b- r
        orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
    ' h; s, m1 d. \7 n$ j3 Z! k    # 然后追加df
    3 X- H* F/ A# x0 U* H/ n5 Q; p    df1 = df1.append(orangized_data)' x5 B) R& D5 ]  N
    df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']9 B2 \9 M+ u& I9 N( m
    df1
    0 g- w) a  j% n- N4 P/ p% c: ^- V: F

    1 b/ ~2 x& x4 v3 f' T2 P  h4 b$ ?  h这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
    $ y+ n' Y' m( R  Iurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
    6 y3 k* i0 H7 F5 S, g* Pdata2 = requests.get(url).json()' N* Z% A  M5 e, I5 ^
    #pprint(data2)# O$ }6 X3 C3 i: Y5 ]
    + V0 E6 b) C% B0 X& w. A
    df2 = pd.DataFrame(); X# ~: N8 I# e& C' f8 ?
    for info in data2['body']['medalTableDetail']:
    " D, l$ i* r( O9 ^    english_name = info['countryName']
    9 c6 e2 p) m' p    name_id = info['countryId']% M) L& [6 c1 f) R  j" W
        award_time = info['awardTime']
      V1 D; ]" F5 z( r  [+ u    item_name = info['bigItemName']
    7 n% Y. J5 Z1 B    sports_name = info['sportsName']
    2 H  X* n5 T! i: f8 Z- ~    medal_type = info['medalType']
    3 w+ ]& x" F1 ]* h, C    # 组织数据0 s! R4 W3 e( t
        orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]4 G4 k. o. i  e
        # 然后追加df# s5 i9 T9 p( B3 y
        df2 = df2.append(orangized_data)4 `" t6 e+ ]# C( S
    df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']! j' L1 o& l2 ?1 W: [; `* C3 d( G- K
    df27 `) c3 c0 \, s6 Y8 X, q- g

    $ k5 ]/ e/ A% I8 A对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 5 h2 u% {1 @; e  s! l" ?. O& r3 Y) g
    ) U0 d: j( W1 H/ M" F
    , u3 ^- K2 O. g
    二、数据预处理" f4 q' i# a% q( L1 [( \
    由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。& X1 [  ~0 A/ E, e5 e3 Z

    ! W8 X2 \5 u( r' \. h9 U& n; Jwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
    ; ]& g+ I/ |/ G% o  e8 p& X6 ^    x = f.read()
    . U# g5 K$ N* {& A+ D7 M1 {& {
    ) b3 k% R& K5 T+ d" }. W' jdf3 = pd.DataFrame()( h. a# {1 g4 y! h
    for i in x.split("\n"):0 U- v; N5 s6 {
        x = i.split(":")[0].strip()
    4 X( z, {, x8 B8 |    y = i.split(":")[1].strip()6 J" G8 b, p" c6 `) O2 a
        orangined_data = [[x,y]]
    $ r% V3 ^$ Y% o( H2 G    df3 = df3.append(orangined_data)
    % O# u# @' t6 {& V0 p4 odf3.columns = ["名称","英文名称"]( x; G5 f7 a" H2 q/ {. Y% H
    df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
    * o0 _. p! `+ N. h5 i8 U表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
    9 i/ g" G1 N* D4 E; v
      @; l  [5 R  _df4 = pd.merge(df1,df3,on="名称",how="left"): y* a$ B& Y0 D
    df4.head(10)5 O% }1 \$ Z* H$ |. r6 G
    7 N  y; h5 c' {+ ~5 W0 @
    ( y0 W4 U2 U/ J8 I

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

    •   |" D) R) W, I6 Y9 f7 O* D# Q1 c4 i
      4 ?( K; w' |0 \# f, \  V# F( l) a

      ! e, }6 s3 }7 i% S/ u2 q% l
    ! `# h+ l2 N2 _  b

    * ^* I' p& @! K2 z' q2 ]
    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-5-1 16:41 , Processed in 0.415370 second(s), 55 queries .

    回顶部