- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40347 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12815
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录5 G, G! _# _6 w; E2 e1 X* H
/ D! T; w$ |- h# D* D
文章目录
. ?4 J) H9 w% q# @+ ?. S) P. ?( a0 _
前言
6 ]' H2 g: R& y. e' [
; s: w1 ^4 t7 F5 j+ h" n: o4 j一、数据爬取 G7 Z" e/ ~) i+ T
8 B S8 C' R: f" N
二、数据预处理& |" R0 ]; K8 K' s- h
2 W- G: k6 y8 {2 N' E前言! |2 u8 N ]) u# Q! h9 Y2 y
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。1 Y/ e3 B. o1 x0 E# [' L
- f7 X2 i9 Q& _2 o
* t7 b( k& M/ d$ u
一、数据爬取
! h* q6 v# c; [ [import requests3 B- Z* l; F$ I' G' ?
import pandas as pd
# y. X9 ~9 A- b! ^. sfrom pprint import pprint
) E) O6 }) X0 P1 t) H4 J5 f+ V导入相关库2 H" {+ _7 L, Z+ x# Z) ^% c$ Q2 c
- i/ J/ H. @9 S; P l; @
requests库用于发起网页请求,获取网页中的源代码;
/ B) t' N% [7 n" l! m
! M6 T$ i6 m, X' v' |" M* Jpandas库用于存储和读取获取到的信息;
; [+ w( o0 \5 N) u
, V6 m. }3 d! L. a8 L& P0 M Y3 Jpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;: y: d4 `: l, L" K' E% M
9 I, j3 v, j# b( ]url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'% C) [3 p S' ]+ \$ ]3 w
data1 = requests.get(url).json()
; r D; r2 d6 o- B, }# pprint(data1)
& Q. L& a) y+ y# r9 L, Q
# X; o6 _7 j/ b% c: f/ d8 J这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。0 i/ V7 j7 w+ R( X
df1 = pd.DataFrame()* R1 {% K- o, P8 c' Y. Z6 x4 s
for info in data1['body']['allMedalData']:7 x" ~" C5 d: Q/ E; ^
name = info['countryName']
8 y( v% i1 j; m/ g# |, D8 d name_id = info['countryId']
+ H# t- }: P. d T rank = info['rank']( `) a% `: x8 ]. }8 W
gold = info['goldMedalNum']
# B7 \/ l; \& G silver = info['silverMedalNum']
. g- n" _' H% G# S bronze = info['bronzeMedalNum']3 J2 X0 R' f4 `9 b' b# q1 N' o; _ m: Z
total = info['totalMedalNum']- D# h/ u; G2 s9 ^- ?/ M
# 组织数据
) P) L- k2 v% t7 t$ Y; v orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]7 O; N# w& |( e- ^; L9 p
# 然后追加df
: f. A8 \' x: K. ? df1 = df1.append(orangized_data)* O. D6 W! E0 U) O
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
" c. E. u4 L* d! `$ Tdf13 |0 k% s0 n5 E0 v
( K5 q1 F0 M" p4 B1 I6 T
/ H/ f' t$ u6 d8 I% _. k- {# Z
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。" F( y5 Z+ S1 K2 j; T9 K
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
6 q; x7 x6 ?# y* g# Zdata2 = requests.get(url).json()5 _" |+ [( c) X$ t' V; K+ ^# U
#pprint(data2)
; y" Z2 g1 I" [4 a/ P0 V
7 f# W9 j/ B, a& zdf2 = pd.DataFrame()8 m2 R1 h7 E9 e9 H( d5 F
for info in data2['body']['medalTableDetail']:* a& y( A ?+ m* N( r" r4 p b
english_name = info['countryName']0 Z$ K& h/ U4 ?4 T
name_id = info['countryId']
# \( k ~/ A2 R; {: S: d2 k award_time = info['awardTime']
0 e0 W% y& t. t item_name = info['bigItemName']
( ~9 q* X& {( k* z sports_name = info['sportsName']1 B5 k- Q8 N. t+ X* y7 ^
medal_type = info['medalType']
7 _" q" {% u$ C" H* X # 组织数据
7 K8 P$ P. Y2 H7 g orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
, _0 a9 u8 Q! ^' f # 然后追加df
# [2 F+ M1 s! v; K' y df2 = df2.append(orangized_data)) m9 b9 a5 i1 d# A6 W7 {
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
8 X- Z9 R/ Q. i J3 V- a7 M, ^2 adf2![]()
: Z) r8 ^; M. w7 ?, y l8 S3 C! x5 N' i& y' O# Z+ p6 S
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
% x3 E8 b6 M8 V( ]; I# G: v; a6 y
; v- o6 P8 O# f( N( {( _! M
+ ?/ M X5 z* c! I' W, A二、数据预处理
5 x# q$ @, M2 j. s) Z由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。* C: U* O f$ b+ `; N0 ^
# X$ N; d, `* W& z) f
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:+ t% H9 M8 }3 g6 }
x = f.read()
{" D& l$ w4 f; f1 v0 W
1 S1 Y" z6 t( a1 e! N- d9 ?' t* _df3 = pd.DataFrame()
* ~2 \ Y9 a6 t: H, V4 Wfor i in x.split("\n"):
2 V8 e* v: b/ V; I1 l+ `) Q x = i.split(":")[0].strip()
, `# }: G+ v, m, U y = i.split(":")[1].strip()
{) H9 @. G% M9 y( |+ F orangined_data = [[x,y]], G. B: w$ Q1 U A4 e+ r8 L2 w. g
df3 = df3.append(orangined_data)( k% N" _ e. n5 S
df3.columns = ["名称","英文名称"]0 U& R* Y* q1 @ k' A0 I& v
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)6 I: \$ N# S7 v b0 @/ R
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
5 `/ R0 P, o3 n* t o7 w
# c8 }- e" p# o1 L* n) U6 Jdf4 = pd.merge(df1,df3,on="名称",how="left")
$ F! F# h& ^3 U m& D; N) k5 q( zdf4.head(10)
! y; s l. @. k) T
4 X) C$ Y& G$ Y* Y' m* Q' C- X![]()
0 R: Y+ a+ u- A' R: h表格df5表示运动项目获奖详情。
) w3 `8 i. p* n! a) M; m" |( i2 q
# G% R& h2 X& I9 d2 \' m0 G: C& m3 D4 L+ O9 q
- V5 u3 I; n7 b7 \1 W9 |3 e* H# Z5 c$ K9 |% l- a3 }% J
|
zan
|