- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40245 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12785
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
5 \. `/ v$ A5 u) N) |8 ^, N
# o& m4 l8 W. X1 y8 a6 ~文章目录
3 s4 u$ T" {( d6 d+ X9 n; |! b/ Z9 s0 h( i0 s4 g% e3 r) K
前言% x; N; v* }% h/ x. |9 x
+ r, ~" H. Q# k- V一、数据爬取/ U7 ^, ^' v& P* w: B* f& d' @
8 I- c/ D F7 Q7 ]
二、数据预处理
r9 ^5 o% j0 ~% O0 `* l& e8 d6 r3 Q3 ^1 A
前言4 E& C8 v2 l) V+ r* f. N
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
1 \. W1 W2 ~9 D ]1 e' D3 k( j) E; c4 F) ]) B& p F& B
6 @% d5 a6 z4 @ P" y4 S7 Y一、数据爬取! ~# b4 b2 K: o) S9 g
import requests* c! U$ z/ S+ R
import pandas as pd+ Z) ?7 w b- i, V6 @; k
from pprint import pprint
! L: p( c8 F0 T9 s导入相关库
! a2 Y, {+ K h* X. `
( p! v/ U) S- Y4 U grequests库用于发起网页请求,获取网页中的源代码;
& ^. q- u8 v8 o# W7 D5 P
, c w2 K, t; Ipandas库用于存储和读取获取到的信息;+ V" h5 H1 N0 ?7 g0 j1 R F9 [. {
# c+ G' K6 ]+ N8 q5 ipprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
3 X9 R; z. L% z# y1 k8 S2 B
1 M8 X" I' C5 J$ J) yurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
8 G" y1 f6 a* n) y4 ]9 g6 Q8 cdata1 = requests.get(url).json()
; X+ I9 O+ ]: `# k7 j+ Z# pprint(data1)1 v/ k; e. Z$ c7 e+ }
6 w @) m1 T8 m( p- ]& c
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。( C T, r/ y& X
df1 = pd.DataFrame()
- G) H K$ |0 n0 i# s% ifor info in data1['body']['allMedalData']:5 {/ D: r8 X; [
name = info['countryName']% x1 a) T* t6 N9 t3 I
name_id = info['countryId']
( I# @, \& b$ t. |6 M rank = info['rank']- W% O5 x ]( S0 M6 s [) O
gold = info['goldMedalNum']/ S. L/ S) f; ^
silver = info['silverMedalNum']: {( D) u$ w6 E# z4 }1 o
bronze = info['bronzeMedalNum']
8 \$ [; t: m; w. ]) i! M( J total = info['totalMedalNum']: N( ?: [3 o: p( W
# 组织数据
( i, ~; t2 H# V O) g( R orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]; I Z% b/ N5 U# U6 b% F& H
# 然后追加df
5 P' V; e D- f, h; r! b3 }' | df1 = df1.append(orangized_data)
- x+ f: }% J8 X* r. x; Kdf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
& g: }3 b- x, B7 q$ adf1
* X7 ]+ I- d- J4 [- \; S: x9 N5 K0 [
![]()
: {: d7 W. d% k- h9 ^; D+ I0 j- G这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。7 W7 s/ X4 K" D' j
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'9 F! Y6 O; }, _+ x& V1 _( ]
data2 = requests.get(url).json()* r9 N6 a4 R2 j j
#pprint(data2)
( I* C" j4 f7 _6 d5 ~# A# s6 R$ \; }9 w2 _ {% ^" \& h
df2 = pd.DataFrame()1 ?: E1 j8 r! d- K2 c
for info in data2['body']['medalTableDetail']:
_8 b6 v1 `2 [: @& `: ]; [ english_name = info['countryName']2 G5 x; g: ]" X: R! A" W* N; O
name_id = info['countryId']
, n) N( C# K/ {" `8 m2 D& ~ award_time = info['awardTime']
4 x6 x. M* N% |& v3 X item_name = info['bigItemName']
; P1 |3 \% S6 |+ i7 W% h sports_name = info['sportsName']
W2 {) G) C/ K' ]# B2 V1 x) ~' ~5 M, d medal_type = info['medalType']- S, q. ]6 U2 [! P" C$ d
# 组织数据
/ }0 B( A4 A/ E' |; v. a% F orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
; O5 f ?8 ^& o$ c # 然后追加df7 O5 M7 S0 `' I+ n/ G
df2 = df2.append(orangized_data)4 O) n4 N3 U3 c4 X. B
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']8 n* ]' K7 h5 c
df2![]()
- `# g: I7 z; Q* b6 M; E2 y4 |2 o8 m; e( k" P2 I3 r, P) E8 r+ l
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 6 F. k6 B4 b9 u8 }" ]) l* H
* N3 @ v9 v3 O% d( B' g) l/ Z& F1 y( L7 z, O3 L/ H4 P# \
二、数据预处理
; P& E1 X* P/ n* z: x: N: M由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
1 m2 u3 i$ g8 x: i0 V0 |5 ^( U) R/ e- @+ j- d
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
7 ^% N" ~2 K8 W4 m x = f.read()
* z# Z0 ~0 G5 @) n# S% Q4 [7 d; l& Q( c' P" [( @+ Y* w2 n
df3 = pd.DataFrame(). w: O1 M1 J$ }$ A
for i in x.split("\n"):
+ l* k! S" c1 l" Q x = i.split(":")[0].strip()/ E" d; J7 a2 {
y = i.split(":")[1].strip()
3 J* N# A2 q' @9 m orangined_data = [[x,y]]& q( _2 f: N' C+ y
df3 = df3.append(orangined_data)
! Z1 W4 ^8 t N% X; [0 K$ kdf3.columns = ["名称","英文名称"]
2 P9 i2 T" q$ l5 u, ~' xdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None). M8 g- B2 \4 C' h' O% s
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
+ G1 {0 u# [; u$ Q; k( L& M& W# H c5 [
( C! n0 K& [! M- D5 Qdf4 = pd.merge(df1,df3,on="名称",how="left")
- {8 |; v3 f! U/ ]! z' P8 [df4.head(10)
$ H& g) S. w" I6 U9 L' O1 f8 M/ h/ J F0 V' w2 v' G2 }9 a( ?
/ g$ C/ f8 q) y! P/ [
表格df5表示运动项目获奖详情。 - ; q5 y9 b5 h/ L1 \: Q3 }: Y
) s- @6 w) s) C* m' K5 c# X# o# y6 ?- W' N& v1 ?
0 Y! e+ w8 m" X& q& o0 f) W3 q- u2 Z! m( F
|
zan
|