- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40272 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12793
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
+ B: n6 z+ Q% M) ^! j6 V' b& K( b$ ~0 R& l5 k
文章目录
* {; m0 g! c% T5 L6 B2 @; Q; T6 k$ T4 w* s! G4 A
前言 T2 l: N+ y' M6 x" p5 _
9 G# o" t4 f, X: F一、数据爬取
( R; D( I; F& S. J4 m8 \" S$ _; K8 ^8 Q* W
二、数据预处理4 q4 Q7 B! S2 Q4 w2 {
/ S! [) L9 {) @: R前言
) i$ f0 n& C5 l5 B4 U- Q本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
0 ], \7 Y4 Q3 m% g$ p4 \
, f* {8 z3 k' S3 T; a; B+ C' G p
一、数据爬取: N: }$ W/ A* V
import requests6 \! k# X3 w& P8 x9 k9 W- A
import pandas as pd* `# R9 n6 G; a( @6 {/ P; D" z
from pprint import pprint
) a! [2 n! {1 V8 {2 b导入相关库5 }" l" H; e* H+ B# _3 m y# o
& m7 M) S# }9 W0 _; P, w
requests库用于发起网页请求,获取网页中的源代码;
; Y: k" A* Y8 Y+ e4 M5 h
* w( g' F2 F& K; {pandas库用于存储和读取获取到的信息;! F- X0 p* d7 ~4 S4 Y& c
; W: |" m4 o. u7 U# P7 q# `pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;" \, c# ~* a9 j- D# E. z$ {
9 G2 S# t" y0 Y" n1 j! Vurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'5 x4 ]& x9 F. P( d
data1 = requests.get(url).json(), B4 I4 }& Z! }- U, J
# pprint(data1); E* F4 e3 D: D* o0 j, A
# f h( v9 A$ }这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
* i4 j7 u# R: H% Ldf1 = pd.DataFrame()1 F# V/ t2 H% Q; @
for info in data1['body']['allMedalData']:
+ E9 q& R- w; ]) x3 @6 [' q/ j name = info['countryName']
" i: U' Z; [4 g; o1 B2 h) j& Z3 E name_id = info['countryId']; ^; }& }9 Z2 Z+ G
rank = info['rank'] J" T7 t4 V% G: ^3 H+ p
gold = info['goldMedalNum']
. _8 {6 l" |) r/ ~7 n4 f: O silver = info['silverMedalNum']
3 z# V' e% g6 j bronze = info['bronzeMedalNum']' k$ L7 H0 L4 j% P+ _
total = info['totalMedalNum']$ K* B( Q1 c- Y! `8 H* s: F
# 组织数据
) N7 e8 m$ o( Y; P: h1 M \ orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]+ o7 P8 ?& e4 h
# 然后追加df# `5 e( G" h1 ?" o* }
df1 = df1.append(orangized_data)$ G1 K# @6 {5 Z: k$ z
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']: i; s8 }: p5 A0 l, |; A4 w
df14 l- C G% j" Y, z: O8 N6 @
7 `6 r! \$ c9 o$ I6 l
![]()
( D" p& |- C+ W0 h7 }" F `这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。5 e {7 r* d u" ? s( P
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
+ K$ ~9 G$ z3 T; m; y7 O, I6 S/ mdata2 = requests.get(url).json()
3 V: k, D3 P- |: |/ i& t#pprint(data2)- Z3 [; I6 B1 a6 M; u
( ~: T6 f- z6 \0 U. \% ldf2 = pd.DataFrame()# @- d+ |5 j- F& b2 t4 A
for info in data2['body']['medalTableDetail']:
* f! u$ R |4 H# e english_name = info['countryName']5 a C% ^; K9 @) O4 d7 K8 v! ?
name_id = info['countryId']
& w* l0 ^! {: N$ P% i1 _; l award_time = info['awardTime']
: y) a, D% `, e1 `7 y' _ item_name = info['bigItemName']
5 o8 Z; l- T% X. A& u2 j sports_name = info['sportsName']. T; F4 z% q$ T& q3 a. b- t& L3 D
medal_type = info['medalType']$ c( ?: F, u5 O5 X L( E
# 组织数据% A9 T; B# \5 V- I4 j+ y) E
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
& v4 X- k0 r& [) P$ c # 然后追加df# q2 d3 b0 D0 ?! h; C8 u4 {
df2 = df2.append(orangized_data)
7 o* A* \9 Z; F0 k/ B" ydf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']! |8 a$ V( X X
df2![]()
, ~: ?5 k$ R( [ _6 `" a( ?' i/ f$ O. D# y ?! ^
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
. m+ C: s' K$ F. f- C P& w; X
; H, V5 |0 R2 n$ n
! S5 T. x; _! K# K6 }+ ^. z二、数据预处理- D+ e: j# g' l1 H5 Q8 E6 ^
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。! }, g. J' U5 x) X' _
a* f6 s9 `5 ~% S! p: ?
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:8 X* Q6 s( K; ]" U4 J$ `
x = f.read()3 H# i) E' Y; }0 x1 K* K4 u) h5 k& T
; N. K" |4 g8 O6 kdf3 = pd.DataFrame()5 Q- e; A! A: X* ^
for i in x.split("\n"):. R4 P: v! ]8 W! K, p
x = i.split(":")[0].strip()
) {4 R6 d( ?0 B G4 X K7 w y = i.split(":")[1].strip()
: n' L2 `/ Z- j' H5 b! N' q4 b4 e6 s orangined_data = [[x,y]]7 r2 j, D/ V/ ~4 P; h
df3 = df3.append(orangined_data)& L1 G7 q) a: r/ t+ l! t
df3.columns = ["名称","英文名称"]
- E! d) u0 a9 K) E% l9 o- q* Z( g. adf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)- c! h+ p- U/ Q
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
& t* S/ C s* Z4 i+ f0 z9 H x1 H8 |+ p' D/ d, y" Y8 t$ c
df4 = pd.merge(df1,df3,on="名称",how="left")6 ~2 m/ E- f. K2 [+ V
df4.head(10). S1 s# o$ C- O! A. |* F, E
0 z' k) s* }) Q% k. ?+ J
& A7 C6 i& Q, Q
表格df5表示运动项目获奖详情。 - 3 j: U* i9 f- `5 P4 _7 ~9 \9 O
' c! H9 F' G2 A, L% z
! n* _9 w1 b+ W) m& v % m9 o% E9 k' r
4 ]: d8 C! Y7 M# a+ t" l K X. J
|
zan
|