Python 使用map()和reduce()清洗数据,清洗数据时经常需要引入复杂度不同的过滤器来剔除无效数据,下面通过定义映射将有效但格式不规范的数据,转换为有效且格式规范的数据。
首先定义如下函数:
def comma_fix(data: str) -> float:
try:
return float(data)
except ValueError:
return float(data.replace(",", ""))
def clean_sum(
cleaner: Callable[[str], float],
data: Iterable[str]
) -> float:
return reduce(operator.add, map(cleaner, data))
comma_fix()
函数通过去掉字符串中的逗号,将格式不规范的表达数字的字符串转换为实数,类似的场景还有去掉字符串中的$
符号并转换为decimal.Decimal
类型数据。
然后可以将一个执行清洗操作的映射函数(这里是comma_fix()
类)应用于数据,再用operator.add
方法进行归约。
清洗过程如下所示:
>>> d = ('1,196', '1,176', '1,269', '1,240', '1,307',
... '1,435', '1,601', '1,654', '1,803', '1,734')
>>> clean_sum(comma_fix, d)
14415.0
这样就通过修正逗号实现了清洗数据并计算总和,组合两项操作的语法也很简单。
请注意,应避免多次调用清洗函数,比如计算一组数据的平方和时,不应执行如下命令:
comma_fix_squared = lambda x: comma_fix(x) ** 2
由于计算数据的标准差时也要用到clean_sum(comma_fix, d)
方法,就执行了两次修正逗号的操作,一次计算数据总和,一次计算平方和,这样的算法设计很差。用lru_cache
装饰器缓存计算结果会有帮助,更好的方法是将清洗的中间结果实例化到临时的元组对象中。