摘要:
随着互联网技术的发展,人们的日常生活已经离不开大数据。未来社会人们的生活和工作将越来越依赖于数字技术的发展,越来越数字化、网络化、数据可使化、服务虚拟化。大数据的发展历程以及目前的应用状况和发展趋势,可以充分地相信数据分析将极大的改变我们的生活和工作方式,甚至社会的价值观也会发生某种变化。
本设计尝试用Python对世界气象组织的海洋观测数据进行处理,以便世界气象组织志愿观测船计划顺利实施。本文从理论和实践两个角度出发,对一段数据进行处理与可视化分析。论文首先较为详尽地介绍了Python对大数据处理与数据可视化的有关概念与技术,特别深入介绍了在本设计中运用到的知识,如:数据分割、产生随机数、函数的调用等;接着对数据的可行性进行了分析,对设计的设计思想、设计目标与系统的整体结构进行了明确的规划。
本设计是在Python3.7 平台上来实现的,用到的插件有matplotlib、pandas等。其中matplotlib用来进行绘制二维折线图和柱状图,pandas用来对大量数据进行存储和排序等操作。
关键词:Python,大数据,数据可视化
一、课程设计的目的与要求
通过该课程设计的实践训练,进一步掌握Python的语法和编程技术,提高项目设计的实际能力,培养工程设计能力和综合分析、解决问题的能力。
具体如下:
二、设计正文
1. 概述
1.1课题题目:Python数据处理
1.2设计的主要目标:
本设计目标是实现课程题目中所要求的各种功能,能够很好的实现对数据的可视化,直观明了的把大量数据呈现在眼前,还可以实现对所需数据的保存和管理,对出现异常的数据进行常规的处理等功能。
1.3 系统的开发环境及运行环境:
操作系统: Windows 10
开发工具: Python 3.7.1
数据可视化工具:matplotlib
数据处理工具: pandas
2. 系统需求分析
数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。这一过程也是质量管理体系的支持过程。在实用中,数据分析可帮助人们作出判断,以便采取适当行动。数据分析的数学基础在20世纪早期就已确立,但直到计算机的出现才使得实际操作成为可能,并使得数据分析得以推广。数据分析是数学与计算机科学相结合的产物。
VOS是由世界气象组织的一个志愿观测船计划,通过向全球招募志愿船提供连续时间序列的海洋观测数据,因此该数据中包含有时间、经纬度、船名、以及该时刻位置处的气象信息,用于模拟海洋气象变化。该设计能把数据通过图表的方式直观的展示出来。
读取该数据,并拆分出不同属性信息(数据说明见表1),形成列表、元组、字典或集合,再利用Matplotlib库实现船舶信息的可视化。
表1 VOS轨迹数据每行数据组成
序号. |
长度. |
全称 |
最小值. |
最大值 |
单位 |
1 |
4 |
年 |
1600 |
2024 |
(AAAA) |
2 |
2 |
月 |
1 |
12 |
(MM) |
3 |
2 |
日 |
1 |
31 |
(YY) |
4 |
4 |
时 |
0 |
23.99 |
0.01 hour |
5 |
5 |
纬度 |
–90.00 |
90.00 |
0.01°N |
6 |
6 |
经度 |
–179.99 |
359.99 |
0.01°E |
7 |
2 |
IMMA数据版本 |
0 |
99 |
(Δ•65) |
8 |
1 |
attm数量 |
0 |
9 |
|
9 |
1 |
时间指示 |
0 |
3 |
|
10 |
1 |
位置指示 |
0 |
6 |
|
11 |
1 |
航向 |
0 |
9 |
(Ds) |
12 |
1 |
航速 |
0 |
9 |
(Δvs) |
13 |
2 |
国家编号 |
0 |
99 |
|
14 |
2 |
船名指示 |
0 |
10 |
|
15 |
9 |
船名 |
c |
c |
(Δ•42) |
16 |
2 |
国家 |
b |
b |
(Δ•43) |
2.1 对数据的操作流程如图2-1所示。
3 系统总体设计
3.1 文件读取。Python编码实现对表1中黄色背景字段的读取,并存入Python序列或Numpy、Pandas;DataProcessing函数对数据进行处理
源码如下:
#打开文件
x = open(‘VOSClim_GTS_nov_2018.txt‘)
def DataProcessing(f):
year = []#年
mouth = []#月
day = []#日
hour = []#时
latitude = []#纬度
longitude = []#经度
name = []#船名
#一行一行读取数据
while True:
tmpText = f.readline()
if not tmpText:
图2-1 实验数据操作
break
#删除每一行末尾的回车符
tmpText = tmpText.strip(‘\n‘)
#从数据中取出“年”并删除空格
year.append(int(tmpText[0:4].strip()))
#从数据中取出“月”并删除空格
mouth.append(int(tmpText[4:6].strip()))
#处理日,对异常的数据置为0
try:
day.append(int(tmpText[6:8].strip()))
except:
day.append(0)
#处理时,数据异常则设置为最小值0
try:
hour.append(float(tmpText[8:10].strip())+float(‘0.‘+tmpText[10:12].strip()))
except:
hour.append(0)
#处理纬度,数据异常则设置为0.00,数据处理为正负数浮点型
try:
if int(tmpText[12:15].strip()) < 0:
latitude.append(float(tmpText[12:15].strip())-float(‘0.‘+tmpText[15:17].strip()))
else:
latitude.append(float(tmpText[12:15].strip())+float(‘0.‘+tmpText[15:17].strip()))
except:
latitude.append(0.00)
#处理经度,数据异常则设置为90,经度原始数据范围为0-360,为方便处理,按照标准东西经度表示,则原始数据减去180
#数据处理为正负数浮点型
try:
if int(tmpText[17:21].strip()) < 0:
longitude.append((float(tmpText[17:21].strip())-float(‘0.‘+ tmpText[21:23].strip()))-180.0)
else:
longitude.append((float(tmpText[17:21].strip())+float(‘0.‘+ tmpText[21:23].strip()))-180.0)
except:
longitude.append(90)
#处理船名,数据异常则设置为c0000
try:
name.append(tmpText[34:43].strip())
except:
name.append("c0000")
#数据分割并保存到pandas
year = pd.Series(year)
mouth = pd.Series(mouth)
day = pd.Series(day)
hour = pd.Series(hour)
latitude = pd.Series(latitude)
longitude = pd.Series(longitude)
name = pd.Series(name)
vosData = pd.DataFrame({‘年‘:year,‘月‘:mouth,‘日‘:day,‘时‘:hour,‘纬度‘:latitude,‘经度‘:longitude,‘船名‘:name})
return(vosData)
在main函数中调用该函数,并执行print(vosData),结果如图2-2所示,从而把需要的数据中分离出来。
图2- 2 数据信息
3.2 轨迹显示。Python编码实现任2条船舶的轨迹显示,即按时间顺序连接成折线图。(用经度作为横坐标,纬度作为纵坐标);调用First函数。
源码如下:
#随机生成两条船的轨迹在图中显示出来
def First(vosData):
vosData = vosData.sort_values(by=["船名","年","月","日","时"])
A=random.choice([‘2AKI2‘, ‘2AKI3‘, ‘2AKI4‘, ‘2ARS4‘, ‘2FGX5‘, ‘2HCH5‘,‘2HFZ6‘, ‘2HFZ7‘, ‘2HHG5‘, ‘2ICH7‘, ‘C6YR6‘, ‘VRPJ7‘, ‘VRYO3‘, ‘WDG75‘, ‘ZCDN2‘, ‘ZDLS1‘, ‘WDG75‘, ‘VRFO7‘, ‘VRDW2‘, ‘TCMO2‘, ‘MAQK9‘, ‘J8PE3‘, ‘DFGN2‘])
B=random.choice([‘2AKI2‘, ‘2AKI3‘, ‘2AKI4‘, ‘2ARS4‘, ‘2FGX5‘, ‘2HCH5‘,‘2HFZ6‘, ‘2HFZ7‘, ‘2HHG5‘, ‘2ICH7‘, ‘C6YR6‘, ‘VRPJ7‘, ‘VRYO3‘, ‘WDG75‘, ‘ZCDN2‘, ‘ZDLS1‘, ‘WDG75‘, ‘VRFO7‘, ‘VRDW2‘, ‘TCMO2‘, ‘MAQK9‘, ‘J8PE3‘, ‘DFGN2‘])
ax = vosData[vosData["船名"] == A].plot(x="经度",y="纬度",color="deepskyblue",label= A )
vosData[vosData["船名"] == B ].plot(ax=ax,x="经度",y="纬度",color="deeppink",label= B )
plt.title("随机选取 "+A+" "+B+" 两条船的航行轨迹")
plt.xlabel("经度")
plt.ylabel("纬度")
plt.show()
随机生成两条船的轨迹显示,其显示结果如图2-3所示。
图2- 4 随机生成两条船的轨迹显示
3.3 时序统计。Python编码实现不同时段轨迹点数的统计,用折线图展示出来,时段划分设定为了每1个小时为一个时段;调用Second函数。
源码如下:
def Second(vosData):
#时段划分0-1,2-3,4-11,12-15,16-19,20-23
h1 = vosData[(vosData["时"] >= 0) &
(vosData["时"] < 1)].shape[0]
h2 = vosData[(vosData["时"] >= 1) &
(vosData["时"] < 2)].shape[0]
h3 = vosData[(vosData["时"] >= 2) &
(vosData["时"] < 3)].shape[0]
h4 = vosData[(vosData["时"] >= 3) &
(vosData["时"] < 4)].shape[0]
h5 = vosData[(vosData["时"] >= 4) &
(vosData["时"] < 5)].shape[0]
h6 = vosData[(vosData["时"] >= 5) &
(vosData["时"] < 6)].shape[0]
h7 = vosData[(vosData["时"] >= 6) &
(vosData["时"] < 7)].shape[0]
h8 = vosData[(vosData["时"] >= 7) &
(vosData["时"] < 8)].shape[0]
h9 = vosData[(vosData["时"] >= 8) &
(vosData["时"] < 9)].shape[0]
h10 = vosData[(vosData["时"] >= 9) &
(vosData["时"] < 10)].shape[0]
h11 = vosData[(vosData["时"] >= 10) &
(vosData["时"] < 11)].shape[0]
h12 = vosData[(vosData["时"] >= 11) &
(vosData["时"] < 12)].shape[0]
h13 = vosData[(vosData["时"] >= 12) &
(vosData["时"] < 13)].shape[0]
h14 = vosData[(vosData["时"] >= 13) &
(vosData["时"] < 14)].shape[0]
h15 = vosData[(vosData["时"] >= 14) &
(vosData["时"] < 15)].shape[0]
h16 = vosData[(vosData["时"] >= 15) &
(vosData["时"] < 16)].shape[0]
h17 = vosData[(vosData["时"] >= 16) &
(vosData["时"] < 17)].shape[0]
h18 = vosData[(vosData["时"] >= 17) &
(vosData["时"] < 18)].shape[0]
h19 = vosData[(vosData["时"] >= 18) &
(vosData["时"] < 19)].shape[0]
h20 = vosData[(vosData["时"] >= 19) &
(vosData["时"] < 20)].shape[0]
h21 = vosData[(vosData["时"] >= 20) &
(vosData["时"] < 21)].shape[0]
h22 = vosData[(vosData["时"] >= 21) &
(vosData["时"] < 22)].shape[0]
h23 = vosData[(vosData["时"] >= 22) &
(vosData["时"] < 23)].shape[0]
h24 = vosData[(vosData["时"] >= 23) &
(vosData["时"] < 24)].shape[0]
vosData=(h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13,h14,h15,h16,h17,h18,h19,h20,h21,h22,h23,h24)
plt.plot(vosData,color= "deeppink" )
plt.xticks(np.arange(24), (‘0-1‘, ‘1-2‘, ‘2-3‘, ‘3-4‘, ‘4-5‘, ‘5-6‘,‘6-7‘, ‘7-8‘, ‘8-9‘, ‘9-10‘, ‘10-11‘, ‘11-12‘, ‘12-13‘, ‘13-14‘, ‘15-16‘, ‘16-17‘, ‘17-18‘,‘18-19‘, ‘19-20‘, ‘20-21‘, ‘21-22‘, ‘22-23‘, ‘23-24‘, ‘24-0‘))
plt.title("不同时段轨迹点数统计")
plt.xlabel("不同时段")
plt.ylabel("通过次数")
plt.show()
不同时段轨迹点数的统计如图2-4所示。
图2- 4 不同时段轨迹点数统计
3.4 区域统计。Python编码实现不同经纬度区域轨迹点数统计,用直方图展示出来。区域的划分参照了国际标准时区的划分;调用Third函数。
源码如下:
def Third(vosData):
T1 = vosData[(vosData["经度"] >= -7.5) &
(vosData["经度"] < 7.5)].shape[0]
T2 = vosData[(vosData["经度"] >= 7.5) &
(vosData["经度"] < 22.5)].shape[0]
T3 = vosData[(vosData["经度"] >= 22.5) &
(vosData["经度"] < 37.5)].shape[0]
T4 = vosData[(vosData["经度"] >= 37.5) &
(vosData["经度"] < 52.5)].shape[0]
T5 = vosData[(vosData["经度"] >= 52.5) &
(vosData["经度"] < 67.5)].shape[0]
T6 = vosData[(vosData["经度"] >= 67.5) &
(vosData["经度"] < 82.5)].shape[0]
T7 = vosData[(vosData["经度"] >= 82.5) &
(vosData["经度"] < 97.5)].shape[0]
T8 = vosData[(vosData["经度"] >= 97.5) &
(vosData["经度"] < 112.5)].shape[0]
T9 = vosData[(vosData["经度"] >= 112.5) &
(vosData["经度"] < 127.5)].shape[0]
T10 = vosData[(vosData["经度"] >= 127.5) &
(vosData["经度"] < 142.5)].shape[0]
T11 = vosData[(vosData["经度"] >= 142.5) &
(vosData["经度"] < 157.5)].shape[0]
T12 = vosData[(vosData["经度"] >= 157.5) &
(vosData["经度"] < 172.5)].shape[0]
T13 = vosData[(vosData["经度"] >= 172.5) &
(vosData["经度"] < 180)].shape[0]
T13 += vosData[(vosData["经度"] > -180) &
(vosData["经度"] <= -172.5)].shape[0]
T14 = vosData[(vosData["经度"] >= -172.5) &
(vosData["经度"] < -157.5)].shape[0]
T15 = vosData[(vosData["经度"] >= -157.5) &
(vosData["经度"] < -142.5)].shape[0]
T16 = vosData[(vosData["经度"] >= -142.5) &
(vosData["经度"] < -127.5)].shape[0]
T17 = vosData[(vosData["经度"] >= -127.5) &
(vosData["经度"] < -112.5)].shape[0]
T18 = vosData[(vosData["经度"] >= -112.5) &
(vosData["经度"] < -97.5)].shape[0]
T19 = vosData[(vosData["经度"] >= -97.5) &
(vosData["经度"] < -82.5)].shape[0]
T20 = vosData[(vosData["经度"] >= -82.5) &
(vosData["经度"] < -67.5)].shape[0]
T21 = vosData[(vosData["经度"] >= -67.5) &
(vosData["经度"] < -52.5)].shape[0]
T22 = vosData[(vosData["经度"] >= -52.5) &
(vosData["经度"] < -37.5)].shape[0]
T23 = vosData[(vosData["经度"] >= -37.5) &
(vosData["经度"] < -22.5)].shape[0]
T24 = vosData[(vosData["经度"] >= -22.5) &
(vosData["经度"] < -7.5)].shape[0]
vosData=(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24)
plt.barh(range(24),vosData,height=0.7,color=(A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,A1,B1,C1,D1,E1), alpha=0.8)
plt.yticks(np.arange(24), (‘UTC‘, ‘UTC+1‘, ‘UTC+2‘, ‘UTC+3‘, ‘UTC+4‘, ‘UTC+5‘, ‘UTC+6‘, ‘UTC+7‘, ‘UTC+8‘, ‘UTC+9‘, ‘UTC+10‘, ‘UTC+11‘, ‘UTC±12‘, ‘UTC-11‘,‘UTC-10‘, ‘UTC-9‘, ‘UTC-8‘, ‘UTC-7‘, ‘UTC-6‘, ‘UTC-5‘, ‘UTC-4‘, ‘UTC-3‘, ‘UTC-2‘, ‘UTC-1‘))
plt.title("不同经纬度区域轨迹点数统计(通过时区划分)")
plt.ylabel("各个时区")
plt.xlabel("通过次数")
plt.show()
不同经纬度区域轨迹点数统计(通过时区划分)如图2-5所示,直方图采用横向式让理解更加方便,直方图颜色采用了随机颜色生成,每次运行产生的颜色都会不一样。
图2- 5 不同经纬度区域轨迹点数统计(通过时区划分)
3.5 按船统计。Python编码按船名随机统计十条船的轨迹数量,用直方图展示出来,在直方图顶显示出该直方图的数据,直方图颜色随机生成;调用Fourth函数。
源码如下:
def Fourth(vosData):
vosData = vosData.sort_values(by=["船名"])
#从数据中随机选取10条船分别为s1-D\s2-C\s3-E\s4-F\s5-G\s6-H\s7-I\s8-J\s9-K\s10-M,并进行轨迹数量统计
A=[‘2AKI2‘, ‘2AKI3‘, ‘2AKI4‘, ‘2ARS4‘, ‘2FGX5‘, ‘2HCH5‘,‘2HFZ6‘, ‘2HFZ7‘, ‘2HHG5‘, ‘2ICH7‘, ‘C6YR6‘, ‘CG302‘, ‘VRPJ7‘, ‘VRYO3‘, ‘WDG75‘, ‘ZCDN2‘, ‘ZDLS1‘, ‘WDG75‘, ‘WDC66‘, ‘VRFO7‘, ‘VRDW2‘, ‘TCMO2‘, ‘MAQK9‘, ‘J8PE3‘, ‘DFGN2‘]
D=random.choice(A)
E=random.choice(A)
F=random.choice(A)
G=random.choice(A)
H=random.choice(A)
I=random.choice(A)
J=random.choice(A)
K=random.choice(A)
L=random.choice(A)
M=random.choice(A)
s1 = vosData[vosData["船名"] == D].shape[0]
s2 = vosData[vosData["船名"] == E].shape[0]
s3 = vosData[vosData["船名"] == F].shape[0]
s4 = vosData[vosData["船名"] == G].shape[0]
s5 = vosData[vosData["船名"] == H].shape[0]
s6 = vosData[vosData["船名"] == I].shape[0]
s7 = vosData[vosData["船名"] == J].shape[0]
s8 = vosData[vosData["船名"] == K].shape[0]
s9 = vosData[vosData["船名"] == L].shape[0]
s10 = vosData[vosData["船名"] == M].shape[0]
vosData = (s1,s2,s3,s4,s5,s6,s7,s8,s9,s10)
#柱状图颜色随机产生
rects=plt.bar(range(10),vosData,color=(A1,B1,C1,D1,E1,F1,G1,H1,I1,J1))
plt.xticks(np.arange(10),(D,E,F,G,H,I,J,K,L,M))
plt.title("随机选取十条船在不同经纬度区域轨迹点数统计")
plt.xlabel("船名")
plt.ylabel("通过次数")
#柱状图顶端显示数据
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height, str(height), ha=‘center‘, va=‘bottom‘)
plt.show()
随机选取十条船在不同经纬度区域轨迹点数统计如图2-6所示。
图2- 6随机选取十条船在不同经纬度区域轨迹点数统计
3.6 头文件和main函数的构
头文件源码如下:
import random #引入随机函数
import numpy as np #引入numy
import pandas as pd #引入pandas
import matplotlib.pyplot as plt #引入matplotlib画图插件
plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] #设置在matplotlib上的中文字体
plt.rcParams[‘axes.unicode_minus‘] = False #在matplotlib绘图正常显示符号
main函数源码如下:
if __name__ == ‘__main__‘:
#打开文件
x = open(‘VOSClim_GTS_nov_2018.txt‘)
vosData = DataProcessing(x)
#打印数据信息
print(vosData)
#调用函数绘图
First(vosData)
Second(vosData)
Third(vosData)
Fourth(vosData)
#关闭文件
x.close()
三、课程设计总结或结论
1. 通过这次Python课程设计的实践训练,进一步掌握Python编程的方法和技术,提高Python编程的实际能力,培养Python设计能力和综合分析、解决问题的能力。
1.1 学习和实践分析、设计Python编程的各种知识,包括面向对象的数据分析与设计,编码和测试方面的知识。
1.2 熟悉较为新颖的数据可视化工具matplotlib,并将其运用于课程设计的全过程;
1.3 进一步加强和提高Python项目工程文档的编写能力;
1.4 培养了查阅资料和参看文献解决问题的能力。
2. 本设计基本实现了要求的功能,在功能上基本满足了用户的需求,但是由于时间较紧,有些模块以及整个系统还有许多不完善的地方,比如在处理异常数据方面做得还不到位,导致某些异常数据直接被抛出,影响最终结果。
四、参考文献
[1] 董付国.Python程序设计基础[M].北京:清华大学出版社,2015
[2] 杨颖,赖勇浩.改善Pythond 91个建议[M].北京:机械工业出版社,2014
[3] 张若愚.Python科学计算[M]. 北京:人民邮电出版社,2012
[4] Wes Mckinney著.机器学习实战.北京:机械工业出版社,2014
import random import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] #设置在matplotlib上的中文字体 plt.rcParams[‘axes.unicode_minus‘] = False #在matplotlib绘图正常显示符号 #随机颜色 N=[‘black‘, ‘darkorange‘, ‘orange‘, ‘lightcoral‘, ‘red‘,‘khaki‘, ‘aqua‘, ‘g‘, ‘navy‘, ‘yellow‘, ‘gold‘, ‘lime‘, ‘green‘, ‘cyan‘, ‘deepskyblue‘, ‘dodgerblue‘, ‘deeppink‘, ‘purple‘, ‘b‘, ‘indigo‘, ‘pink‘, ‘indigo‘] A1=random.choice(N);B1=random.choice(N);C1=random.choice(N); D1=random.choice(N);E1=random.choice(N);F1=random.choice(N) G1=random.choice(N);H1=random.choice(N);I1=random.choice(N); J1=random.choice(N) #随机生成两条船的轨迹在图中显示出来 def First(vosData): vosData = vosData.sort_values(by=["船名","年","月","日","时"]) A=random.choice([‘2AKI2‘, ‘2AKI3‘, ‘2AKI4‘, ‘2ARS4‘, ‘2FGX5‘, ‘2HCH5‘,‘2HFZ6‘, ‘2HFZ7‘, ‘2HHG5‘, ‘2ICH7‘, ‘C6YR6‘, ‘VRPJ7‘, ‘VRYO3‘, ‘WDG75‘, ‘ZCDN2‘, ‘ZDLS1‘, ‘WDG75‘, ‘VRFO7‘, ‘VRDW2‘, ‘TCMO2‘, ‘MAQK9‘, ‘J8PE3‘, ‘DFGN2‘]) B=random.choice([‘2AKI2‘, ‘2AKI3‘, ‘2AKI4‘, ‘2ARS4‘, ‘2FGX5‘, ‘2HCH5‘,‘2HFZ6‘, ‘2HFZ7‘, ‘2HHG5‘, ‘2ICH7‘, ‘C6YR6‘, ‘VRPJ7‘, ‘VRYO3‘, ‘WDG75‘, ‘ZCDN2‘, ‘ZDLS1‘, ‘WDG75‘, ‘VRFO7‘, ‘VRDW2‘, ‘TCMO2‘, ‘MAQK9‘, ‘J8PE3‘, ‘DFGN2‘]) ax = vosData[vosData["船名"] == A].plot(x="经度",y="纬度",color="deepskyblue",label= A ) vosData[vosData["船名"] == B ].plot(ax=ax,x="经度",y="纬度",color="deeppink",label= B ) plt.title("随机选取 "+A+" "+B+" 两条船的航行轨迹") plt.xlabel("经度") plt.ylabel("纬度") plt.show() #不同时段船的轨迹点数统计 def Second(vosData): #时段划分0-1,2-3,4-11,12-15,16-19,20-23 h1 = vosData[(vosData["时"] >= 0) & (vosData["时"] < 1)].shape[0] h2 = vosData[(vosData["时"] >= 1) & (vosData["时"] < 2)].shape[0] h3 = vosData[(vosData["时"] >= 2) & (vosData["时"] < 3)].shape[0] h4 = vosData[(vosData["时"] >= 3) & (vosData["时"] < 4)].shape[0] h5 = vosData[(vosData["时"] >= 4) & (vosData["时"] < 5)].shape[0] h6 = vosData[(vosData["时"] >= 5) & (vosData["时"] < 6)].shape[0] h7 = vosData[(vosData["时"] >= 6) & (vosData["时"] < 7)].shape[0] h8 = vosData[(vosData["时"] >= 7) & (vosData["时"] < 8)].shape[0] h9 = vosData[(vosData["时"] >= 8) & (vosData["时"] < 9)].shape[0] h10 = vosData[(vosData["时"] >= 9) & (vosData["时"] < 10)].shape[0] h11 = vosData[(vosData["时"] >= 10) & (vosData["时"] < 11)].shape[0] h12 = vosData[(vosData["时"] >= 11) & (vosData["时"] < 12)].shape[0] h13 = vosData[(vosData["时"] >= 12) & (vosData["时"] < 13)].shape[0] h14 = vosData[(vosData["时"] >= 13) & (vosData["时"] < 14)].shape[0] h15 = vosData[(vosData["时"] >= 14) & (vosData["时"] < 15)].shape[0] h16 = vosData[(vosData["时"] >= 15) & (vosData["时"] < 16)].shape[0] h17 = vosData[(vosData["时"] >= 16) & (vosData["时"] < 17)].shape[0] h18 = vosData[(vosData["时"] >= 17) & (vosData["时"] < 18)].shape[0] h19 = vosData[(vosData["时"] >= 18) & (vosData["时"] < 19)].shape[0] h20 = vosData[(vosData["时"] >= 19) & (vosData["时"] < 20)].shape[0] h21 = vosData[(vosData["时"] >= 20) & (vosData["时"] < 21)].shape[0] h22 = vosData[(vosData["时"] >= 21) & (vosData["时"] < 22)].shape[0] h23 = vosData[(vosData["时"] >= 22) & (vosData["时"] < 23)].shape[0] h24 = vosData[(vosData["时"] >= 23) & (vosData["时"] < 24)].shape[0] vosData = (h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13,h14,h15,h16,h17,h18,h19,h20,h21,h22,h23,h24) plt.plot(vosData,color= "deeppink" ) plt.xticks(np.arange(24), (‘0-1‘, ‘1-2‘, ‘2-3‘, ‘3-4‘, ‘4-5‘, ‘5-6‘,‘6-7‘, ‘7-8‘, ‘8-9‘, ‘9-10‘, ‘10-11‘, ‘11-12‘, ‘12-13‘, ‘13-14‘, ‘15-16‘, ‘16-17‘, ‘17-18‘,‘18-19‘, ‘19-20‘, ‘20-21‘, ‘21-22‘, ‘22-23‘, ‘23-24‘, ‘24-0‘)) plt.title("不同时段轨迹点数统计") plt.xlabel("不同时段") plt.ylabel("通过次数") plt.show() #区域的划分(参照了国际标准时区的划分) def Third(vosData): T1 = vosData[(vosData["经度"] >= -7.5) & (vosData["经度"] < 7.5)].shape[0] T2 = vosData[(vosData["经度"] >= 7.5) & (vosData["经度"] < 22.5)].shape[0] T3 = vosData[(vosData["经度"] >= 22.5) & (vosData["经度"] < 37.5)].shape[0] T4 = vosData[(vosData["经度"] >= 37.5) & (vosData["经度"] < 52.5)].shape[0] T5 = vosData[(vosData["经度"] >= 52.5) & (vosData["经度"] < 67.5)].shape[0] T6 = vosData[(vosData["经度"] >= 67.5) & (vosData["经度"] < 82.5)].shape[0] T7 = vosData[(vosData["经度"] >= 82.5) & (vosData["经度"] < 97.5)].shape[0] T8 = vosData[(vosData["经度"] >= 97.5) & (vosData["经度"] < 112.5)].shape[0] T9 = vosData[(vosData["经度"] >= 112.5) & (vosData["经度"] < 127.5)].shape[0] T10 = vosData[(vosData["经度"] >= 127.5) & (vosData["经度"] < 142.5)].shape[0] T11 = vosData[(vosData["经度"] >= 142.5) & (vosData["经度"] < 157.5)].shape[0] T12 = vosData[(vosData["经度"] >= 157.5) & (vosData["经度"] < 172.5)].shape[0] T13 = vosData[(vosData["经度"] >= 172.5) & (vosData["经度"] < 180)].shape[0] T13 += vosData[(vosData["经度"] > -180) & (vosData["经度"] <= -172.5)].shape[0] T14 = vosData[(vosData["经度"] >= -172.5) & (vosData["经度"] < -157.5)].shape[0] T15 = vosData[(vosData["经度"] >= -157.5) & (vosData["经度"] < -142.5)].shape[0] T16 = vosData[(vosData["经度"] >= -142.5) & (vosData["经度"] < -127.5)].shape[0] T17 = vosData[(vosData["经度"] >= -127.5) & (vosData["经度"] < -112.5)].shape[0] T18 = vosData[(vosData["经度"] >= -112.5) & (vosData["经度"] < -97.5)].shape[0] T19 = vosData[(vosData["经度"] >= -97.5) & (vosData["经度"] < -82.5)].shape[0] T20 = vosData[(vosData["经度"] >= -82.5) & (vosData["经度"] < -67.5)].shape[0] T21 = vosData[(vosData["经度"] >= -67.5) & (vosData["经度"] < -52.5)].shape[0] T22 = vosData[(vosData["经度"] >= -52.5) & (vosData["经度"] < -37.5)].shape[0] T23 = vosData[(vosData["经度"] >= -37.5) & (vosData["经度"] < -22.5)].shape[0] T24 = vosData[(vosData["经度"] >= -22.5) & (vosData["经度"] < -7.5)].shape[0] vosData = (T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12, T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24) plt.barh(range(24), vosData, height=0.7, color=(A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,A1,B1,C1, D1,E1,F1,G1,H1,I1,J1,A1,B1,C1,D1,E1), alpha=0.8) plt.yticks(np.arange(24), (‘UTC‘, ‘UTC+1‘, ‘UTC+2‘, ‘UTC+3‘, ‘UTC+4‘, ‘UTC+5‘, ‘UTC+6‘, ‘UTC+7‘, ‘UTC+8‘, ‘UTC+9‘, ‘UTC+10‘, ‘UTC+11‘, ‘UTC±12‘, ‘UTC-11‘,‘UTC-10‘, ‘UTC-9‘, ‘UTC-8‘, ‘UTC-7‘, ‘UTC-6‘, ‘UTC-5‘, ‘UTC-4‘, ‘UTC-3‘, ‘UTC-2‘, ‘UTC-1‘)) plt.title("不同经纬度区域轨迹点数统计(通过时区划分)") plt.ylabel("各个时区") plt.xlabel("通过次数") plt.show() #随机选取10条船在不同经纬度区域轨迹点数统计 def Fourth(vosData): vosData = vosData.sort_values(by=["船名"]) #从数据中随机选取10条船分别为s1-D\s2-C\s3-E\s4-F\s5-G\s6-H\s7-I\s8-J\s9-K\s10-M,并进行轨迹数量统计 A=[‘2AKI2‘, ‘2AKI3‘, ‘2AKI4‘, ‘2ARS4‘, ‘2FGX5‘, ‘2HCH5‘,‘2HFZ6‘, ‘2HFZ7‘, ‘2HHG5‘, ‘2ICH7‘, ‘C6YR6‘, ‘CG302‘, ‘VRPJ7‘, ‘VRYO3‘, ‘WDG75‘, ‘ZCDN2‘, ‘ZDLS1‘, ‘WDG75‘, ‘WDC66‘, ‘VRFO7‘, ‘VRDW2‘, ‘TCMO2‘, ‘MAQK9‘, ‘J8PE3‘, ‘DFGN2‘] D=random.choice(A) E=random.choice(A) F=random.choice(A) G=random.choice(A) H=random.choice(A) I=random.choice(A) J=random.choice(A) K=random.choice(A) L=random.choice(A) M=random.choice(A) s1 = vosData[vosData["船名"] == D].shape[0] s2 = vosData[vosData["船名"] == E].shape[0] s3 = vosData[vosData["船名"] == F].shape[0] s4 = vosData[vosData["船名"] == G].shape[0] s5 = vosData[vosData["船名"] == H].shape[0] s6 = vosData[vosData["船名"] == I].shape[0] s7 = vosData[vosData["船名"] == J].shape[0] s8 = vosData[vosData["船名"] == K].shape[0] s9 = vosData[vosData["船名"] == L].shape[0] s10 = vosData[vosData["船名"] == M].shape[0] vosData = (s1,s2,s3,s4,s5,s6,s7,s8,s9,s10) rects=plt.bar(range(10),vosData,color=(A1,B1,C1,D1,E1,F1,G1,H1,I1,J1)) plt.xticks(np.arange(10),(D,E,F,G,H,I,J,K,L,M)) plt.title("随机选取十条船在不同经纬度区域轨迹点数统计") plt.xlabel("船名") plt.ylabel("通过次数") for rect in rects: height = rect.get_height() plt.text(rect.get_x() + rect.get_width() / 2, height, str(height), ha=‘center‘, va=‘bottom‘) plt.show() #处理数据(对异常数据进行处理) def DataProcessing(x): year = []#年 mouth = []#月 day = []#日 hour = []#时 latitude = []#纬度 longitude = []#经度 name = []#船名 #一行一行读取数据 while True: tmpText = x.readline() if not tmpText: break #删除每一行末尾的回车符 tmpText = tmpText.strip(‘\n‘) #从数据中取出“年”并删除空格 year.append(int(tmpText[0:4].strip())) #从数据中取出“月”并删除空格 mouth.append(int(tmpText[4:6].strip())) #处理日,对异常的数据置为0 try: day.append(int(tmpText[6:8].strip())) except: day.append(0) #处理时,数据异常则设置为最小值0 try: hour.append(float(tmpText[8:10].strip()) + float(‘0.‘ + tmpText[10:12].strip())) except: hour.append(0) #处理纬度,数据异常则设置为0.00,数据处理为正负数浮点型 try: if int(tmpText[12:15].strip()) < 0: latitude.append(float(tmpText[12:15].strip()) - float(‘0.‘ + tmpText[15:17].strip())) else: latitude.append(float(tmpText[12:15].strip()) + float(‘0.‘ + tmpText[15:17].strip())) except: latitude.append(0.00) #处理经度,数据异常则设置为90,经度原始数据范围为0-360,为方便处理,按照标准东西经度表示,则原始数据减去180 #数据处理为正负数浮点型 try: if int(tmpText[17:21].strip()) < 0: longitude.append((float(tmpText[17:21].strip()) - float(‘0.‘ + tmpText[21:23].strip()))-180.0) else: longitude.append((float(tmpText[17:21].strip()) + float(‘0.‘ + tmpText[21:23].strip()))-180.0) except: longitude.append(90) #处理船名,数据异常则设置为c0000 try: name.append(tmpText[34:43].strip()) except: name.append("c0000") #数据分割并保存到pandas year = pd.Series(year) mouth = pd.Series(mouth) day = pd.Series(day) hour = pd.Series(hour) latitude = pd.Series(latitude) longitude = pd.Series(longitude) name = pd.Series(name) vosData = pd.DataFrame({‘年‘:year,‘月‘:mouth,‘日‘:day,‘时‘:hour,‘纬度‘:latitude,‘经度‘:longitude,‘船名‘:name}) return(vosData) if __name__ == ‘__main__‘: #打开文件 x = open(‘VOSClim_GTS_nov_2018.txt‘) vosData = DataProcessing(x) #打印数据信息 print(vosData) #调用函数绘图 First(vosData) Second(vosData) Third(vosData) Fourth(vosData) x.close()
原文:https://www.cnblogs.com/Rime/p/11298760.html