- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40334 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12811
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
+ Y) p" I Z& Q! Q" P7 j! c8 z& l- o- ]" T0 F
文章目录3 m! H* G& t9 }# Y1 k2 f
. ?, Y/ B- b2 Z# h' R% x: n
前言3 z- f3 J( Y4 Q
9 i' }$ g4 p1 s, u2 U" B! C' V一、数据爬取. W; _- _" e9 i6 a" ^
: l! o' j+ a" h1 C! k4 T二、数据预处理
- R( ~0 E* `2 I$ [! ]0 P, U! \! P; h% R
前言
7 C" n' I" P$ o6 G) A8 c3 J本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。% K5 P3 g6 D4 a2 I! z& T5 ^
4 `3 b& T1 P0 v) a+ d6 I p+ E
# @( x4 o* V- H: M# J一、数据爬取
1 o5 k5 z1 Z5 z" s5 H K `import requests x* [4 T [8 n* j* V
import pandas as pd: y+ O% j% w/ _& ~
from pprint import pprint' }$ e& }1 k! @( _
导入相关库
+ u: ^) A, a" J! ?0 ?) J! a& a
q7 [& E$ h/ A: |requests库用于发起网页请求,获取网页中的源代码;
% ` W0 W( o: h
+ k, W4 {3 a* \; e. dpandas库用于存储和读取获取到的信息;
5 J9 B1 I% w9 D+ p+ T
) K q' N. v1 A: I( q' @3 |" G# qpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;5 T# a- |+ F' v$ b
4 S% @2 o8 u2 x! s' N; Xurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'% @- q1 G; S/ M" @( I
data1 = requests.get(url).json()0 R$ |% V7 ~( R8 K* t6 D
# pprint(data1)
8 e% V- `( O0 @ ^. ]; x: Y0 [3 w' j
! E/ {: `; R. |% v这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。" h0 q) m% {: f8 j8 ?5 G+ g
df1 = pd.DataFrame()
1 \7 U% ^+ k7 J, T) ]/ S5 n* Pfor info in data1['body']['allMedalData']:
- U) b+ a, I; i* b% X0 a! U name = info['countryName']
. U" s8 A. N$ `0 x name_id = info['countryId']
$ m) [* F! a$ p _" u rank = info['rank']
# y2 @1 K. f, o! d gold = info['goldMedalNum']; @( p4 n0 X% w, a' e I, {0 {3 K
silver = info['silverMedalNum']
( T- u: H: h2 a% H' t% ~, _ bronze = info['bronzeMedalNum']
4 o4 k( [$ d9 N a9 y total = info['totalMedalNum'], a- j0 J3 B+ e7 i a/ q: I% h
# 组织数据
+ @# l3 j) y2 R7 {* l+ f! ~ orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
# b; G% A4 b5 J+ S$ h, { # 然后追加df
& ?$ G4 Q2 Y8 @/ P2 p8 z: E" V df1 = df1.append(orangized_data)
# Y+ J4 T- t s# B1 P/ Adf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']2 N+ p0 A( C7 o
df1. v: } k1 U6 m/ w
8 }) [+ I! N) m/ B! ~( l![]()
! G/ L# T+ _" l9 o. J这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。, }: x' f' m9 r6 y/ x+ a0 x
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609' d/ i3 o& b, B3 M% k
data2 = requests.get(url).json() P3 ?2 c7 s+ W+ K
#pprint(data2)% ]5 Y X6 U9 F# D6 ]8 `0 M' o! a
% n1 E U+ h c7 G. j. Y
df2 = pd.DataFrame()/ u+ ]# K# w. G* T6 B- B
for info in data2['body']['medalTableDetail']:% f8 ]9 G1 ~1 A, i( `+ u: ]
english_name = info['countryName']2 S& h l3 j3 q
name_id = info['countryId']( k- N# P6 q7 m' f
award_time = info['awardTime']0 C6 ~; A. F# w O u) q
item_name = info['bigItemName'], o8 X! H' A2 R% J* i6 k; C
sports_name = info['sportsName']& @/ y) V; t* g- e$ l3 F
medal_type = info['medalType']$ U" p# j8 F% x/ A/ m P( F
# 组织数据7 W; K, P0 O. A- U
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]8 I2 C/ m1 S( O" \1 f) h
# 然后追加df) X8 o9 t% V3 V+ N# x
df2 = df2.append(orangized_data)
' Y$ f/ i% N2 Cdf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型'] V' H' y( y# m2 I! R
df2![]()
7 V) J6 S' X# A7 a& v* R0 i* B# C% D$ T2 d3 c3 N" H) u$ |
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
9 e9 |' O+ v1 S
6 N4 i3 _$ b) |2 L- e3 U( j$ S, T I( I9 L( U! s
二、数据预处理- z L) ?: R) p1 y
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
! I. h8 S$ c K- q; r
5 [4 S; R$ u4 M- N _with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
* K7 ^& F0 m' L/ y, N6 a% l x = f.read()# K' y/ e2 V; C! q7 N1 t/ ~
5 F# i# P7 A) q+ W" kdf3 = pd.DataFrame()
b" g1 `5 u. w) Mfor i in x.split("\n"):
1 S: [5 B9 q* d x = i.split(":")[0].strip(), y0 b: S _/ w$ n
y = i.split(":")[1].strip()/ r: v5 D+ ~8 C1 D9 b- K# k
orangined_data = [[x,y]]
( p# L0 ~" `/ \) o! u' Y" ` df3 = df3.append(orangined_data)) E3 x* l( T$ V2 `- z4 t
df3.columns = ["名称","英文名称"]
- @3 a, I- k; `- v' M2 Kdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None). I, h2 Z/ m) B0 ]1 m
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
1 F3 i+ H+ \! M7 g2 M
( L, Z9 ] ?; Y) y0 w. Fdf4 = pd.merge(df1,df3,on="名称",how="left")
; N) k& _( {- d. r& ^! ]df4.head(10)
7 a. N9 _8 ^% ^$ y
4 s' c' L q+ y/ q. G/ Q3 A, H9 j0 Y![]()
6 d" v% g9 r) f表格df5表示运动项目获奖详情。
5 C& ]" ?/ \, ^) O( i3 z* I
1 t/ U; r( u1 f7 k. Y6 N$ L C) U" `, F4 h
" h- ^$ F3 V: e0 G/ R5 D1 G
4 K; D) F/ Z8 ^: j0 y7 W |
zan
|