在线时间 514 小时 最后登录 2023-12-1 注册时间 2018-7-17 听众数 15 收听数 0 能力 0 分 体力 40289 点 威望 0 点 阅读权限 255 积分 12798 相册 0 日志 0 记录 0 帖子 1419 主题 1178 精华 0 分享 0 好友 15
TA的每日心情 开心 2023-7-31 10:17
签到天数: 198 天
[LV.7]常住居民III
自我介绍 数学中国浅夏
目录
; o" n. n( D7 m; n2 R; J
& M, y8 V' x9 {6 `6 {; N( ~8 J 文章目录
# r, _ M# `5 M5 y# e
5 [/ g2 a9 {4 s* { 前言
2 a1 s' W$ y2 } `6 R3 B # `7 S: c c/ ^$ @& c' G6 L
一、数据爬取4 E* i1 a ]! ?2 p7 }3 M; Z% V, ^; }% c
i* ~2 X k/ ?1 \ 二、数据预处理1 {1 L% q* ~6 r) O3 F$ e
7 }' a/ e$ P# H6 h" C 前言
5 W: S) M3 J8 \ 本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
) q/ _7 u1 L" C# w5 G ) K5 K/ I Y7 s- X |2 Y( a3 y
) f4 I7 T7 L, e% I! i* O 一、数据爬取. \& M2 V" L, J! \2 o- k
import requests7 `6 K6 R5 u# L- _
import pandas as pd
4 i+ Q! k# q9 @7 K3 p. f from pprint import pprint
7 N/ R- Y1 k/ e6 h, A7 H) N 导入相关库
# n9 d3 T7 j" ~
2 }/ p$ k" E) r2 v+ g9 e) e0 w/ e requests库用于发起网页请求,获取网页中的源代码;
- K2 c( f1 i2 o. F m$ ^' N2 |( F
- _3 R9 `' W; D( I# g, z% t pandas库用于存储和读取获取到的信息;
3 Y. T5 S& P5 N3 u% r! \
2 L0 s. d) L0 B( p. P pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;' N; }, H& f! ^, i d
* W. W( N, A( |9 c4 I
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
1 T4 w# D/ T" Y data1 = requests.get(url).json()
3 x. M" x& G! e' R% K # pprint(data1). I" M" @0 }& I# Y9 j
. D R# L/ L+ u% a6 u( ~ 这里利用三行代码就可以获取到网页的源代码,利用 pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。
2 [+ Y" G- M# ]# |( X( o df1 = pd.DataFrame()0 i8 O2 Z/ ~+ T" V) r
for info in data1['body']['allMedalData']:
. M* \7 e* r- |6 p name = info['countryName']
! i* y3 @ N3 x8 Q1 S; E2 D name_id = info['countryId']
# S' ?; M8 H( E rank = info['rank'], o4 N! E; y Y. n
gold = info['goldMedalNum']
* x5 W2 R5 b4 \7 [5 M4 J silver = info['silverMedalNum']1 ^, y: Z/ z5 [( D
bronze = info['bronzeMedalNum']
8 H4 O; p' W% F8 f `" w* j total = info['totalMedalNum']
9 B8 w+ d7 F: P* u$ z # 组织数据
. I9 j) \7 E' {1 f orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
1 U0 H# T9 ?& \3 o # 然后追加df
4 Z" W w+ j' l, w2 D0 b7 s3 } df1 = df1.append(orangized_data)
+ n2 V9 k4 Q$ i7 Q5 V: A4 Y. S df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
: f/ P" U5 k# L6 u2 b" }! ` df1" R7 P, w) e- t3 t* ?! v' r) l/ t
0 a. j/ Q7 a) l/ V% |; n2 E, w
; `. A- }/ R! n. W4 a2 J+ \' h! g& }8 W 这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。 2 D3 L: Y4 i2 a, T
url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'1 J7 |. U* A# M: k2 Z
data2 = requests.get(url).json()3 w" ~! p5 \" l( J" V8 {
#pprint(data2)" S2 ?# h4 ~( r) z; p' `/ }1 b' c$ N
# T) n' K2 A* w* I6 d7 L( P! h
df2 = pd.DataFrame()
% o- ^8 l! C. V0 Y. d) B$ _ for info in data2['body']['medalTableDetail']:
* ^+ D1 F4 W d, N* z( B english_name = info['countryName']4 J, N( N0 p! f5 [, x
name_id = info['countryId']
8 ]7 d9 A( l: ]& U+ k# T award_time = info['awardTime'] x' n% M6 L1 d) W7 E
item_name = info['bigItemName']' Y+ R8 Q, u' _. _7 |. q' z( a
sports_name = info['sportsName']
, b$ z' c5 z5 {8 X5 K medal_type = info['medalType']
( p8 H5 {7 c T) s* U # 组织数据
( x; J$ V. m9 |7 r orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
' V4 O2 `( ~$ K+ a # 然后追加df: @: l) g+ l, t9 M1 z# ]
df2 = df2.append(orangized_data)1 b0 ^ L& c J" s
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
* o3 H) A! C2 }. i+ _: ~ df25 R$ ?# q. m8 b2 {9 p/ ^
9 D, a) l- l) i5 p- p5 [ 对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 4 A9 M$ @7 e; H9 d5 k( `( D) I1 S ?
0 u$ L. X& Y. R: q) ~* T$ d " k- h6 u i6 u+ S. l5 b- f. m% m
二、数据预处理
' p l# `* j! ^. ~4 _+ n 由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。7 A/ O4 Z$ ?! P1 F7 t
/ N+ k5 K' k8 w9 W with open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:# y( R( O2 g6 B7 q
x = f.read()3 m0 R6 u0 q0 r# _6 a8 H% Z& [$ x& }! Q
! K5 @8 m: K* m4 X df3 = pd.DataFrame()( f# o. @# L% q$ S
for i in x.split("\n"):8 B% x" F2 L3 J% q
x = i.split(":")[0].strip()
- G' ]3 S0 L7 ~3 X6 [ y = i.split(":")[1].strip()' h8 }+ Z P+ h1 {8 B
orangined_data = [[x,y]]! f5 g. \; J S; }3 }
df3 = df3.append(orangined_data)
1 c& m9 s" x8 P7 y" O1 Z6 u df3.columns = ["名称","英文名称"]
# O# o0 ]7 h2 s' r0 Z7 Z; r df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
$ R# @9 M2 k3 e- Q% `) |7 o+ ]/ | 表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。 , o) o& d/ B O
( }2 t0 `* b; d df4 = pd.merge(df1,df3,on="名称",how="left")
+ Y8 S4 @/ n" ?/ [1 Z df4.head(10)7 g, B3 c2 J- T) P: v, z4 e
9 d3 p% V, t) O1 H) @( u ! M, I1 j8 b6 f
表格df5表示运动项目获奖详情。
0 P$ C3 X' N+ _1 ]) ]- r* C4 E
6 T6 N' i1 s# i& d5 t5 I1 w
1 c3 T5 x! T. c4 J. Y$ M$ C / g' G+ A6 v$ I& A: v
; n" M& X' r, D% Y8 I, a
zan