Python Counter过滤和约分原始数据,我们把基本的缺陷计数表示为collections.Counter
参数。下面将根据原始数据中的轮换和缺陷类型来构造缺陷计数。以下代码从.csv
文件中读取了一些原始数据。
上述函数会基于通过input
参数提供的打开文件来创建一个字典读取器。我们确认了列名需和3个预期的列名相匹配。在某些情况下,文件会包含额外必须被忽略的列,此时断言会类似于set(rdr.fieldnames) <= set([...])
,用于确认实际的列名是所需列的子集。
我们为每一行创建了一个types.SimpleNamespace
参数。文件中的列名都是有效的Python变量名,便于将字典转换为命名空间对象,使得我们可以用稍简单的语法来引用行中的项。具体而言,后面的生成器表达式使用row.shift
和row.defect_type
而不是row['shift']
和row['defect_type']
作为引用。
可以使用更复杂的生成器表达式来组合映射和过滤。过滤每一行,以忽略那些没有代码缺陷的行。对于有代码缺陷的行,可以映射一个表达式,基于row.shift
和row.defect_type
引用创建一个二元组。
在某些应用程序中,过滤器不会是row.defect_type
这样的简单表达式,可能需要编写更复杂的条件语句。在这种情况下,使用filter()
函数将复杂条件应用于提供数据的生成器表达式可能会有帮助。
给定一个生成(shift, defect)
元组序列的生成器,可以通过从生成器表达式中创建一个Counter
对象来汇总它们。创建该Counter
对象来处理惰性生成器表达式,该表达式会读取源文件、从行中提取字段、过滤行并汇总计数。
使用defect_reduce()
函数来收集和汇总数据,如下所示:
我们可以打开一个文件,收集并显示缺陷信息,以确保正确地汇总了轮换和缺陷类型。由于结果是一个Counter
对象,因此如果有其他源数据,就可以将它与其他Counter
对象结合起来了。
值defects
如下所示:
通过轮换('1', '2', or '3')
和缺陷类型(从'A'
到'D'
)组织了缺陷计数。下面介绍汇总数据的其他一些输入,能体现数据在汇总级别的常规用法。
一旦读取了数据,下一步就是生成两个概率,这样就可以正确地计算每个轮换和每种缺陷的预期缺陷了。我们不想把总缺陷数除以12,因为这并不能反映实际的轮换或者缺陷类型。轮换可能或多或少具有相同效果,但缺陷频率肯定不会相似。我们期望一些缺陷是非常罕见的,另一些则更为常见。