- 在线时间
- 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
- 自我介绍
- 数学中国浅夏
 |
目录
u' Q8 r3 i9 n8 ] }6 C
- k0 V/ d9 | |4 g8 N文章目录
$ T& U# A& k4 v! I
& v, v, a8 k( {2 u$ D6 G前言! y, j6 M2 T8 g
+ |7 f" o5 w* \, ]" m& S一、数据爬取+ @2 A( a4 d+ x* h+ T/ \
: K0 G5 X, x n7 f2 F7 v5 E n& t二、数据预处理* \$ w' A. T' {" D, [8 G! |
( ^& { Z1 Y6 a, V- q* B9 f$ c
前言
% d }1 B- U3 J z9 A本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
. o% g2 q2 k& f+ b; v/ N! s6 z: r( H3 e# V9 _* r
) i3 N3 a- x6 W3 M3 s5 N0 x, [
一、数据爬取
, t$ C. E- C8 n( Eimport requests
E/ F+ M# G3 i+ yimport pandas as pd
" ]$ f5 X0 ~1 T6 g9 G# r( kfrom pprint import pprint# {& G3 \7 b; n% A
导入相关库
q" l b$ J+ O# g1 O" u+ q3 o0 f& g
requests库用于发起网页请求,获取网页中的源代码;" f% k7 ?3 f' J' j8 E0 ]+ a( b
5 ]% p) ?( `9 E. r) d: Dpandas库用于存储和读取获取到的信息;
$ A- _# b$ @7 {" R! U' y5 w
% F- i* t/ V7 B* U" [ ~pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
7 ?6 j- W; z0 C/ O' |' @* D
, F1 K& J( L& p9 _url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'4 F5 }* \# g: s
data1 = requests.get(url).json()4 v6 d6 [" k1 N( R5 v j5 T
# pprint(data1)
3 R) K/ l1 b" l) Q, ^5 Y( G" @* u) ?" B
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
. \/ ~2 ^" p9 N- I/ bdf1 = pd.DataFrame()" o2 r. m& B/ x1 e$ t3 M; A
for info in data1['body']['allMedalData']:
7 j* Y8 s% x* s3 A% q+ Y( u name = info['countryName']
- @) [) b( x7 V; q% | ^ name_id = info['countryId']' O s/ ]3 K4 j8 P- ^' j' S" h' t
rank = info['rank']
2 J" d& ~! n% g* P gold = info['goldMedalNum']) z, u+ H! v# k9 s, m4 R
silver = info['silverMedalNum'], e" m0 O# X& ?/ |& A' V
bronze = info['bronzeMedalNum']
* [9 ^3 P8 |' ~1 o+ J total = info['totalMedalNum']
" g3 G2 M8 Q: S' D1 _7 l # 组织数据
1 E9 T8 _% E1 ?8 m$ w0 k7 m3 _" l& d orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
- [: \: ~4 }/ G* B # 然后追加df3 B' z( p, [7 y5 c" ^
df1 = df1.append(orangized_data)1 V V% p2 }% k
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
' d* q1 ^' [3 ]4 _! V1 Bdf1$ m# |- ~% \$ v' \5 e$ A% w
( V* S. ~9 e6 Q& @# l3 s& v3 h![]()
0 y7 ]+ C; p- W- a" ?这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
# U) f3 a$ h) W& n- q9 [7 H! lurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
# D0 o/ `! J- D* _- G+ wdata2 = requests.get(url).json(): @. V: i- y$ x9 t
#pprint(data2)
6 L* \! N! s) X7 c; Z& r# {" v3 y. \) r
df2 = pd.DataFrame()
2 a9 P& m" [& [' n. E) Mfor info in data2['body']['medalTableDetail']:
4 z* C K( r7 a6 t* F% B( k5 [- r english_name = info['countryName']/ l+ v# Q* R/ d8 Q5 S
name_id = info['countryId']& q* D4 Y5 E2 h! a; X+ ^' y
award_time = info['awardTime']
% f) ]4 V; T5 L" |* b$ E! ^ item_name = info['bigItemName']
- E% q( n! k5 r3 q& d- m sports_name = info['sportsName']5 I2 @4 ?0 V4 h" h' Q r/ k/ b3 X
medal_type = info['medalType']" r4 V9 X3 _! D5 m
# 组织数据$ t$ k( c4 a: _, h4 S; Z/ U k8 Y1 K7 i
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
' O2 X' l0 b1 _+ V; L+ _( j # 然后追加df& O- s' L% k( J3 Y$ D
df2 = df2.append(orangized_data)7 S: q+ c0 ?- J% z: a! n
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
$ ?& ]" R w/ ?+ D: i0 \$ l; ^8 T; Cdf2![]()
/ x" q1 g9 n+ T" j, m, @! b1 k' |# h
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 - M, W3 [+ s9 I% }/ N8 J. P
7 M r. v/ |* X/ y5 f
" Y( c5 J; U8 A! ~% N; o3 N二、数据预处理4 p+ d2 u' t$ [5 B
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。( I: s8 M$ X2 K, f( z) a
; h& G: f( I! v5 C, Y, t
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
0 \/ J; k- L9 I6 J& N x = f.read()
2 f& R1 X( L9 ?1 {, m; n3 k4 e6 s' i' h# s( w/ @
df3 = pd.DataFrame()9 s) ]" J3 a9 y7 k
for i in x.split("\n"):8 n& {. U6 S' ]% D" P
x = i.split(":")[0].strip()+ B1 W( m5 h0 l
y = i.split(":")[1].strip(), H2 s' b0 D1 N3 d. c* i Z
orangined_data = [[x,y]]+ T, Z) {5 _% F3 W
df3 = df3.append(orangined_data)0 |0 ^# M( d2 e7 `) s6 O
df3.columns = ["名称","英文名称"]
; R8 v) z( ~4 `8 _+ Hdf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
1 g) i% W$ n% c+ X4 n表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
; H2 R! C( O$ C( E! m- r! u! ^; F3 Y2 n- ]
df4 = pd.merge(df1,df3,on="名称",how="left")7 G9 ^: K8 l$ B6 A0 ^. a1 l1 ^+ v
df4.head(10)
# a/ _# X8 e+ f9 ]5 x' \: L& y
% C. `/ H% A; k
表格df5表示运动项目获奖详情。
- h2 }0 o' F. |, ]) C1 y( r7 z3 R+ P+ P3 s# U+ @2 d' s
+ w* z, K W" |$ o+ ~9 ~' s) x, v. F% V
0 _; S7 y6 R6 n
8 O5 R) X/ Z2 z0 Y4 w* m" |+ V
|
zan
|