Numpy 忽略负值和极值

忽略负值和极值,Masked数组的一个用途是忽略取值为负数的数组元素。例如,求取数组的对数时需要忽略其中的负值。Masked数组的另一个用途是排除极值,此时需要给出极值的上下边界。

在本章中,我们将把Masked数组的上述功能应用于对股价数据的处理。下载股价数据的步骤在前面的章节中已经介绍过了,此处不再赘述。

具体步骤

下面将对一个包含负数的数组取对数。

  1. 对负数取对数。

首先创建一个包含3的倍数的数组。

triples = numpy.arange(0, len(close), 3)
print "Triples", triples[:10], "..."

然后创建一个全1数组,其大小和股价数据数组相同。

signs = numpy.ones(len(close))
print "Signs", signs[:10], "..."

利用前面介绍的索引技巧,把signs数组中索引值为3的倍数的数组元素置为负数。

signs[triples] = -1
print "Signs", signs[:10], "..."

最后对包含负值的股价数据数组取对数。

ma_log = numpy.ma.log(close * signs)
print "Masked logs", ma_log[:10], "..."

对于AAPL股票,将有如下的打印输出。

Triples [ 0 3 6 9 12 15 18 21 24 27] ...
Signs [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] ...
Signs [-1. 1. 1. -1. 1. 1. -1. 1. 1. -1.] ...
Masked logs [-- 5.93655586575 5.95094223368 -- 5.97468290742
5.97510711452 --
 6.01674381162 5.97889061623 --] ...

  1. 忽略极值。

我们把比均值小或大一个标准差以上的数定义为极值。根据这个定义,可以使用如下代码屏蔽极值。

dev = close.std()
avg = close.mean()
inside = numpy.ma.masked_outside
  (close, avg - dev, avg + dev)
print "Inside", inside[:10], "..."

这段代码会打印出数组inside的前10个元素。

Inside [-- -- -- -- -- -- 409.429675172 
        410.240597855 -- --] ...

让我们绘制三组数据:原始的股价数据;对股价数据取对数,再对其结果进行指数运算后,得到的数据;基于标准差屏蔽原始数据中的极值后,得到的数据。最终结果如下图所示。

忽略负值和极值

攻略小结

numpy.ma模块中的函数用来屏蔽不合法的数组元素。例如,log函数和sqrt函数不允许使用负值。对被屏蔽的值的后续处理,有点像数据库和其他编程语言中的NULL。所有对被屏蔽的值的操作,其结果还是一个被屏蔽的值。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程