忽略负值和极值,Masked数组的一个用途是忽略取值为负数的数组元素。例如,求取数组的对数时需要忽略其中的负值。Masked数组的另一个用途是排除极值,此时需要给出极值的上下边界。
在本章中,我们将把Masked数组的上述功能应用于对股价数据的处理。下载股价数据的步骤在前面的章节中已经介绍过了,此处不再赘述。
具体步骤
下面将对一个包含负数的数组取对数。
- 对负数取对数。
首先创建一个包含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 --] ...
- 忽略极值。
我们把比均值小或大一个标准差以上的数定义为极值。根据这个定义,可以使用如下代码屏蔽极值。
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
。所有对被屏蔽的值的操作,其结果还是一个被屏蔽的值。