1.21 对列进行预处理
我们获取的数据经常并不是我们能直接使用的格式。我们需要执行一系列在机器学习术语中称为数据预处理的数据处理过程。克服这个障碍的一条途径是采用字符串的形式获取所有数据,在后续的场景里再执行需要的数据格式转换。还有一种办法是在数据源阶段就完成这些转换工作。genfromtxt提供了一些函数,让我们可以在读取数据源的时候执行数据转换。
1.21.1 准备工作
假定我们有如下的文本行。
30kg,inr2000,31.11,56.33,1
52kg,inr8000.35,12,16.7,2
这是一个我们获取到的生活中的常见数据样例,开头的两个列里,分别有字符串“kg”和“inr”在真正的数据的后面和前面。
我们来试试如下方法将数据放入NumPy数组中。
in_data = StringIO("30kg,inr2000,31.11,56.33,1\
n52kg,inr8000.35,12,16.7,2")
data = np.genfromtxt(in_data,delimiter=",")
输入结果如下。
>>> data
array([[ nan, nan, 31.11, 56.33, 1. ],
[ nan, nan, 12. , 16.7 , 2. ]])
如你所见,开始的两个列的数据并没有被读取。
1.21.2 操作方法
我们首先导入必需的库,然后定义一个输入样板,最后演示一下数据预处理。
import numpy as np
from StringIO import StringIO
# 定义一个数据集
in_data = StringIO("30kg,inr2000,31.11,56.33,1\
n52kg,inr8000.35,12,16.7,2")
# 1.使用lambda函数定义两个数据预处理函数
strip_func_1 = lambda x : float(x.rstrip("kg"))
strip_func_2 = lambda x : float(x.lstrip("inr"))
# 2.创建一个函数的字典
convert_funcs = {0:strip_func_1,1:strip_func_2}
# 3.将这个函数的字典传递给genfromtxt
data = np.genfromtxt(in_data,delimiter=",", converters=convert_funcs)
# 4.使用lambda函数来处理转换过程
in_data = StringIO("10,20,30\n56,,90\n33,46,89")
mss_func = lambda x : float(x.strip() or -999)
data = np.genfromtxt(in_data,delimiter=",", converters={1:mss_func})
1.21.3 工作原理
第1步中,我们定义了两个lambda函数,一个将列1中的字符串“kg”从右面清除,另一个将列2中的字符串“inr”从左面清除。
第2步中,我们继续定义一个字典,它的键就是将被函数应用的列名,值就是函数。这个字典被作为参数converters传递给genfromtxt。
现在印输出结果如下。
>>> data
array([[ 3.00000000e+01, 2.00000000e+03, 3.11100000e+01,
5.63300000e+01, 1.00000000e+00],
[ 5.20000000e+01, 8.00035000e+03, 1.20000000e+01,
1.67000000e+01, 2.00000000e+00]])
请注意Nan值不见了,我们获取到了输入数据里的真实值。
1.21.4 更多内容
converters还能用lambda函数来处理输入中丢失的记录。
in_data = StringIO("10,20,30\n56,,90\n33,46,89")
mss_func = lambda x : float(x.strip() or -999)
data = np.genfromtxt(in_data,delimiter=",", converters={1:mss_func})
lambda函数返回−999来替代丢失的数据。在我们的输入里,第2列第2行是一个空值,因而会被替换为−999,最终的输出如下所示。
>>> data
array([[ 10., 20., 30.],
[ 56., -999., 90.],
[ 33., 46., 89.]])
访问以下SciPy文档的链接,你能了解到更多的细节:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html 和 http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html。