Python Counter过滤和约分原始数据

Python Counter过滤和约分原始数据,我们把基本的缺陷计数表示为collections.Counter参数。下面将根据原始数据中的轮换和缺陷类型来构造缺陷计数。以下代码从.csv文件中读取了一些原始数据。

from typing import TextIO
import csv
from collections import Counter
from types import SimpleNamespace

def defect_reduce(input_file: TextIO) -> Counter:
    rdr = csv.DictReader(input_file)
    assert set(rdr.fieldnames) == set(
        ["defect_type", "serial_number", "shift"])
    rows_ns = (SimpleNamespace(**row) for row in rdr)
    defects = (
        (row.shift, row.defect_type)
        for row in rows_ns if row.defect_type)
    tally = Counter(defects)
    return tally

上述函数会基于通过input参数提供的打开文件来创建一个字典读取器。我们确认了列名需和3个预期的列名相匹配。在某些情况下,文件会包含额外必须被忽略的列,此时断言会类似于set(rdr.fieldnames) <= set([...]),用于确认实际的列名是所需列的子集。

我们为每一行创建了一个types.SimpleNamespace参数。文件中的列名都是有效的Python变量名,便于将字典转换为命名空间对象,使得我们可以用稍简单的语法来引用行中的项。具体而言,后面的生成器表达式使用row.shiftrow.defect_type而不是row['shift']row['defect_type']作为引用。

可以使用更复杂的生成器表达式来组合映射和过滤。过滤每一行,以忽略那些没有代码缺陷的行。对于有代码缺陷的行,可以映射一个表达式,基于row.shiftrow.defect_type引用创建一个二元组。

在某些应用程序中,过滤器不会是row.defect_type这样的简单表达式,可能需要编写更复杂的条件语句。在这种情况下,使用filter()函数将复杂条件应用于提供数据的生成器表达式可能会有帮助。

给定一个生成(shift, defect)元组序列的生成器,可以通过从生成器表达式中创建一个Counter对象来汇总它们。创建该Counter对象来处理惰性生成器表达式,该表达式会读取源文件、从行中提取字段、过滤行并汇总计数。

使用defect_reduce()函数来收集和汇总数据,如下所示:

with open("qa_data.csv") as input:
    defects = defect_reduce(input)
print(defects)

我们可以打开一个文件,收集并显示缺陷信息,以确保正确地汇总了轮换和缺陷类型。由于结果是一个Counter对象,因此如果有其他源数据,就可以将它与其他Counter对象结合起来了。

defects如下所示:

Counter({('3', 'C'): 49, ('1', 'C'): 45, ('2', 'C'): 34,
 ('3', 'A'): 33, ('2', 'B'): 31, ('2', 'A'): 26,
 ('1', 'B'): 21, ('3', 'D'): 20, ('3', 'B'): 17,
 ('1', 'A'): 15, ('1', 'D'): 13, ('2', 'D'): 5})

通过轮换('1', '2', or '3')和缺陷类型(从'A''D')组织了缺陷计数。下面介绍汇总数据的其他一些输入,能体现数据在汇总级别的常规用法。

一旦读取了数据,下一步就是生成两个概率,这样就可以正确地计算每个轮换和每种缺陷的预期缺陷了。我们不想把总缺陷数除以12,因为这并不能反映实际的轮换或者缺陷类型。轮换可能或多或少具有相同效果,但缺陷频率肯定不会相似。我们期望一些缺陷是非常罕见的,另一些则更为常见。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程