首页 > 编程语言 > 详细

Python 对大量数据进行分析统计 项目实战

时间:2019-08-04 18:03:28      阅读:97      评论:0      收藏:0      [点我收藏+]

摘要:

随着互联网技术的发展,人们的日常生活已经离不开大数据。未来社会人们的生活和工作将越来越依赖于数字技术的发展,越来越数字化、网络化、数据可使化、服务虚拟化。大数据的发展历程以及目前的应用状况和发展趋势,可以充分地相信数据分析将极大的改变我们的生活和工作方式,甚至社会的价值观也会发生某种变化。
    本设计尝试用Python对世界气象组织的海洋观测数据进行处理,以便世界气象组织志愿观测船计划顺利实施。本文从理论和实践两个角度出发,对一段数据进行处理与可视化分析。论文首先较为详尽地介绍了Python对大数据处理与数据可视化的有关概念与技术,特别深入介绍了在本设计中运用到的知识,如:数据分割、产生随机数、函数的调用等;接着对数据的可行性进行了分析,对设计的设计思想、设计目标与系统的整体结构进行了明确的规划。
    本设计是在Python3.7 平台上来实现的,用到的插件有matplotlib、pandas等。其中matplotlib用来进行绘制二维折线图和柱状图,pandas用来对大量数据进行存储和排序等操作。

关键词:Python,大数据,数据可视化

 

一、课程设计的目的与要求

通过该课程设计的实践训练,进一步掌握Python的语法和编程技术,提高项目设计的实际能力,培养工程设计能力和综合分析、解决问题的能力。

具体如下:

  1. 学习和实践在分析和设计程序所需要的知识,包括面向对象的数据分析与设计,编码和测试方面的知识;
  2. 熟悉较为新颖的数据可视化工具matplotlib,并将其运用于课程设计的全过程;
  3. 进一步加强和提高Python项目工程文档的编写能力;
  4. 培养协作能力和团队精神。

 

二、设计正文

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()

 

Python 对大量数据进行分析统计 项目实战

原文:https://www.cnblogs.com/Rime/p/11298760.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!