arrays 掩码

将要完成的事:
使用Numpy 里的 arrays掩码模块分析COVID-19的数据并处理丢失的数据

可以学到的内容

  • 理解什么是arrays掩码,并且是怎么创建出来的
  • 如何访问和修改掩码数组里的数据
  • 学会在何时使用arrays掩码是最合适的

什么是arrays 掩码

思考以下问题:你有个数据集里面有部分数据丢失或者是无效的。而你想对这些数据进行处理,并且对不想要的数据跳过或者进行标记而不是直接删除他们,你可能使用条件语句过滤数据。
numpy.ma模块提供了一些Numoy ndarrays相同的功能,b并为数据添加了一种使得无效条目不会参与计算的结构。
掩码数组是标准 numpy.ndarray 和掩码的组合。掩码要么是 nomask,表示关联数组的任何值都无效,要么是一个布尔数组,用于确定关联数组的每个元素的值是否有效。当掩码的某个元素为 False 时,关联数组的对应元素是有效的,称为未掩码。当掩码的元素为 True 时,关联数组的对应元素被称为被掩码(无效)。
可将MaskedArray视为以下的组合:

  • data,任何形状或数量类型的常规numpy.ndarray;
  • boolean mask,与数据形状相同的布尔掩码;
  • fill_value,一个可用于替换无效条目以返回标准numpy.ndarray的值。

实例:使用arrays 掩码查看COVID-19的数据

import numpy as np
import os
# os.getcwd() function returns the current folder;you can change
# the filepath variable to point to the folder where you saved the .csv file
filepath = os.getcwd()
filename = os.path.join(filepath,"file_name")
'''
该数据文件包含不同类型的数据,其组织方式如下:
1.第一行是标题行,主要描述了各行中每列的数据,从第四列开始标明了观察日期;
2.第二行到第六行包含了将要检查数据类型不同的汇总数据,因此需要将其从将使用的数据中排除;
3.我们希望处理的数值数据从第四列第七行开始,并从那里延伸到最右侧的列和最下方的行。
'''
# skip_header and usecols to read only portions **of the data file** into each variable.
# read just the datas for columns 4-18 from the first row
dates = np.genfromtxt(filename,dtype = np.unicode_,delimiter=',',max_rows=1,usecols=range(4,18),encoding="utf-8-sig",
)
#read the names of the geographic locations from the first two colums,skipping the first six rows
locations = np.genfromtxt(filename,dtype=np.unicode_,delimiter=",",skip_header=6,usecols=(0,1),encoding="utf-8-sig",
)
#read the numeric data from just the first 14 days
nbcases = np.genfromtxt(filename,dtype=np.int_,delimiter=",",skip_header=6,usecols=range(4,18),encoding="utf-8-sig",
)

Exploring the data

import matplotlib.pyplot as plt
select_dates = [0, 3, 11, 13]
plt.plot(dates,nbcase.T,"--")
plt.xticks(select_dates,dates[select_dates])
plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020")


该图从1.24到2.1日具有奇怪的形状,我们提取的location数据包含了地区,国家两列。

接下来将所有来自China的数据分为一行,为此将从nbcase中仅选择位置数据对应于中国的行。接下来使用numpy.sum函数对所有选定的行(axis = 0)求和

china_total = nbcase[locations[:,1]=="China"].sum(axis=0)#numpy axis 详解:https://blog.csdn.net/sky_kkk/article/details/79725646
'''
输出
array([ 247,   288,   556,   817,   -22,   -22,   -15,   -10,    -9,-7,    -4, 11820, 14410, 17237])
发现了异常出现负值了
'''

Missing data 丢失的数据

nbcases
#输出
array([[  258,   270,   375, ...,  7153,  9074, 11177],[   14,    17,    26, ...,   520,   604,   683],[   -1,     1,     1, ...,   422,   493,   566],...,[   -1,    -1,    -1, ...,    -1,    -1,    -1],[   -1,    -1,    -1, ...,    -1,    -1,    -1],[   -1,    -1,    -1, ...,    -1,    -1,    -1]])
'''
当numpy.genfromtxt试图从csv文件中读取丢失的数据时就会以-1来标记,显然我们不能让-1也参与计算
导入numpy.ma模块后,我们将创建一个新数组,直接屏蔽无效值。
'''
from numpy import ma
nbcases_ma = ma.masked_values(nbcases,-1)
nbcases_ma
#输出
masked_array(data=[[258, 270, 375, ..., 7153, 9074, 11177],[14, 17, 26, ..., 520, 604, 683],[--, 1, 1, ..., 422, 493, 566],...,[--, --, --, ..., --, --, --],[--, --, --, ..., --, --, --],[--, --, --, ..., --, --, --]],mask=[[False, False, False, ..., False, False, False],[False, False, False, ..., False, False, False],[ True, False, False, ..., False, False, False],...,[ True,  True,  True, ...,  True,  True,  True],[ True,  True,  True, ...,  True,  True,  True],[ True,  True,  True, ...,  True,  True,  True]],fill_value=-1)
'''
It has three attributes(data,mask and fill_value)
keep in mind that the mask attribute has a True value for elements correspoding
to invalid data(represented by two dashes in the data attribute)
'''
plt.plot(dates, nbcases_ma[1:].T, "--")
plt.xticks(selected_dates, dates[selected_dates])
plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020")

china_masked = nbcases_ma[locations[:, 1] == "China"].sum(axis=0)
china_masked
#输出
masked_array(data=[278, 309, 574, 835, 10, 10, 17, 22, 23, 25, 28, 11821,14411, 17238],mask=[False, False, False, False, False, False, False, False,False, False, False, False, False, False],fill_value=999999)
china_total = china_masked.data
china_total
#输出
array([  278,   309,   574,   835,    10,    10,    17,    22,    23,25,    28, 11821, 14411, 17238])
'''
首先将负值全部处理了,但是(835,10)这两个数字之间明显不符合sum的定义,说明还是有一些数据缺失了,
在中国大陆数据缺失的时候,香港台湾澳门等省和其他“未指定”区域的数据是有效的。
我们可以将这样的数据去除,以便更好地了解数据。
'''
#首先,确定中国大陆地区的位置索引:
china_mask = ((locations[:, 1] == "China")& (locations[:, 0] != "Hong Kong")& (locations[:, 0] != "Taiwan")& (locations[:, 0] != "Macau")& (locations[:, 0] != "Unspecified*")
)
china_mask.nonzero()
#输出
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29, 31, 33]),)
china_total = nbcases_ma[china_mask].sum(axis=0)
china_total
#输出
masked_array(data=[278, 308, 440, 446, --, --, --, --, --, --, --, 11791,14380, 17205],mask=[False, False, False, False,  True,  True,  True,  True,True,  True,  True, False, False, False],fill_value=999999)

Fitting Data 拟合数据

#使用.mask来查看masked(invalid entries)的值
china_total.mask
invalid = china_total[china_total.mask]
invalid
#输出
masked_array(data=[--, --, --, --, --, --, --],mask=[ True,  True,  True,  True,  True,  True,  True],fill_value=999999,dtype=int64)
#也可以使用logical negation 来查看valid entries
valid = china_total[~china_total.mask]
valid
#输出
masked_array(data=[278, 308, 440, 446, 11791, 14380, 17205],mask=[False, False, False, False, False, False, False],fill_value=999999)
# select the dates for which the data is valid
data[~china_total.mask]
#输出
array(['1/21/20', '1/22/20', '1/23/20', '1/24/20', '2/1/20', '2/2/20','2/3/20'], dtype='<U7')
# we can use the numpy.polyfit and numpy.polyval functions to create
# a cubic polynomial(三次多项式) that fits the data as best as possible:
t = np.arange(len(china_total))
params = np.polyfit(t[~china_total.mask], valid, 3)
cubic_fit = np.polyval(params, t)
plt.plot(t, china_total)
plt.plot(t, cubic_fit, "--")


这个plot不太可读,因为线条似乎相互重叠,所以用一个更详细的情节来总结。我们将在可用时绘制真实数据,并显示不可用数据的三次拟合,使用此拟合计算对 2020 年 1 月 28 日(记录开始后 7 天)观察到的病例数的估计:

plt.plot(t, china_total)
plt.plot(t[china_total.mask], cubic_fit[china_total.mask], "--", color="orange")
plt.plot(7, np.polyval(params, 7), "r*")
plt.xticks([0, 7, 13], dates[[0, 7, 13]])
plt.yticks([0, np.polyval(params, 7), 10000, 17500])
plt.legend(["Mainland China", "Cubic estimate", "7 days after start"])
plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020 - Mainland China\n""Cubic estimate for 7 days after start"
)


参考网站:https://numpy.org/numpy-tutorials/content/tutorial-ma.html#
https://www.kaggle.com/atilamadai/covid19

Masked Arrays(numpy arrays掩码)针对数据中存在无效或者确实数据相关推荐

  1. R语言使用dplyr包的summarise函数计算dataframe数据中指定(特定)数据列的移动平均值

    R语言使用dplyr包的summarise函数计算dataframe数据中指定(特定)数据列的移动平均值 目录

  2. UiPath针对DataTable中的某几列数据去重

    UiPath有自带的去重组件Remove Duplicate Rows,这个组件是针对DataTable中的所有Column去重的.有时我们不想对DataTable中的所有列去重,只想针对某几列数据去 ...

  3. python怎么索引txt数据中第四行_python-在熊猫数据框中按行计数编制索引

    我有一个带有两个元素的层次结构索引的"熊猫"数据框(" month"和" item_id").每行表示特定月份的特定项目,并具有用于关注多个 ...

  4. excel如何晒出重复数据_excel 如何在大量数据中快速筛选出重复数据

    当我们录入或者处理大量数据时,难免会遇到一些数据重复的问题,下面就教大家几种方法如何快速地找出数据中的重复项. 条件格式 重复项填色工具 打开数据表,选中需要进行筛选的目标数据列,在开始菜单栏中找到& ...

  5. 在excel中如何筛选重复数据_Excel 在大量数据中快速筛选出重复数据

    当我们录入或者处理大量数据时,难免会遇到一些数据重复的问题,下面就教大家几种方法如何快速地找出数据中的重复项. 条件格式 重复项填色工具 打开数据表,选中需要进行筛选的目标数据列,在开始菜单栏中找到& ...

  6. java 一组数据中偏差较大的数据_深入分析数据结构中的队列(java代码实现)

    不知道你有没有过在餐厅打饭的经历,我们排的队其实就是我们今天所讲的主题,我们在排队的时候,在队列头部的人打好饭离开,新来的人排在队尾.这就是入队和出队的操作.所以,队列的特性就是先进先出.有了这个概念 ...

  7. html显示json数据中某一条的数据,php - 给定一个具有json格式数据的API,我该如何在HTML表中显示数据? - 堆栈内存溢出...

    到目前为止,我有以下PHP cURL代码: $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "h ...

  8. js提取JSON数据中需要的那部分数据

    var data =[{ name: "程咬金",sex:"1",age:26 },{ name: "程才",sex:"0&quo ...

  9. 从JSON数据中取出相关数据

    参考: http://www.cnblogs.com/shuilangyizu/p/6019561.html JSON数据如下: {"total": 1,"rows&qu ...

  10. wireshark提取流量包中的文件_从Wireshark监听的数据中提取需要的数据

    最近,需要将wireshark监听的数据进行提取,分两步:首先,应该得出wireshark的数据包吧,在图形化界面中可以非常直观的将监听数据进行存储,但是这样需要手动操作非常麻烦,而且容易出错(随着处 ...

最新文章

  1. 编程语言性能实测,Go比Python更胜一筹?
  2. iOS 登录功能的实现
  3. Python中if __name__ == '__main__':作用
  4. python学习之路day05——cmd操作命令
  5. KaTeX|LaTeX数学公式编辑手册
  6. elementui 做删除,分页页码不正确
  7. 感性负载,容性负载,阻性负载
  8. 《游戏大师Chris Crawford谈互动叙事》一导读
  9. oracle的month函数的使用方法,oracle add_month函数
  10. C语言之i++,++i,i--,--i
  11. Android 清理应用缓存
  12. 【时间序列预测算法】——Holt-Winters算法介绍及代码实现
  13. 你想过自己注定是一个普通人吗?
  14. 原生js做购物车全选选中商品显示价格和小计的计算
  15. Reference 、ReferenceQueue 详解
  16. android圆角设置
  17. 计算机个性化桌面,良好的个性化桌面图标管理软件排行榜
  18. 牛客 古老的牛市,遗迹的天梯 dp
  19. e2eSoft VCam 虚拟摄像头
  20. 渲染吃CPU还是显卡呢?未来是否新睿云的云渲染会大行其道呢?

热门文章

  1. Linux C/C++程序员 但行好事 莫问前程 Linux系统下 解决Qt5无法连接MySQL数据库的方法
  2. 用微信公众号做淘宝优惠券查券和返利机器人的详细设置教程
  3. 大数据要学什么?该怎么学?
  4. java毕业生设计在线教育平台计算机源码+系统+mysql+调试部署+lw
  5. 基于 SpringBoot 和 webSocket 的匿名聊天室
  6. PyMol2.4安装教程
  7. R语言学习-创建空矩阵
  8. RabbitMQ 实战教程
  9. 端电压,相电压,线电压区别
  10. 叉积 微分 恒等式_一个斜三角中的恒等式