- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40075 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12734
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录
( Q% j2 w) N2 N" h+ y+ T% ]6 [5 w$ R
文章目录 ^. S0 t, J3 L
- x9 f. k; g) E: v# w. \4 m; |
前言
, R4 S( E/ J$ h0 x5 F4 U
/ P: O: \" I% Z( c: H# W* U: p! ]一、数据爬取% O4 q+ h: z& M7 W7 l0 z) ^' V- y
" r$ u6 g2 s/ D% l$ u2 V) A6 q二、数据预处理
/ L# L2 ~7 s* B; N& P4 U/ k7 P+ q3 x4 r3 L" _7 A# Y
前言
' y3 ^. n9 \/ K( W本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
% ^" z" s, K. U' I) I2 X7 s+ r5 b& D- Q+ j F. g, w
0 }7 M5 M$ N% J2 V) U- C一、数据爬取
) N0 [9 J+ c( F, \, U4 oimport requests4 H) r5 E" f: O+ {
import pandas as pd( S* W" u. F' O: K( q( p. R" D
from pprint import pprint
. }% {! @' w8 J b3 F导入相关库
+ A3 }: h# z* U5 J7 ^3 i( J. I1 f. v: M ?
requests库用于发起网页请求,获取网页中的源代码;) d8 y4 O; \$ B! d% \/ { w
+ ~ ~. ?5 u4 ~; n" }pandas库用于存储和读取获取到的信息;
7 x" g! F6 x# e% `
7 x; U5 p; [9 hpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析; \- W4 \9 l" {, x, v
# W% y1 Z+ ~% q" U& l( c
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
* j S" Q# q% }' O' fdata1 = requests.get(url).json()
( R3 _8 I1 c8 Q0 ]. Q% C# pprint(data1)
, k9 r( Q8 }2 e
$ O2 j8 W8 W) M这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
- z* ?! p) q. z' `df1 = pd.DataFrame()* B3 p( t* R& {) v f* j
for info in data1['body']['allMedalData']:
6 Z5 G& U) }: r name = info['countryName']/ z0 {2 u$ H- r8 t3 N) Y* O: Q
name_id = info['countryId']: v3 S# o0 C& \. b$ {
rank = info['rank']5 X5 G9 n' z5 q8 `/ L3 j" G+ }0 ^
gold = info['goldMedalNum']: m6 ^ [6 ^$ M( I! t
silver = info['silverMedalNum']
6 ^+ d( n5 b% i! v, E2 e9 H4 e bronze = info['bronzeMedalNum']8 J* Y; s1 v w9 }$ a7 C5 g
total = info['totalMedalNum']
' W5 ?+ R. }! d8 v+ o; g # 组织数据
" v6 n3 A3 K# X/ ] orangized_data = [[name,name_id,rank,gold,silver,bronze,total]], D9 j& d# u9 R0 V0 f, s
# 然后追加df. }9 x4 N, ^% Q
df1 = df1.append(orangized_data), U8 j% K1 C: q; {' s
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']! A j0 [8 V7 h& t5 q
df1
- d' x/ e- {- M) k3 d4 g1 w: x: i" ]3 c) ]) P ~
! g4 G$ g: i# a
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。4 A0 I; a/ k4 Q- M( S1 f' o' M9 ?
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
! j# J+ m! G9 Y( m( h0 bdata2 = requests.get(url).json()8 c$ F+ ^7 q& m' k2 U$ q' U6 a
#pprint(data2)
8 S) O7 u" t: B: ^/ {1 B& o& |+ ]: ?# `8 C8 u2 S( z
df2 = pd.DataFrame()
$ ?) y$ g! E: ufor info in data2['body']['medalTableDetail']:& ~, k8 w6 `% f( ]2 W
english_name = info['countryName']$ G6 ^3 [! V9 K# G7 ]
name_id = info['countryId']
/ }) |' G' E" y, I award_time = info['awardTime']# b6 n* s( b1 G1 f
item_name = info['bigItemName'], ?9 x) g7 u' o# x: V1 X
sports_name = info['sportsName']
8 [- t. r8 H F' p& } medal_type = info['medalType']) T7 k% g9 U9 Y6 n2 f$ j* O
# 组织数据3 Y7 s# p: A5 j& y/ d! `/ G
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
: j% y+ y z- z6 p# U- C+ [ # 然后追加df1 J1 j. p% G2 p. W3 H
df2 = df2.append(orangized_data)+ x5 `7 T- k( w( u) r
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
0 k/ r* ?$ z, S$ Z* e6 Zdf2 ! w& Z9 \3 i( B
8 U G. s0 s) G
对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 6 l& l2 x5 f, s
4 S$ A6 n$ \. r. R2 j! A" L; J, p! J; k5 t# T; H) ^6 w
二、数据预处理
, X7 `# u/ e- T, g由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。' H( t/ e. s' c3 ~
I: D0 M! n6 P6 m6 X# g J
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
) c9 L% g P0 N& s5 H2 I x = f.read()
/ u0 p2 f( h; M" u! n( q! I! Q9 u$ g; [3 `% L4 l2 d( h# x: V9 W
df3 = pd.DataFrame(): b5 K4 `5 D$ o. k: g, b' Z# S
for i in x.split("\n"):: E. M3 [2 c4 m, a
x = i.split(":")[0].strip()
3 ?7 ?+ g# H- f5 u$ g y = i.split(":")[1].strip()
5 s6 I' A, V/ C7 D; B& @. J" v orangined_data = [[x,y]]
2 Z6 U0 Y f$ ?/ }7 H df3 = df3.append(orangined_data)
! l; o. C0 e, x, K/ l& Q% B! h# e2 Mdf3.columns = ["名称","英文名称"]' w! c" T! ~1 N( A
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
% b9 j5 Q3 A( p2 G, e1 R' V" o表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
+ E+ c4 z( t' O; B3 O# p& K- S# v
0 D4 r+ ?( i/ }8 x% w! Wdf4 = pd.merge(df1,df3,on="名称",how="left")
/ ^6 I- \" u0 \5 h' vdf4.head(10)2 y' l6 `$ S7 J" l$ y
. j+ D. F3 Z9 Z: Z, _' G/ ]
![]()
+ w) b; g6 _/ Y) m, {$ H- G' u表格df5表示运动项目获奖详情。
. `1 A" B1 P' G7 ~
6 K# l h9 @+ S& i% n
1 q. F' S& I- u0 X " j2 f4 u2 N) O! k0 m9 \# N
7 Y2 F! B; \4 u( G, d |
zan
|