- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40027 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12719
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录" H4 \' e! b4 C% e
. k/ C3 R4 E0 d) p5 v
文章目录
# U6 M P5 D) l" i- V# Y6 q( U4 _: z0 ?8 l$ i* E# @) E
前言
, U! y1 R9 P. \9 j
! E: V6 r5 ~' `2 F* A一、数据爬取; i2 p6 _* {; Y. `& D; P
; j) I" }9 R- ~9 K! j二、数据预处理
8 Z4 e8 c( y# X2 {! J
% \- i# y& ~/ c& |! r8 D前言
) Y, R1 T+ {! W& A本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。0 J! m7 d9 c: [, _5 U
9 O/ P2 P6 q7 h: }# ~" t- f, L
& i; J/ X; Z+ q. F$ W+ ~一、数据爬取) U" u9 W) G3 M8 ^5 I$ K0 S
import requests
/ |# d6 S" u; Y! r2 D, N/ Gimport pandas as pd% g7 F. i" @6 S8 k
from pprint import pprint- n8 i: T& e' c! E7 r6 P( \8 g
导入相关库+ B& h: K0 r% m/ y7 R
4 O3 J5 q. T( G) U, P* o" `
requests库用于发起网页请求,获取网页中的源代码;
+ _9 W1 K% x# k& s0 s: x
8 Q; _' |/ S' L- Zpandas库用于存储和读取获取到的信息;& a% W/ |: i: j4 U; t/ X
' @ H. y! ?! W- o. j, I
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
& y$ S( S7 D6 G( d4 V; @; h# K6 t& U; ]9 [4 `9 s0 G
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
" a% d: s; W2 q5 Sdata1 = requests.get(url).json(), a" |" {% F3 J* A
# pprint(data1)! F. V4 X3 O6 O) }+ W. M1 ~8 n
2 v! t4 y2 O ]2 i( N* J
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。- o8 f6 ^/ y: M- r1 E7 p
df1 = pd.DataFrame()
' [, w8 _3 V* u* b$ o" P7 Xfor info in data1['body']['allMedalData']:
* l( R7 W& i+ C+ B9 s* V name = info['countryName']
- p. o3 S5 L7 }0 c4 Y0 g0 v6 X* |; [- c name_id = info['countryId']( j" L5 O5 D' {+ [1 ^+ @
rank = info['rank']
5 z# S1 I8 ~& d% j! O gold = info['goldMedalNum']
2 B; u$ X- u5 X! t7 f silver = info['silverMedalNum']& L' i2 ]8 F" A
bronze = info['bronzeMedalNum']( `4 H+ E( F) m3 F$ { ^. H
total = info['totalMedalNum']
4 y5 F, Z8 u7 q# {& I0 c2 J # 组织数据( q0 |2 W4 u& u
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]* m0 `, @) H6 D* i+ b2 Y% {3 F0 ^
# 然后追加df
7 u$ w( D. D6 n% I df1 = df1.append(orangized_data)
. t+ X5 ? V; G0 V/ Idf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
# v( x$ A, C: \0 Ddf1. f6 X, g$ J' l4 r T- W1 w* S
/ q6 @# a1 {& H0 ]6 @ 0 `7 N/ U4 }( h$ u
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
7 S' T, e8 a0 M7 [4 Curl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'" X& r% b3 a C: W9 |, }! ^) O7 {
data2 = requests.get(url).json()# V @! ]1 K( p+ G/ u" q. ~6 B
#pprint(data2)2 d$ I" `( z5 w# Y# w' y/ D
: A# W, M- N: b9 J
df2 = pd.DataFrame()
$ m' M9 C; V( j) mfor info in data2['body']['medalTableDetail']:1 `; i7 R! V7 p& e) ]* s) V
english_name = info['countryName']' F$ \3 z: z: f$ J' f! x
name_id = info['countryId']
- T, H8 i- |* J3 k8 _ award_time = info['awardTime']- B; }+ Y3 @) }+ ^% v; a3 }9 F X5 k
item_name = info['bigItemName']
2 t3 w' N- Z+ I" J9 O d sports_name = info['sportsName']; K1 [$ B" p1 C
medal_type = info['medalType']
" k" `- a3 @& Y+ x # 组织数据( G4 b$ R: [% }5 I) L: a
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]' W* \$ {$ @) z% m0 ]2 N/ O
# 然后追加df
2 b0 f& e, F5 @7 O df2 = df2.append(orangized_data); @7 y* X- B" u% K6 ]$ c0 y0 c
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
2 O+ l; j; q8 M4 t: u) m6 P5 Adf2![]()
1 y" j# f6 f# S8 h% W( T0 t+ o J4 W+ C% i5 A9 i1 V# f
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
7 m: g* [8 Z5 _; E2 z6 R* L$ q+ t
, |# H0 a! Y9 Y* [( f; Z
二、数据预处理+ N! G1 B/ h( F3 Z ~5 s g
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。4 @( \/ E0 f0 V! i
* F3 \/ q: `8 }: v7 [7 h; Owith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
9 d% x8 W2 Q. P, N9 } x = f.read()6 _3 h0 `7 @% n1 \' W- o: h) U
1 X6 `& D- e/ A/ u0 d* y/ H" g
df3 = pd.DataFrame()4 z/ l/ I. u6 y m( r- _$ M- Q+ u
for i in x.split("\n"):
V8 H G& @9 }# o& u3 e: X) p/ R- v x = i.split(":")[0].strip()! U H' t' k. q4 k
y = i.split(":")[1].strip()9 T. i( M' B2 j5 m2 c1 ~! l
orangined_data = [[x,y]]
2 J$ S+ v) r" j- i( e df3 = df3.append(orangined_data)/ A) k& a1 o1 s7 S
df3.columns = ["名称","英文名称"]' [% {- T q0 p5 F" F, R
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)7 ?. Z8 X E) P+ U4 e7 i
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。8 }) o& K% S8 F0 M% c+ @
& G& L. Q4 X# Z3 j( v; Z
df4 = pd.merge(df1,df3,on="名称",how="left")
6 C. S2 s2 z5 X7 C# i; ? ?1 mdf4.head(10)
+ Q- ^- z, v. V0 L! q6 ^7 T3 |' t3 B F
& d9 f- h2 v! t2 ]; U4 t
表格df5表示运动项目获奖详情。 - , }: J5 I H4 \! \ U7 ~6 o. i
; t% E0 F5 f% V H: v
s0 H4 v$ d4 ]) y$ d
: r- S7 K- |) U# d1 w& _. J- ]2 a0 e! u! V
|
zan
|