我正在使用sklearn的FunctionTransformer来预处理我的一些数据,这些数据是日期字符串,例如"2015-01-01 11:09:15"。
我的自定义函数将字符串作为输入,但我发现 FunctionTransformer 无法处理字符串,因为它没有fit_transform实现源代码。因此,调用被路由到父类,如下所示:
57 def fit(self, X, y=None):
58 if self.validate:
---> 59 check_array(X, self.accept_sparse)
60 return self
check_array似乎仅适用于数字 ndarray。现在我当然可以在熊猫领域做任何事情,但我想知道是否有更好的方法来处理 sklearn - 特别是考虑到我将来可能会使用管道?
谢谢!
似乎 validate
参数就是您要查找的:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.FunctionTransformer.html
这里有一个例子,如注释中所述,将其保留为字符串而不是转换为浮点数可能是有意义的。假设您要将时区信息添加到日期字符串中:
import pandas as pd
def add_TZ(df):
df['date'] = df['date'].astype(str) + "Z"
data = { 'date' : ["2015-01-01 11:00:00", "2015-01-01 11:15:00", "2015-01-01 11:30:00"],
'value' : [4., 3., 2.]}
df = pd.DataFrame(data)
正如您指出的那样,由于检查,这将失败:
ft = FunctionTransformer(func=add_TZ)
ft.fit_transform(df)
输出:
ValueError: could not convert string to float: '2015-01-01 11:30:00'
这有效:
ft = FunctionTransformer(func=add_TZ, validate=False)
ft.fit_transform(df)
输出:
date value
0 2015-01-01 11:00:00Z 4.0
1 2015-01-01 11:15:00Z 3.0
2 2015-01-01 11:30:00Z 2.0