- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40092 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12739
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
% f* a. B" @* [. L2 D( B E% U, x7 V/ v
文章目录' \! X* p( S9 t* O
; }5 N+ W, \4 X* A. w前言
, }# V- I3 d2 {/ A. @) l6 B
2 X. ^$ U+ F# J' T: n1 r一、数据爬取
1 o6 h5 Q) U* x7 G9 F3 s4 y; X$ }0 y2 ]- ~( F
二、数据预处理, \7 J1 f& s# M( _4 \
, H) @9 E7 g8 L a前言
; [3 _7 L9 I S1 g) V5 S, I本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。2 w; O8 I: {) ~ n) L9 h& \$ t
; Q8 M3 S1 y2 G/ |9 t% {: \6 M
一、数据爬取( l/ K8 a) T% |5 k1 g# J$ X
import requests9 w5 y( v6 j* y+ P3 [
import pandas as pd1 c$ ?/ x: a- S: t2 X
from pprint import pprint' s f) z, i8 M
导入相关库5 |, \- @+ C* N% N* u
4 [/ n! P) z7 U& A f% i
requests库用于发起网页请求,获取网页中的源代码;
# G3 E0 O# d9 N2 L, \* F% S W3 e8 R, m; ?- l
pandas库用于存储和读取获取到的信息;
) U* H# X6 L3 p. i' F% S
0 I- ~% w) d9 zpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;( }. N, L; O4 |, Z/ l3 V
$ A) [( K$ |* a4 P, U/ c0 M/ furl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'2 [" p, c, ?- S7 C' u$ a' p
data1 = requests.get(url).json(), U$ y$ d7 Y; N' h' \& } y' i
# pprint(data1)+ I2 n+ g! K; d8 H% }) q2 \2 r; t
8 X* B6 [7 ]1 j, t2 S这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
4 q5 ~ @# h% K& R9 R0 d# `df1 = pd.DataFrame()
* y% `7 I+ P1 T+ m. Y' P9 [( Ofor info in data1['body']['allMedalData']:
1 K4 `; s( t" o. F+ y0 a name = info['countryName']
9 M0 U1 a; @9 g" l3 M: |8 V2 y name_id = info['countryId']6 w N/ W/ ?8 |6 M1 Y
rank = info['rank']; B/ c" l7 U$ r# x4 v% h- R
gold = info['goldMedalNum']
2 r; M7 L1 l' U silver = info['silverMedalNum']
, {$ E: G' X q8 { bronze = info['bronzeMedalNum']
3 N/ a) g6 _9 a* o/ G* C total = info['totalMedalNum']7 b9 ~2 {- z! t3 p( {
# 组织数据
; m2 I( N' o2 b% H2 j. L, ?0 x orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]% N+ B: x4 d* y7 R9 n$ f* {
# 然后追加df7 [7 A8 G6 q' L& p0 J; J
df1 = df1.append(orangized_data)' z8 R# Q. @+ E3 z6 ?6 S- f7 t! a( m
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']6 }( c. s0 d* o* n& D
df1
( a& W1 q/ ^+ k7 Z9 w d' [
4 j1 w/ T4 f$ v8 z 8 E# q: H2 ]( T
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
( \2 F+ i W6 `* m8 ^) v$ Vurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
) B. Q8 i7 `0 e$ F. A% t) y+ X) S$ ^data2 = requests.get(url).json()
( |. b' c# H, M0 R* L. `' y#pprint(data2)
) o3 L! u3 E* l" M. @( L; z: T0 y0 f3 ?" G/ J
df2 = pd.DataFrame()
4 d3 d" l( } @6 Tfor info in data2['body']['medalTableDetail']:" z1 [3 x/ O, ]1 j6 o
english_name = info['countryName']
7 W; k( {# o( |6 ~+ q name_id = info['countryId']9 e# X" U, n3 s0 l) s3 W" W
award_time = info['awardTime']1 A4 a: |/ D- |; g3 f
item_name = info['bigItemName']
; Z. v3 c1 w% r& u! N) F sports_name = info['sportsName']0 ?4 ]% d* l, q3 o7 P
medal_type = info['medalType']
2 `6 |. w8 v0 ]% g$ F! D$ _ # 组织数据( E0 X$ h! ~0 a# s6 _
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
8 V1 c+ n4 N# s# f: }! }) q # 然后追加df
2 m: @% P% |6 P8 H7 J df2 = df2.append(orangized_data), _) M( X) {5 s2 }3 R- O/ w
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']4 S( y! p8 R8 f5 X4 p9 P
df2 ' ^2 o* a3 R2 m/ ?
) i& ?; O3 i" h# E" r* q) U
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
. @5 ?( Z7 K9 g; b' g. v+ J% }: {4 F( v( W8 L% t$ O) G
3 s- S i; N8 [1 S$ j- w5 } ?* X二、数据预处理; ?# m8 w$ Q: S
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
6 n% y- R) z* f% b$ Z8 ^& m' `
e; R: b% X! m! I! N5 l- M) Kwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
4 I' w. b6 ]# S x = f.read()
8 G& b) B) I( X b# V0 L, |( |7 c& U. ?8 y- x
df3 = pd.DataFrame()
; m! y( t' y" g2 j: p$ J3 Q L; dfor i in x.split("\n"):
8 X. G; `' y( \ x = i.split(":")[0].strip()
2 \ y7 ?3 D+ I0 u) X# h y = i.split(":")[1].strip()8 T& _/ l1 E) L! D& H$ B, U" R
orangined_data = [[x,y]]
2 p v! O: U1 }: Y- } df3 = df3.append(orangined_data)1 R$ g0 u$ F1 P# U
df3.columns = ["名称","英文名称"]' c; Q# Z6 i8 @+ |) @3 G5 s
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)% A3 t" h( C) r$ o" j% h) ^
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。' x' h1 b, y% T L5 o
1 i1 B3 _% a3 ]# B3 {5 p0 w) ^df4 = pd.merge(df1,df3,on="名称",how="left")
( r& I0 T. g5 ldf4.head(10)# _% O: Y9 H1 x
6 g( Q2 [# l& g5 K; M' E![]()
4 R6 J- q! Y2 q8 J, c- e) |7 {. ~表格df5表示运动项目获奖详情。
7 K- i/ ?4 d9 _- h$ v# s+ M# U( q5 M
4 y, C8 i; X; ^& p- ]! N 7 ], h5 O0 `8 y* G s( m- ^3 ~' u. p1 }
0 L0 ~- ^$ y+ F1 ?) u- Y) j |
zan
|