- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40216 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12776
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录2 n B2 n2 Z: X+ W4 w& q/ Y
( }: b: `! [& o: ]$ }# l) m文章目录
5 n' k1 Y8 O7 \
) h2 A* g; ^, ]7 Q- M前言5 v, S" j8 e# U$ _% ^. q0 ^7 D7 E" u
5 S% | l9 L' F3 J7 _: R一、数据爬取) q4 w G i* w4 Y1 V, \
8 l& e0 l0 C8 W* S5 n
二、数据预处理
2 ^5 ]' H' p! L( D& ^* U8 f" h6 {/ k
前言! S- b2 a6 [9 b, ]% }. Y. w
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
6 {; ]2 F' F% P U/ {1 q. `0 G2 w; u# G+ v6 Z: S, f2 c
* i7 m4 a. {! c- K) q一、数据爬取4 _# P5 }9 s% N7 x2 U
import requests- v! `1 o" ~7 _+ R) s# C8 z
import pandas as pd ?4 o* ~- ~) _# g. R) c% `9 N/ I" J
from pprint import pprint
; @# h4 u) \: S6 D导入相关库
, @7 B' L8 N) g; f8 Q& l3 `4 p. n- q$ _- C
requests库用于发起网页请求,获取网页中的源代码;0 m5 Q. r" p2 D, p. ^' |7 M* \
% ]! `/ U" o2 A/ N6 B% S- U! _. upandas库用于存储和读取获取到的信息;
; t; }! V! x1 v1 q
9 N( V, P* M7 U/ a3 A6 kpprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;. X8 o: H* f% f, W
1 \3 F( Y7 l, j% v
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'! ?; A) a; ?& v' y5 I' |7 P
data1 = requests.get(url).json()! Y [1 I4 L* M+ @0 z
# pprint(data1)7 j3 q1 P9 m( ^( ^4 ?2 R9 a% I
, u" y' Z4 ^. N' ?% X
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
4 u* V, _2 l/ G8 c4 {+ p3 w5 W qdf1 = pd.DataFrame()
6 t6 f. Q6 O9 X4 b7 y- qfor info in data1['body']['allMedalData']:
# o, U* V1 B+ S: e0 L% q name = info['countryName']3 ^5 O* u( ~8 ~! s R
name_id = info['countryId']6 T5 Y; X# y% H' F/ R( V5 g
rank = info['rank']
+ z g* z- \' y, |& a/ f4 o# j gold = info['goldMedalNum']6 G3 y/ |) S% ?6 R) u0 Z: V
silver = info['silverMedalNum'], O2 ]7 t1 |/ I9 X; Q
bronze = info['bronzeMedalNum']
0 T. @4 w; U) g$ S) E& \7 R total = info['totalMedalNum']
. b% s" P! { A1 [7 ^. j # 组织数据/ v6 Z$ v& }7 U
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
0 Z8 q8 U; I& q& p # 然后追加df
* u. k/ A9 S% l) C, r" } df1 = df1.append(orangized_data) y l I9 a- ~) }
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
2 u- [" X# W- W1 {df1
1 }0 R5 {0 ]% E# j/ x& }$ @. T
+ H$ D! }1 S S 1 J- A6 |2 H/ g" A H4 {! \
这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。+ Y; a. q; I: T( R
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'% N; I1 I; X1 a
data2 = requests.get(url).json()
6 {+ V2 W' Q# }& e/ x- o, z! `# j#pprint(data2)) T8 q1 |+ M" p/ N! `/ D/ v
. {* q7 X2 |/ ]3 P9 I
df2 = pd.DataFrame(): N |/ O- f" ]. A, i
for info in data2['body']['medalTableDetail']:4 E+ K7 c; e# G* G6 P E
english_name = info['countryName']* P( G: u2 c9 N! ^% m- Q
name_id = info['countryId']
( z7 F" n5 s3 F) Z award_time = info['awardTime']
2 a; Y8 f4 U/ J5 ^) j% h6 P o item_name = info['bigItemName']
4 q9 ]) |0 [- w4 e1 a sports_name = info['sportsName']% _' X- v7 i9 N* X; }& N
medal_type = info['medalType']- B- r6 c9 t5 R- b
# 组织数据
) ^7 |) } ?& }" ? orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
% b% ]; t0 T6 [$ [ # 然后追加df
2 w* q4 y J# M df2 = df2.append(orangized_data)% @. B! \4 B; i4 ~; c8 \
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']% f/ o/ v4 z G# H! n$ `5 z
df2 & s6 J3 ~3 x7 n1 \. n% P+ b* ~
# p& i2 K8 w+ s( Q2 R& }对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。
- q% b& T! F! ^7 O# Y Z- w$ \7 n5 L
+ T8 P$ S+ k9 q! v2 x/ l3 ~
二、数据预处理
% v; a5 o1 d* }6 J由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。
1 W; P6 _$ d& H% S1 d* p) u1 \- o" |6 u$ O' F' A% B7 |! h$ h
with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:3 H5 X. _/ g" D2 B0 {
x = f.read()
& m4 J$ \ d/ A* v2 j: @
0 R4 [' f* n2 w) Z- C+ L5 udf3 = pd.DataFrame() u/ a2 L9 x& g c* F9 t
for i in x.split("\n"):
( E- K t- w0 _# l3 f x = i.split(":")[0].strip()$ a1 E8 @$ E" h5 Z Q
y = i.split(":")[1].strip()
, R, X+ i. ?: ^1 [$ _( V8 d: p orangined_data = [[x,y]]
3 p) H6 n {9 K! k; q# x df3 = df3.append(orangined_data)
/ K F. y8 Z& C: Z4 fdf3.columns = ["名称","英文名称"]
6 T' c6 _" _% Y6 O4 d! ddf3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
+ x0 G, Y4 p/ ?# C* _3 ?表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。$ b4 L, T- V) _* Y& d3 G8 B9 K% e/ s6 {0 ?
" X. ]* R b0 `4 D, |/ R8 _3 Idf4 = pd.merge(df1,df3,on="名称",how="left")
) ]% C8 i7 a+ l& Edf4.head(10). _0 J3 r9 {& n2 ^# k% f
! } w' r) B3 k1 Y5 `$ b/ N![]()
: d1 A, j6 t$ a" ?表格df5表示运动项目获奖详情。
# E7 f C) m: K4 V) J I
8 F) ^" N6 \! Q* \" X$ I9 ^
+ L6 {& s _! ]4 k1 J# T ) q0 U% H3 N0 Q0 I
, h, U+ ]/ J! M
|
zan
|