数据预处理:
1.采用字符串的形式获取所有的数据,在后续的场景在执行需要的数据格式转换;
2.在数据源阶段就完成转换工作。
示例代码一:
from io import StringIO
import numpy as np
in_data = StringIO("30kg,inr2000,31.11,56.33,1\n52kg,inr8000.35,12,16.7,2")
data = np.genfromtxt(in_data,delimiter=",")
print (data)
代码输出:
[[ nan nan 31.11 56.33 1. ]
[ nan nan 12. 16.7 2. ]]
可以看得,最开始的两列并没有被读取。
进行数据预处理,改进示例代码一:
from io import StringIO
import numpy as np
in_data = StringIO("30kg,inr2000,31.11,56.33,1\n52kg,inr8000.35,12,16.7,2")
print ("第一次输出-------------------无预处理")
print (np.genfromtxt(in_data,delimiter=","))
#1.使用lambda函数定义两个数据预处理函数
#第一个函数,将列1中的字符串kg从右面清除
#第二个函数将列2中的字符串inr从左面清除
strip_func_1 = lambda x:float(x.rstrip("kg".encode())) #rstrip()函数里面的str需要使用encode编码,否则会报错a bytes-like object is required, not 'str'
strip_func_2 = lambda x:float(x.lstrip("inr".encode()))
#2.创建一个函数的字典
#字典的键就是被函数应用的列名,值就是函数。这个字典被作为参数converters传递给genfromtxt。
convert_funcs = {0:strip_func_1 , 1:strip_func_2}
#3.将这个函数的字典传递给genformtxt
#warnning:注释掉下面对in_data的第二次定义,这里会报错 IndexError: list index out of range。测试发现in_data现在为空了。
#原因猜测是StringIO读取一次之后,缓存为空,输入流被关闭了?????欢迎留言讨论!
in_data = StringIO("30kg,inr2000,31.11,56.33,1\n52kg,inr8000.35,12,16.7,2")
data = np.genfromtxt(in_data,delimiter=",",converters=convert_funcs)
print ("第二次输出-------------------数据格式处理")
print (data)
#4.使用lambda函数来处理输入中丢失的记录
#注意\n换行符后面没有逗号!逗号是分隔列的,换行符是分隔行的。
in_data = StringIO("10,20,30\n56,,90\n33,46,89")
#lambda采用-999来代替缺失值。
mss_func = lambda x:float(x.strip() or -999)
#converters参数值是一个字典,键值是应用函数的列,列的index从0开始,字典的值是所应用的函数。
data = np.genfromtxt(in_data,delimiter=",",converters={1:mss_func})
print ("第三次输出-------------------处理缺失值")
print (data)