- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40216 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12776
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录3 a9 p& p1 o) K( Q
0 _/ {& k4 S! U7 R) K7 A( K文章目录
1 o& ]( _3 G( o7 w) t" T j& A" t/ `' v* C3 |% B
前言
5 _; a$ W) G# T
! R3 G9 k( ]3 D) Y' z一、数据爬取
* ]& q8 p$ H; ?* k' r4 n5 \0 K" R( L% N- ^ Q. b/ N
二、数据预处理
" I, {- ^/ j, u& r. S$ i. ^/ S2 ~2 Y7 b- g: g. z0 C& r' j$ O; R$ w' h
前言
$ J d* j' n+ U F8 b- m0 r2 L. T# I本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。$ E1 O y) d5 J: W3 N
& {( ~& P0 |+ a* f8 w* z* w$ }" x+ [
一、数据爬取0 Z8 y; t0 R. B Q7 t
import requests, c- @7 U/ [+ f" \- E: D" X l0 L
import pandas as pd
, a& k- Y7 Z( e0 Q3 L( k! Sfrom pprint import pprint
9 e+ Y% ?# V2 ?' l. h导入相关库
4 L- q2 n" |5 P4 Q. v" i& y U" |
& t4 h" _( f2 E3 c2 \$ urequests库用于发起网页请求,获取网页中的源代码;( B4 u/ [; L4 w9 `' E' M) R
7 r6 g4 A) u: }, [/ o; b: k) dpandas库用于存储和读取获取到的信息;
- l. J- s1 c1 [6 D5 _0 j' b$ w% Y9 b& n' a( Z6 w; Y
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
$ j/ H$ {8 Y$ t d, H4 `( g: N$ c; h8 l! X5 B$ Q m
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
+ _# Y/ W5 [ Q5 Z3 E2 mdata1 = requests.get(url).json()7 }; g$ l# ]- [
# pprint(data1)' I, ~! @+ b" @% P5 R# J
3 j/ i' L" \# M {! q! m这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。! A: n, V* O0 R9 x2 Y/ C4 }! ?% W
df1 = pd.DataFrame()
, e* W9 m1 Y1 M& u! X0 nfor info in data1['body']['allMedalData']:6 u9 D6 c6 T) m3 H M9 U
name = info['countryName']
1 \6 u' r% B, v0 ~7 w name_id = info['countryId']% q. W+ l0 O; x0 b, a5 Q
rank = info['rank']- q/ M; B( T' }7 k/ v
gold = info['goldMedalNum']
: l! r" a! _/ Z8 Y6 `3 v: ] silver = info['silverMedalNum']
6 P: v$ N- x4 X) x" {7 x$ B! B bronze = info['bronzeMedalNum']0 y8 d8 p' D, Z& t9 s: I9 v
total = info['totalMedalNum']
+ x6 c- n: S9 m: R5 f; o # 组织数据
- i5 z3 t/ a! g- F orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]7 ?7 y7 H8 e' m6 P, J1 K
# 然后追加df
6 [" H) r/ j0 {/ l5 m5 O# n: P: i( |, W df1 = df1.append(orangized_data)8 Y4 X* s3 B2 ]8 O) R
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']; s$ ^2 n3 q- }* F; S% R
df1+ @1 ^ i! {9 { E9 |
: A8 O1 ]: v5 h& j& P- n \+ e![]()
$ N7 _; n1 c" P3 y这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。( ?) y4 {& K+ _: ^. j0 ^6 }
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
% J( q% H/ H3 W3 {8 wdata2 = requests.get(url).json()1 _4 W4 G r8 t( a' t3 Y0 C
#pprint(data2)* T( X" G' R3 R7 B4 P# Q) R+ x6 T
% i+ H- N+ l4 C
df2 = pd.DataFrame()
5 ^$ o1 y7 x. F+ C# vfor info in data2['body']['medalTableDetail']:
7 ?! N% f: d5 A6 n3 c0 q6 c english_name = info['countryName']
; Z9 g' a% j& N1 e name_id = info['countryId']
4 u+ ^! g: N2 Y- `4 c award_time = info['awardTime']
/ I1 z+ ^- R, ^& P item_name = info['bigItemName']
( o1 B w- Q4 `4 L# @- \" H sports_name = info['sportsName']& ?6 K/ G' b% G# W0 c! h
medal_type = info['medalType']- j: w8 d! q e
# 组织数据 {' p5 M- q2 x4 ]; H h
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]/ x4 ~: b/ O8 r5 b! z% K0 P
# 然后追加df
: V7 j& i7 E0 B+ a; l$ m df2 = df2.append(orangized_data)
6 a8 _+ z2 b7 \" y/ y' bdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% l% e* d# J% w$ `/ v/ I5 R0 N
df2 % ]7 l' y! v# \7 J+ b
0 E! P4 H. {8 G4 n对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
4 Y1 L1 U$ J5 J$ M
. j1 S% c; X; q9 y/ i6 v) \- o
* T7 \2 z1 H6 _* c7 _二、数据预处理1 O6 u- n* O8 ?) t4 s
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。& e0 l' K- `0 R6 `
: p; ]& A0 n' V* v, v: _& Hwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:4 O* {/ w3 j8 d4 r: e3 [
x = f.read(). }6 `: ]) Z2 ~7 c
' q; f% }/ N: S( W+ d1 a* w0 f0 e
df3 = pd.DataFrame()
( Z' W" P) |) Y6 b, wfor i in x.split("\n"):- l3 A2 } m$ `0 j6 K: x
x = i.split(":")[0].strip()
; d7 K2 I; t2 n. s( Q y = i.split(":")[1].strip()
4 X# x7 J u0 P9 N8 {% Y4 ^7 ? orangined_data = [[x,y]]& g$ ?; N9 B/ ?; ` \7 v
df3 = df3.append(orangined_data). k% T& \0 `0 H2 }9 q
df3.columns = ["名称","英文名称"]4 h: y V) O% B6 J1 t
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
3 L; D9 N/ d$ e: I4 E2 c: _8 U表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
4 ^7 J, c) ~. k) }0 H t3 \7 w$ i5 _& I# x7 G
df4 = pd.merge(df1,df3,on="名称",how="left")
( a$ H+ {% C1 Y: mdf4.head(10)
; F& k! y; ]; ^9 V, x' i2 {! p8 }4 ~- C } d! h
![]()
" T) g, B% h, C) W表格df5表示运动项目获奖详情。
/ m0 D5 B$ j5 q2 F& }, J2 ^1 V! u4 o& q' r4 g8 y5 F5 X
9 q# L7 F+ h, q
: h/ `& e+ G* R/ Z+ l, N5 I, l u: V& a) |' b* {; T/ F
|
zan
|