- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40227 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12779
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
目录 G6 M2 F7 { y8 S8 E
0 P/ w1 e0 v, G: q( M- P文章目录
; u) f3 `1 ~% _- b2 D9 w/ X9 n4 C3 p' J0 m% h9 a6 J
前言$ b$ t3 Q) R% r+ A) o! i
/ L' A g! F) w3 Q- `" P3 _, _0 }
一、数据爬取% n; g8 u: _+ q$ o' w4 E
2 x$ U9 P T8 m4 C G
二、数据预处理1 v6 ^( u. f" [/ ?/ S2 n, d/ g
6 z3 g8 Y3 ?/ j7 A# S
前言; z' z! W& Q" B/ G! c& P! z
本文基于requests库爬取的奥运会相关数据,利用pandas库对数据进行处理之后,最后介绍了如何利用pyecharts库制作可视化大屏。
$ {- q! L5 r2 ~; T2 m$ P
" _/ h$ e9 M5 f/ t1 t" P. r U7 h; c
一、数据爬取
6 I# ~" ]0 _4 u1 ^! Qimport requests% a2 _$ a% ]3 z- c. b
import pandas as pd
0 w5 J2 t0 [7 a5 X a, ^: F: Xfrom pprint import pprint! j$ u) t( b; h7 z( U. N* ?
导入相关库: x& J S/ W6 K. S4 w3 k- s
7 n9 i& T: ?/ f& S" V
requests库用于发起网页请求,获取网页中的源代码;
- k6 n+ u5 m9 {7 I a" P
/ V( _" ] n! W9 i4 U% N A; ppandas库用于存储和读取获取到的信息;* F' f5 a2 S6 G7 @) ~# F% ^0 N
" n; h e- ~" V' D0 N
pprint库是漂亮的打印,对于json格式的数据,能够很好的展示结构,方便我们解析;
3 r2 q1 C/ g) }# b6 S1 e; ~
1 J! ^4 |9 A* n# J" \, s' G8 O( Yurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609'
: Y$ B: T' `$ z2 `data1 = requests.get(url).json()
8 M7 z. a* L9 v# pprint(data1)* D/ G C4 d( c: E: {3 p; J
8 T1 |$ @$ A- b9 _7 `
这里利用三行代码就可以获取到网页的源代码,利用pprint库,可以清晰的展示json结构,对于我们解析数据很有帮助。/ b. `1 ^$ P- T, U
df1 = pd.DataFrame()
) L% V) B& j3 s( {9 lfor info in data1['body']['allMedalData']:
6 Y! r' J q4 x/ T name = info['countryName']
1 P6 t U1 D( f f& e- _ name_id = info['countryId']
8 e Q. v/ h0 s( @8 \' j rank = info['rank']$ |" z6 p( @9 d' [8 q) g
gold = info['goldMedalNum']4 H- Q9 O+ k. g" ?: t1 D/ r
silver = info['silverMedalNum']
# |4 n+ n5 x+ Y! k( e1 O) X bronze = info['bronzeMedalNum']2 ~# J, x4 U2 X j: D( A
total = info['totalMedalNum']
% w& \( ~$ ?& _9 B# x, ~, ^9 k) l # 组织数据1 z6 _2 o" i( V: b- r
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
' h; s, m1 d. \7 n$ j3 Z! k # 然后追加df
3 X- H* F/ A# x0 U* H/ n5 Q; p df1 = df1.append(orangized_data)' x5 B) R& D5 ] N
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']9 B2 \9 M+ u& I9 N( m
df1
0 g- w) a j% n- N4 P/ p% c: ^- V: F
![]()
1 b/ ~2 x& x4 v3 f' T2 P h4 b$ ? h这里利用pandas库对爬取的数据进行处理,转变成结构更清楚的数据框结构。
$ y+ n' Y' m( R Iurl = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609'
6 y3 k* i0 H7 F5 S, g* Pdata2 = requests.get(url).json()' N* Z% A M5 e, I5 ^
#pprint(data2)# O$ }6 X3 C3 i: Y5 ]
+ V0 E6 b) C% B0 X& w. A
df2 = pd.DataFrame(); X# ~: N8 I# e& C' f8 ?
for info in data2['body']['medalTableDetail']:
" D, l$ i* r( O9 ^ english_name = info['countryName']
9 c6 e2 p) m' p name_id = info['countryId']% M) L& [6 c1 f) R j" W
award_time = info['awardTime']
V1 D; ]" F5 z( r [+ u item_name = info['bigItemName']
7 n% Y. J5 Z1 B sports_name = info['sportsName']
2 H X* n5 T! i: f8 Z- ~ medal_type = info['medalType']
3 w+ ]& x" F1 ]* h, C # 组织数据0 s! R4 W3 e( t
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]4 G4 k. o. i e
# 然后追加df# s5 i9 T9 p( B3 y
df2 = df2.append(orangized_data)4 `" t6 e+ ]# C( S
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']! j' L1 o& l2 ?1 W: [; `* C3 d( G- K
df2 7 `) c3 c0 \, s6 Y8 X, q- g
$ k5 ]/ e/ A% I8 A对于另外一个网页,我们采取同样的方式对数据进行爬取和处理。 5 h2 u% {1 @; e s! l" ?. O& r3 Y) g
) U0 d: j( W1 H/ M" F
, u3 ^- K2 O. g
二、数据预处理" f4 q' i# a% q( L1 [( \
由于使用pyecharts绘制世界地图时,名称必须是英文的,所以我们需要将这里的中文名称映射为英文名称。 我们要做的就是将它与表格中的数据,做个映射转换。先把它转换为一个Excel文件,方便我们以后直接使用。& X1 [ ~0 A/ E, e5 e3 Z
! W8 X2 \5 u( r' \. h9 U& n; Jwith open("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.txt","r",encoding="utf-8") as f:
; ]& g+ I/ |/ G% o e8 p& X6 ^ x = f.read()
. U# g5 K$ N* {& A+ D7 M1 {& {
) b3 k% R& K5 T+ d" }. W' jdf3 = pd.DataFrame()( h. a# {1 g4 y! h
for i in x.split("\n"):0 U- v; N5 s6 {
x = i.split(":")[0].strip()
4 X( z, {, x8 B8 | y = i.split(":")[1].strip()6 J" G8 b, p" c6 `) O2 a
orangined_data = [[x,y]]
$ r% V3 ^$ Y% o( H2 G df3 = df3.append(orangined_data)
% O# u# @' t6 {& V0 p4 odf3.columns = ["名称","英文名称"]( x; G5 f7 a" H2 q/ {. Y% H
df3.to_excel("D:/和鲸数据/数据可视化大屏!绘制全流程!/国家名中英文对照表.xlsx",index=None)
* o0 _. p! `+ N. h5 i8 U表格df1表示各国奖牌数,表格df3表示国家名中英文对照表,利用上述两张表,我们可以左连接,将英文名称添加到df1表上。
9 i/ g" G1 N* D4 E; v
@; l [5 R _df4 = pd.merge(df1,df3,on="名称",how="left"): y* a$ B& Y0 D
df4.head(10)5 O% }1 \$ Z* H$ |. r6 G
7 N y; h5 c' {+ ~5 W0 @
( y0 W4 U2 U/ J8 I
表格df5表示运动项目获奖详情。 - |" D) R) W, I6 Y9 f7 O* D# Q1 c4 i
4 ?( K; w' |0 \# f, \ V# F( l) a
! e, }6 s3 }7 i% S/ u2 q% l ! `# h+ l2 N2 _ b
* ^* I' p& @! K2 z' q2 ] |
zan
|