利用 NumPy 可以对大数据进行简单的统计分析,包括数据文件的读取、数据列的提取、数据类型的转换和各种统计计算,还有数据的排序、搜索和计数等。现以中国历史地震数据分析为例来介绍简单的统计分析思路。

【例 1】将中国历史地震数据文件命名为 earthquakes.csv 文件。该文件中包含的数据列有日期、时间、地震发生纬度与经度、深度(km)、震级、烈度和精确度等。数据包括 1969 年 12 月 22 日以前中国历史上所发生的地震数据,其中部分数据列表显示如下。

日期,时间(北京时),纬度(度-分),经度(度-分),深度(km),震级,烈度,精确度

408/00/00,::.,"39°00""","100°30""",,4.75,VI,9,

416/00/00,::.,"34°18""","105°30""",,5,VI,9,

421/00/00,::.,"41°36""","120°24""",,5,VI,9,

462/08/16,::.,"35°00""","116°48""",,6,VIII,9,

495/03/31,::.,"37°30""","121°30""",,5.5,VII,9,

…………………………………………………………………………………………………………………

1969/12/7,52:39.0,"23°42""","121°54""",3.3,5.1,,9

1969/12/17,00:04.0,"18°30""","110°36""",,5.1,,3

1969/12/19,51:05.0,"31°12""","88°12""",,4,,2

1969/12/20,09:15.0,"18°12""","110°18""",2.4,5.2,,2

1969/12/21,38:57.0,"39°54""","76°54""",3.3,4,,9

请完成下列数据分析任务:

(1)计算历史地震数据中震级和烈度的最大值、最小值、算术平均值和中位数。

(2)统计不同震级发现次数。

(3)统计发生6级以上震级次数的总和。

(4)列出7.5级以上地震的发生日期、时间、经度、纬度和震级信息。

中国历史地震数据统计分析思路如下

1. 文件数据列的读取

利用 NumPy 中的 loadtxt 文件读取命令,将 earthquakes.csv 文件中的震级和烈度这两列数据分别读取并存储到 magnitude 数组和 lido 数组中。

在读取文件时,loadtxt 命令需要使用 delimiter、usecols、dtype 和 skiprows 参数,其中,delimiter 表示文件数据列的分割符为逗号,usecols 是确定读取文件中的列数位置,dtype 是确定数组的数据类型,skiprows 表示跳过第一行的行数。

由于地震的烈度分为 12 级,分别用罗马数字 I,II,…,XII 来表示。但是,在统计计算时需要将罗马数字转换成对应的 1~12 数字表示,因此,在读取烈度列时,loadtxt 命令还需要使用 converters 创建烈度列与转换函数之间进行映射的字典。同时,创建将烈度列中的罗马数字转换成对应的 1~12 数字的自定义函数 lido_conv(x)。

2. 自定义函数 lido_conv(x)

在自定义函数 lido_conv(x) 中,先创建数组 keys 用于存储空格和 1~12 的罗马数字,并将数组 keys 转换成列表 keys_list,而列表中每个元素的索引正是该元素的罗马数字对应的阿拉伯数字。由于从 CSV 文件中读取的数据是二进制字符串,因此需要将其转换成字符串。然后,使用 NumPy 的 where() 函数,将罗马数字转换成对应的阿拉伯数字。

3. 计算历史地震数据中震级和烈度的最大值、最小值、算术平均值和中位数

计算最大值、最小值、算术平均值和中位数的统计函数分别为 max()、min()、mean() 和 median() 等。由于烈度列数据中有许多空格,在计算烈度的平均值时要将烈度为 0 的项排除,因此,计算烈度平均值不能使用 mean() 函数,而是要使用 sum() 函数求出烈度数据总和,再使用 count_nonzero() 函数求出烈度数据不为 0 的总个数,然后将总和与总个数相除。

4. 统计不同震级发现的次数

利用 NumPy 中的 unique() 函数来实现。

5. 统计发生 6 级以上震级次数的总和

利用 NumPy 中的 where() 和 count_nonzero() 函数来实现。

6. 列出 7.5 级以上地震的发生日期、时间、经度、纬度和震级信息

利用 NumPy 中的 where() 函数来实现。

其程序代码 test1 如下。

# -*- coding: utf-8 -*-

import numpy as np

def lido_conv(x):

keys = np.array(['','I','II','III','IIII','V','VI','VII','VIII',

'IX','X','XI','XII'])

keys_list = keys.tolist() #将数组转换成列表

a = str(x, encoding="utf-8") #将二进制字符转换成字符

# 使用NumPy的where函数,将罗马数字转换成对应的阿拉伯数字

result = np.where(a in keys,keys_list.index(a),0)

return result

#取出震级存入magnitude数组和烈度存入lido数组

magnitude= np.loadtxt('earthquakes.csv',delimiter = ",",

usecols=(5,),dtype=float,skiprows=1)

lido = np.loadtxt('earthquakes.csv',delimiter = ",",

usecols=(6,),dtype=np.int,skiprows=1,

converters={6:lido_conv})

print(magnitude,lido)

#计算震级和烈度的最大值、最小值、算术平均值和中位数

print ("最大震级 =", np.max(magnitude))

print ("最大震级 =", np.amax(magnitude))

print ("最大烈度 =", np.max(lido))

print ("最小震级 =", np.min(magnitude))

print ("最小震级 =", np.amin(magnitude))

print ("最小烈度 =", np.min(lido))

print ("震级平均值 =", np.mean(magnitude))

print ("烈度平均值 =", np.mean(lido))

print ("震级中位数 =", np.median(magnitude))

print ("烈度平均值 =", np.sum(lido)/np.count_nonzero(lido))

#统计不同震级发生的次数

print ('不同震级震级数组:',np.unique(magnitude))

print('不同震级发现次数:')

arr_u,u_inverse = np.unique(magnitude, return_counts=True)

print(u_inverse)

#统计发生6级以上的震级次数总和

m_index = np.where(magnitude>6) #震级大于6的元素的索引

m_sum = np.count_nonzero(m_index)

print(m_sum)

#列出7.5级以上地震的发生日期、时间、经度、纬度和震级信息

arr = np.loadtxt('earthquakes.csv',delimiter = ',',

dtype=np.string_,usecols=(0,1,2,3),skiprows=1)

print('读取的地震数据:',arr)

cond = np.where(magnitude>7.5)

print ('7.5级以上地震的元素索引值:',cond)

print ('使用元素索引值提取元素:')

print ('7.5级以上地震数据:',arr[cond].astype(np.string_))

python地震数据处理_NumPy实例:地震数据的统计分析相关推荐

  1. python csv数据处理_python处理csv数据的方法

    本文实例讲述了python处理csv数据的方法.分享给大家供大家参考.具体如下: Python代码: #coding=utf-8 __author__ = 'dehua.li' from dateti ...

  2. 用python对CSV文件中的数据进行统计分析

    在目前的数据分析领域,常用的分析工具有excel.python等,这几乎已经成为共识,而面对excel和python,谁更适合数据分析,也确实一直被大家讨论. Excel VS Python exce ...

  3. python中print又可将数据写入文件_Python第五课-将写入文件的列表格式化

    1.上节课代码中的问题 第四课中介绍了python持久化的基础实例--将数据写入文本文件. 可当我们试着把保存数据的文件读取出来会怎样呢? try: with open('man.txt', 'r') ...

  4. Python之数据处理案例

    Python之数据处理案例 1 准备数据 2 要求 (1)将数据表添加两列:每位同学的各科成绩总分(score)和每位同学的整体情况(类别),类别按照[df.score.min()-1,400,450 ...

  5. livechart 只显示 y 值_基于Python语言的SEGY格式地震数据读取与显示编程

    敬请关注<地学新视野> 摘要:本文简单介绍了SEG-Y地震数据文件格式,以及如何用Python语言编写读写SEG-Y格式的地震数据并绘制地震剖面,其中用到了Segyio和matplotli ...

  6. 用Python分析过去10年地震分布~

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夕阳无限好,只是近黄昏. 大家好, ...

  7. matlab三角多项式拟合,三角多项式拟合方法及地震数据处理

    撰写目的和基本思路 撰写目的:基于地震数据光滑性较差的特征,以往拘泥于寻找地震数据数字特征等常规的统计分析方法局限性太大.为了反映地震数据统计规律的本质特征,提出三角多项式拟合方法. 基本思路:将所得 ...

  8. 汶川地震10周年:大数据正在攻克地震预测这个“不可能任务”

    导读:5月12日,是汶川地震10周年. 2008年5月12日,汶川地震发生,造成了大量的人员伤亡和财产损失.十年间,数据记载着人们的行为,汶川从未被遗忘. 一直以来,地震预测被认为是不可能实现的,但近 ...

  9. 广州地震?用 Python 爬虫带你了解地震 !

    这周看到了两个地震新闻,一个是广东广州增城的,另一个是台湾的,因为本人身在广州,而且对于广佛这边的来说地震其实挺突然的对于我们来说,基本在广佛这边很少出现地震,所以我看到广州增城地震也挺吃惊,然后就萌 ...

  10. java 有没有类似于 requests 爬虫_广州地震?用 Python 爬虫带你了解地震

    这周看到了两个地震新闻,一个是广东广州增城的,另一个是台湾的,因为本人身在广州,而且对于广佛这边的来说地震其实挺突然的对于我们来说,基本在广佛这边很少出现地震,所以我看到广州增城地震也挺吃惊,然后就萌 ...

最新文章

  1. RedHat 关闭selinux
  2. 那些年,我还在学习actionscript
  3. element ui 图片上传_游民晚播报:PS5手柄续航情况测试 UI界面概览放出
  4. 打印心形c语言,C语言打印心形
  5. lucene学习之helloworld(简单实例)
  6. 当我们谈微服务,我们在谈什么?谈谈我对微服务的理解!
  7. 服务器查看数据库日志文件,服务器数据库查看日志文件
  8. python常用算法有哪些_python常见排序算法基础教程
  9. Android字节码ASM插桩
  10. 2019山东省赛总结
  11. AWK awk xxx xxx
  12. 同一服务器上运行两个mysql实例
  13. VTK错误解决合集(持续更新中......)
  14. Qt的gui编程是,点击一次button出现两次action
  15. 恶意软件通信协议的应用现状分析
  16. 离线强化学习(Offline RL)系列3: (算法篇) IQL(Implicit Q-learning)算法详解与实现
  17. 使用matlab对图像进行傅里叶变换
  18. Python evel函数
  19. MySQL8高级_读写分离和分库分表
  20. Android 开发新技术:Jetpack Compose当仁不让

热门文章

  1. android交叉编译工具链,NDK 交叉编译工具链使用
  2. 网易云音乐批量下载工具编写过程
  3. (附源码)小程序 校园二手交易平台 毕业设计 191637
  4. ARM体系结构与编程学习(七)
  5. 《神经网络与深度学习》 邱锡鹏 第二章课后习题答案
  6. 用Java实现MD5加盐
  7. 一个PHP的QRcode类,与大家分享
  8. DS18B20 引脚 定义 单总线 多点温度检测 STM32 单片机
  9. echar生成折线图
  10. Mac “EdrawMax”已损坏,无法打开。 您应该将它移到废纸篓