- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40324 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12808
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
* Z0 h# a; v' q9 W+ ]" D( G
3 }4 {- c) c3 y4 N1 }* L8 S% I文章目录- ]* G, q" _3 h: O4 n0 g6 R. d
# S+ B8 ?. a) _0 a/ e4 _前言
" d4 t- o$ R7 b0 R% R8 w& m0 _7 f0 n) d& [) T( V( `
一、数据爬取
; G- q3 k1 ^- w F- {& X! ]* Q4 I* w0 Y5 g2 I$ p
二、数据预处理! {0 G' z, r8 b6 G7 @
; J8 C4 V/ K6 C+ U, W/ z; o前言
8 K) [+ K4 ?; h, u- y本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。/ ~% f4 j7 [( }( N9 u
! E: A& M, A* {, _/ Y5 `0 X- E& M% r9 c/ P: r# m; q0 U8 y
一、数据爬取& B2 i. i2 e7 m( A L. @
import requests6 H7 i$ w' [7 g9 {
import pandas as pd
* N# I: {' H; M( T# b" bfrom pprint import pprint
+ S H) P A; N2 a/ U+ Q, m9 t) I' _导入相关库# S8 V& P3 _/ Q& Z/ N; F
9 A7 K, S% `( R- C3 P2 B* E
requests库用于发起网页请求,获取网页中的源代码;; V* B3 d+ @7 I' J7 K( B
! }! g1 D6 a6 K7 ]
pandas库用于存储和读取获取到的信息;
3 `/ M1 U& F! G+ E5 N8 C
9 }: o. U# `& {" C2 C) t9 Cpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;% n# W9 ]) G, e+ x6 f. u* \, K) {2 \; b
7 |# r8 [3 t* J' T( h, T2 Gurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'- y" O* Z) q" x5 a3 C& g% s! F: l$ r
data1 = requests.get(url).json()- A. h+ D2 h/ s1 F
# pprint(data1)
5 |9 J$ ?( U: _$ u9 y
~; F' F$ Y, _* u' k) `9 I这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
1 S, F# k. C4 q& K1 _4 R2 Kdf1 = pd.DataFrame()& |6 x. e$ e3 U% d7 X- }
for info in data1['body']['allMedalData']:4 q, O7 k3 {+ V6 R/ T
name = info['countryName']
& P) C A2 v$ l7 i- F name_id = info['countryId']
4 G) I3 h, Z0 K! M rank = info['rank']+ u& x3 w. x% Q' {% [. S' I, W
gold = info['goldMedalNum']0 K. ~0 p6 [# x3 f! P9 }
silver = info['silverMedalNum']5 N/ r! X: p( F! a
bronze = info['bronzeMedalNum']9 a6 n$ m& m; l
total = info['totalMedalNum']5 r2 E, e) j1 |7 {% i; ]1 v& i+ k
# 组织数据; v' U/ i* i y+ d/ Q) \9 c
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]3 a: K2 |4 \. r. U
# 然后追加df( x7 S% D' c+ K0 r5 }- D$ ~ G
df1 = df1.append(orangized_data)
0 _! F. G% W1 q% y- @7 t, Adf1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']7 S1 R, c: `/ ~. U+ q9 O; k
df1
0 w+ V* R5 @7 J$ M3 t- |) `3 z& M* O* _0 @) |! ~
+ n9 x2 U% G$ q8 f/ L% }
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
* Y& ^3 j h. Ourl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
6 X' F6 |2 C2 a# e& ]data2 = requests.get(url).json()
# Q. u. J$ B' r8 [ m#pprint(data2)
+ ~8 a, k9 n8 R4 g) S) B& ?: H z# U; M
df2 = pd.DataFrame()
7 M6 q+ z8 P/ w5 w7 k8 sfor info in data2['body']['medalTableDetail']:
# ~, v3 U5 W7 @& l; U& X: M& ? english_name = info['countryName']
8 x* ~' a2 S0 t7 F. x$ c name_id = info['countryId']
' O) _2 y* y4 p( _( \ award_time = info['awardTime']; x/ L1 |& `7 ^' P# H+ V) k+ \/ H
item_name = info['bigItemName']' N4 a& Q4 ~- q w) k, G6 ?) s
sports_name = info['sportsName']: }- H% R V' |) l1 i
medal_type = info['medalType']
5 t' j0 P4 w! c) ] # 组织数据
, \ G- } G/ B* m4 i. Z k7 U" A orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]: [7 s0 v9 b' Y6 k+ P* g
# 然后追加df
/ J! Q- @: w5 j( M+ g0 j" q& S/ ? F df2 = df2.append(orangized_data)5 T% @0 v. R5 J8 R$ R4 H
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
; t0 t6 y( J9 kdf2![]()
+ V) o; f8 K8 ? A- W& d* K& p& C: v, g+ o; M& ^) p
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 5 _' h* w% `8 {8 G0 X
; \; k# W: { R5 n* ^3 s+ ^: m
( l6 E2 c. E* S+ _# l
二、数据预处理4 c1 U6 d3 `+ G! O( r2 _* z' ]
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。- y3 A% A3 B. T% ~+ N" m4 k) z
9 A# z+ o9 r w) F7 X1 L- I2 i
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
" y) s! k5 i8 s" m4 m x = f.read()* F$ w' v, l! T+ R/ G7 i- T
( y( I9 L0 C8 G
df3 = pd.DataFrame()6 T& v! a6 S, |( B: J2 [+ n
for i in x.split("\n"):6 L2 ]; `$ u& j4 ?" z
x = i.split(":")[0].strip()9 ^, p1 F2 N1 c* I% m) t. t) f. e% y
y = i.split(":")[1].strip()
- o9 V9 R2 Y j! Q8 j- u6 b# k orangined_data = [[x,y]]# ~, _7 c. Y5 E
df3 = df3.append(orangined_data)
& G, a4 V3 |* P, Odf3.columns = ["名称","英文名称"]
8 _1 \+ i, `, n/ x6 F; S* G7 ddf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)& x5 }7 W* s L* r
表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。$ l8 M5 x$ o% I5 S- r
+ _3 z. Z0 `( Z: y
df4 = pd.merge(df1,df3,on="名称",how="left")
# K1 V h, j* @) D: Bdf4.head(10)0 z" x/ I/ {; C2 U/ e% A
( U+ q# H4 t7 ^) `! |. h: j3 r4 M
2 Z: z* ^# w P1 X. |' C' _
表格df5表示运动项目获奖详情。
8 P# U! q1 v0 `" v l/ e
: ?8 O- o8 a' D* y% o
5 l' m) z" L% N& v
7 x# u/ d- a6 ?0 |( ]. i4 V( a: K+ u. ^( y" w0 }9 Z: s
|
zan
|