- 在线时间
- 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
- 自我介绍
- 数学中国浅夏
 |
目录
# ~1 F3 d+ S+ ]; g8 A- ~: V3 S" v! T: h3 Q+ n5 r" Z/ r ]! I% a
文章目录8 ]$ B+ D8 U$ ]
, J3 P5 \( j( r+ P6 g- a前言
2 a+ P9 g, ]. ~* y: W ^! ]! z* r" D6 X5 Q+ l
一、数据爬取7 X0 W! n& m* D, @ C; \! g
/ s: c5 v8 E, Y2 m3 v二、数据预处理* m2 L% K) L0 [4 v: Z5 y- ?4 J
- v5 |' v! ?4 T8 g1 X# [7 B前言
! ?' P1 U% ]& S+ G- R本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。3 E" y" D0 Q- c8 O6 o9 s
' T4 P- a! @& u5 W# Q# {# Y& \/ _
& u4 P" E+ |. e( ]. h) x. Y e一、数据爬取
( X; R4 W# i- Jimport requests) b; x6 L' Q" h8 j( Z6 b: I
import pandas as pd# x( a! w3 E* P8 k
from pprint import pprint
: M* M4 n. v) n导入相关库) O# n( o6 Q" | q
2 [( {. m6 x' t7 j3 X0 X! x1 }
requests库用于发起网页请求,获取网页中的源代码;
4 F k+ @' x6 G! R" [4 k; n7 n5 K: ~2 X- m: f
pandas库用于存储和读取获取到的信息;
6 A. I% X* U- d( }, s; k4 R. x4 R. L7 H; B1 ^
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
! V4 ~& M A% z; o4 l" p- R/ y7 U* T0 t% r$ A; B* x
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
4 n' _) H, G/ n3 v9 xdata1 = requests.get(url).json()
5 a/ [/ R% g8 v3 o+ ~; _2 N# pprint(data1)8 f% B3 w& C' \
! _. l' q8 k, n3 v: C& D这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
- E' J3 w/ N1 m$ j- H Pdf1 = pd.DataFrame()
" o) ~2 T1 k8 C$ _" j( J1 K. {$ p0 h0 rfor info in data1['body']['allMedalData']:
# I* t$ g$ v% t- r; j4 A/ v; P9 t name = info['countryName']# }9 d4 w2 f- d0 \" H1 a
name_id = info['countryId']
+ N% j& [& H2 A' n0 I/ A rank = info['rank']
1 m' M0 \; p6 D6 [) W ^8 M7 ]7 S! Q gold = info['goldMedalNum']
3 u* w/ y2 G: `) s/ R+ P silver = info['silverMedalNum']
/ ~/ B4 |+ B; ^; D1 d! v6 u bronze = info['bronzeMedalNum']% i2 b- j' j* c% k% o8 } k3 i8 t
total = info['totalMedalNum']" z7 o. O* ?( q+ \0 i
# 组织数据2 p9 v& A, o# ~+ b/ D: m
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
' h& G0 C2 i2 r$ ] # 然后追加df0 z, ^& D- X/ ?( {$ j
df1 = df1.append(orangized_data) x i, |' Q' _
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']/ s6 }- r9 J- ]; k5 ?6 `
df1
6 f `4 d; V# z9 J, H9 s; g$ z; [9 O& m; V' T
![]()
: J& c( [7 n7 j E这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。. U. ]( N8 A; g- u( Q8 [7 f4 _6 t. W
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
5 d" n- L% a, g3 [; e! P* jdata2 = requests.get(url).json()
! W$ I) R' G* z! k% K#pprint(data2), @ `: a0 D8 ^" r$ m3 j- T
# x5 D# T5 }9 n, @df2 = pd.DataFrame()
* ]! B. m1 T8 A. ^. f+ afor info in data2['body']['medalTableDetail']:! Z8 b: h! z( d6 L5 g& f
english_name = info['countryName']
- f8 |$ m& q* n/ I' J name_id = info['countryId']
' Q. \# r6 |( n$ ^) q: i/ z award_time = info['awardTime']3 Y+ M$ W6 ~* G2 ~1 D
item_name = info['bigItemName'] s2 {* w* j; T4 e
sports_name = info['sportsName']
. j; \; l9 ~& r) ~& Y medal_type = info['medalType'] n" b) d) U; @8 Y- }. ], M! @: S
# 组织数据; G; A5 S; h# v# e6 p' ]$ u1 ~+ @
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
, ?- @6 w/ {9 K9 B/ I( X* o # 然后追加df2 Q/ ?. e0 I3 k
df2 = df2.append(orangized_data)
# N* e/ u2 N1 W+ h$ F( t' J9 Ldf2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
2 b& [$ L, A! N* z* B2 [+ Ddf2![]()
6 V0 n5 a) x9 ^. |5 P
7 s I; T% M* v/ `% e% k对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 * x* I I7 K- G& ^" e- p/ M T
# |$ Y$ |+ r% v5 \
u N, `% P3 v二、数据预处理
: @8 v% z' K9 a% M7 T/ C7 Z由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
/ }- `8 ]2 k- p, \+ u" k& A( Z4 Y
; q$ Y# A1 d( j# X% v! H Xwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:4 U) c. y" U5 T& F; q( j
x = f.read()
6 m4 J2 r; _. r* |. N+ _7 c0 b) U5 J8 ]" I
df3 = pd.DataFrame()7 k- c% t8 I7 x
for i in x.split("\n"):
0 P- `4 X' g% ]- S6 }& o x = i.split(":")[0].strip()
' q) w" b; o: \( d! C y = i.split(":")[1].strip()
2 {; @$ w9 B. Q+ f orangined_data = [[x,y]]7 e. h" ~% h; J
df3 = df3.append(orangined_data)4 }+ R& C( j0 \/ Y# C; b4 Q
df3.columns = ["名称","英文名称"]9 p$ `* {6 ]$ d1 r' h3 ]& s
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
/ Z1 u: m6 W( x) {: v+ k: S% U表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
# @8 p) x4 E% F$ K4 L6 j' k
# s' p* C/ Y5 _/ Tdf4 = pd.merge(df1,df3,on="名称",how="left")/ ~ x" M( e; }: T: M
df4.head(10), {! W g; f% B H1 ?* O
6 l# [: a2 u) o1 f7 Y 1 ^6 l5 ]0 u- d; \& L. H: @6 G: K8 q
表格df5表示运动项目获奖详情。 - ) [6 A$ ~' B* _2 q: b
& A+ n# F" g# ]% ]" l
( [) P7 M7 K0 Z4 k0 J1 I$ @
; h' c0 L9 A: l+ b, r- G/ A) t! h7 p4 R# ]5 a; l8 e/ J3 L" _
|
zan
|