- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40241 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12783
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
5 G9 X# u b/ U: s' X( d7 K
( [3 x: R& j# Y2 { K8 X文章目录3 C2 C0 `$ |7 V5 q/ t- x. U
* K7 b/ I6 K" Z
前言
e* l! e% K; u, I% \
. [" R7 A* j/ `4 @* V; y, v/ m一、数据爬取# K7 t: q' s3 K: e/ |5 f
. n' c* A k, e8 Q二、数据预处理& T5 k- \$ F5 N4 F) s
; {( s- x8 X& q. y* C
前言
/ ?6 t& [( w. L& T3 W5 u6 O; R本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。4 f, H2 b2 ~0 Y/ b
+ |1 W' I# N( i; g
$ ]3 G" l) G5 ]
一、数据爬取
% D0 W8 @6 o' z& u. Cimport requests8 r5 g8 W4 Q2 |: m. n6 k
import pandas as pd
; C, {+ G. G+ ufrom pprint import pprint
4 a f" u# t) R2 p `" M8 U导入相关库
9 [9 B4 P4 ^9 n' b# A8 q
+ M; ]. Q+ m& V3 H5 X# a: Crequests库用于发起网页请求,获取网页中的源代码;! F% b; o+ U" w
4 \3 n' n' z& b4 H( P6 y0 vpandas库用于存储和读取获取到的信息;/ F7 R8 g; |: ~: f( y4 d
2 _/ l4 L( A; T2 Y' R, I8 ypprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;7 y9 A3 G$ ^+ j' D3 D
( ]/ J6 ^/ L% I& V$ ~: O0 `, @7 surl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'/ i7 _/ U6 O6 @, n" b! Q4 ?
data1 = requests.get(url).json(). [1 N4 F3 R' g$ X) i
# pprint(data1)
, w9 j: ]# `0 V7 Q! T% J6 l6 ?8 b8 J- X4 O0 u& h
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。/ C" W; j3 f. R# y) |
df1 = pd.DataFrame()
* S( S; ~ H( A. C8 Qfor info in data1['body']['allMedalData']:
. M0 O' X. E$ D* k6 [ name = info['countryName']
* s+ M# L H5 ~% b2 d/ l+ f7 ~ name_id = info['countryId']
) X7 k3 e$ [# I0 D! x$ v, k. h4 X rank = info['rank']
8 Z" j6 A: e/ J) Y5 f gold = info['goldMedalNum']+ H L% P3 \) o; h' g# A/ [" d
silver = info['silverMedalNum']
( S% r& {7 K' ]5 g5 W3 d bronze = info['bronzeMedalNum']
& f7 i+ c7 }- M }$ [/ F total = info['totalMedalNum']7 z! ~$ Z- t! c7 ?; ?% ^2 i3 p- l
# 组织数据
* d; c0 t; P3 Z+ [ v1 u orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
" Y$ B( R( \' u5 B # 然后追加df$ C: i0 H; o- U2 i
df1 = df1.append(orangized_data)7 Q' Q) s1 D6 L/ K5 [ D
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
: R1 N# i- U! d) V6 h$ _df1% A6 T5 d7 D" k7 s9 U
% c( N# p3 ]3 g5 b. K8 Z* C7 h![]()
0 ?4 q4 e$ C& i, f( F' `这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。" \$ Z7 o( u: [0 F6 ~
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'. @( @' F3 d; G! n/ h( l( }
data2 = requests.get(url).json()
2 u1 T9 X, Y f- p! d#pprint(data2)
" K7 P8 D8 s2 H$ F7 f$ c. U2 A7 U( m+ t- }! p
df2 = pd.DataFrame()
5 x0 P# `/ @0 {" F- dfor info in data2['body']['medalTableDetail']:
( I' g: W( j( g m0 h english_name = info['countryName']. }# {9 ^1 U. G2 B- r
name_id = info['countryId']; H+ K7 ?$ o' t. r
award_time = info['awardTime']. f. u# {( y" u1 g" d6 h! d
item_name = info['bigItemName']8 b! n! P. q/ @1 x
sports_name = info['sportsName']
' u4 @1 l2 m' ^/ j. r( R/ Y: j* h medal_type = info['medalType']
7 k( [& M; E1 `( J- ] # 组织数据& M& c) K- e% g1 k
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]. L* C. ?/ X, C. v9 j% Q
# 然后追加df
& A1 @2 T" }% v9 Q3 k df2 = df2.append(orangized_data)
" f, r" V/ i' _0 wdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']8 C( P9 R) u3 @9 E& p7 |
df2![]()
. [8 O3 e% V/ T# h9 K! p0 f+ B! A! {2 l8 P. r |3 Z. @, |5 f# ~
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 0 j( [: b* ?: T
2 X: W% B2 f4 M j) i S& @6 S! \
. M# I- l9 I- L6 \5 f; R二、数据预处理
/ r( t# c6 J. ^. Z/ u由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
) u( \5 W& o1 B2 {2 x
! Y! x' Z x7 h' H; h, U, xwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:2 L! H N$ B; r/ U, Y" Q
x = f.read()! a$ E6 a/ q" z8 V$ ~$ ^6 |1 m
" g7 _& S% `7 Y9 W' ~2 ~df3 = pd.DataFrame()/ Q' u! R; y' F7 ]3 a& a2 g
for i in x.split("\n"):" ]# @' W2 Q4 A0 p7 W7 ?# U3 W, K
x = i.split(":")[0].strip()
% Q( [) M; u. z1 i! s- H, V) K) f& G y = i.split(":")[1].strip(), n, R% t! b3 _
orangined_data = [[x,y]]# A, L( _% {+ [& d9 u
df3 = df3.append(orangined_data)
$ y. p5 j; U$ L3 ?6 k* S" Sdf3.columns = ["名称","英文名称"]% ?2 \% \2 o. ^1 K
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)/ j! k& F# l3 ]) B6 L% E
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
! l& u2 Y1 V+ K/ G/ [
- f! @" p8 c1 b# S& S @df4 = pd.merge(df1,df3,on="名称",how="left")# ^8 U2 z: w8 A$ i
df4.head(10); @8 ]7 x/ p2 O
5 C8 v, T- W9 M1 K3 t1 M
9 i$ K) w" m9 L5 O- R
表格df5表示运动项目获奖详情。 - " n3 A3 Z7 j. {9 M
9 K0 u2 }, q1 O$ @" P% ^3 }2 N* e1 y. m. A! C/ ~
) `7 n5 r: K! \1 H% y7 Z3 @
3 `" A ?6 V7 r* R |
zan
|