- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40325 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12809
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录! E c- Q) m2 \9 b1 a# A% k* j+ g
c, v, W6 H2 l Z+ n1 _, b
文章目录% D9 {6 W2 L% B! q) w
: @4 W$ F5 {, {6 x6 Q! Y1 _$ d前言
+ y5 b9 d N& V
& E! O. W: q0 x9 B1 Y& N! k一、数据爬取
" `* }# W z) |, _. r$ W
4 h* X. F$ @' c1 M# o( Y二、数据预处理5 Z \, f7 \7 c2 O
0 R/ S* @' ~+ ~$ f( h- q+ ]前言
( L$ s$ y& S, U! y本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。7 _7 D6 }8 p1 Y% x% N9 t
i$ W) d9 b% U5 z# ~+ h. z1 b/ r$ h, U6 f- o H/ `& ]
一、数据爬取# @$ |8 D* p' u. {2 m
import requests+ ^8 X! A& P! s. _! x; t) k8 i% _+ s
import pandas as pd" L! }6 ~* y \- z
from pprint import pprint# D7 a- Z% T+ I
导入相关库
" f4 F i3 v! m9 a2 Q
7 E6 D p( g$ s* arequests库用于发起网页请求,获取网页中的源代码;
) X- ~! y7 a2 h# n
8 | P# t$ J- Bpandas库用于存储和读取获取到的信息;
6 _. p* t8 \ D6 l8 N) e# `/ ~9 T3 r: c5 J* X8 B- L
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;3 r q1 S% \% T# c# ^3 e% M
9 V( ~/ U9 D' F }$ l- n# Gurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! j1 W x% H# b5 O: L* h4 d1 u
data1 = requests.get(url).json(); y9 ?3 k# a3 a p6 c
# pprint(data1)
6 t0 |) v: Q9 r- R: _) W# Y5 R' `3 ]# M/ H: j
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
2 r4 I' L/ O) V0 ydf1 = pd.DataFrame()' z0 K! E; ~* v' V* u& n9 \+ r* x5 o3 G
for info in data1['body']['allMedalData']:, R$ E* ~8 q- `
name = info['countryName']
4 J0 [; A9 S/ Q' W' M$ I+ z$ ]& I; w name_id = info['countryId']
0 T% a- H7 Q4 R) e, F rank = info['rank']
" D% p5 h, z$ R gold = info['goldMedalNum']
( x& q) B5 J7 L2 B! z9 s8 X silver = info['silverMedalNum']
1 u( Y+ ]' i% e) p" l bronze = info['bronzeMedalNum']: B) K+ o3 f1 w& f; y- Z
total = info['totalMedalNum']4 b4 t9 K5 t4 s* G9 o+ I
# 组织数据( R: m& e5 ]8 X+ G/ z9 D. Y
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
) P' X% g2 S# G # 然后追加df
$ v: a: z: L9 j9 ~( w df1 = df1.append(orangized_data)9 n, p0 R- J& R3 _5 n; e" p P
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
2 }/ q# s7 i8 o8 adf1
, n4 |9 m0 c4 L+ b2 ?9 z1 Q
) x9 d8 t) V) @- z![]()
, k1 u, @9 Q4 g) x这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。9 ?) X, r5 [! c) r7 ~
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
' e& y Y! `6 E8 p- C+ ydata2 = requests.get(url).json()
' \$ _! K, r+ ?& u( n) o+ n#pprint(data2)
! e/ ]* O; P8 Y! K2 K' A: w6 y6 C: y- k* [0 n; h
df2 = pd.DataFrame()
9 ~8 l6 {2 W' j( P! x1 I1 C8 Qfor info in data2['body']['medalTableDetail']:8 l' f5 D6 {( H* j6 O
english_name = info['countryName']
0 @$ ]: n' \8 m7 Y, w4 s+ S2 A name_id = info['countryId']* z" c8 n' I% v% g' p% o- P
award_time = info['awardTime']
# U$ A( z. V( Y7 k item_name = info['bigItemName']3 [/ m2 n0 i" @! G
sports_name = info['sportsName']# A( K( i6 y: b0 n# A9 G: E
medal_type = info['medalType']$ A3 V2 _: l7 l" z; H$ l2 J
# 组织数据
/ ~' m+ c O, u- I e orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
% L2 I3 U/ V9 e8 J # 然后追加df; p9 F A. l' Y0 a8 h2 ~: P! e# x
df2 = df2.append(orangized_data)! Y- D# ^3 h1 J
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']* w1 G& e3 z, s& }1 D% x
df2 * @9 I5 \9 @/ W# {
; n' Q! Q5 {' M2 B& ~# U对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
6 X1 a3 G$ k2 `$ n' p5 i* J4 j: [8 |0 N5 L& \ m+ X
+ s+ d& o. `6 R: j7 b二、数据预处理2 C$ ^1 O: U- ~: ] m" q
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。" u9 b% `8 D9 U2 s$ q5 @
5 I1 O5 p4 B! X) i1 h6 n7 t5 nwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
( t: o! c8 |& j. g0 e4 X x = f.read()
- h& ~9 _: K" M
5 b7 ?, V T5 G" Tdf3 = pd.DataFrame()
9 E' ^/ V' k; c% K1 efor i in x.split("\n"):- K- @2 \4 |6 o' ^
x = i.split(":")[0].strip()
( m, U# Z0 P: i y = i.split(":")[1].strip()2 m- O) K- K( T0 x0 V5 A$ Q
orangined_data = [[x,y]]
8 b4 e6 w/ D/ P, x6 q& T2 t& h# S* F0 H df3 = df3.append(orangined_data)
; B C2 y" R- v p+ j2 H5 Odf3.columns = ["名称","英文名称"]
! `! l2 |( j. E. ddf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)+ ~* J3 A2 E. t9 D3 f$ R
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
Z& C" E" F. h6 u: z5 e
# P. Y& c/ x; I% gdf4 = pd.merge(df1,df3,on="名称",how="left")) y* c1 j( k9 L5 z7 M$ C/ A6 P
df4.head(10)
/ p. v# U- T# \* o/ k
6 X, j7 \6 A, [: p9 F# y3 o+ f5 B& z9 y![]()
$ J1 T# y% C% z表格df5表示运动项目获奖详情。
% V# i8 X9 f, N; R$ h# x( b5 O* y9 K1 o7 B* F6 I
- R: b& [ C. E2 K% v1 y $ v9 R# M# d, W) N& S2 s* `5 ~
% W# j$ @% H' k3 w" J |
zan
|