【问题标题】:numpy genfromtxt - missing data vs bad datanumpy genfromtxt - 缺失数据与坏数据
【发布时间】:2020-12-14 23:44:32
【问题描述】:

我正在使用 numpy genfromtxt,我需要识别丢失的数据和错误的数据。根据用户输入,我可能想要删除错误值或引发错误。本质上,我想将丢失的数据和错误的数据视为同一件事。

假设我有一个这样的文件,其中列的数据类型为“日期、整数、浮点数”

date,id,value
2017-12-4,0,       # BAD. missing data
2017-12-4,1,XYZ    # BAD. value should be float, not string. 
2017-12-4,2,1.0    # good
2017-12-4,3,1.0    # good
2017-12-4,4,1.0    # good

我想同时检测两者。所以,我这样做了

dtype=(np.dtype('<M8[D]'), np.dtype('int64'), np.dtype('float64'))
result = np.genfromtxt(filename, delimiter=',', dtype=dtype, names=True, usemask=True, usecols=('date', 'id', 'value'))

结果是这样的

masked_array(data=[(datetime.date(2017, 12, 4), 0, --),
               (datetime.date(2017, 12, 4), 1, nan),
               (datetime.date(2017, 12, 4), 2, 1.0),
               (datetime.date(2017, 12, 4), 3, 1.0),
               (datetime.date(2017, 12, 4), 4, 1.0)],
         mask=[(False, False,  True), (False, False, False),
               (False, False, False), (False, False, False),
               (False, False, False)],
   fill_value=('NaT', 999999, 1.e+20),
        dtype=[('date', '<M8[D]'), ('id', '<i8'), ('value', '<f8')])

我认为 masked_array 的全部意义在于它可以处理丢失的数据和错误的数据。但在这里,它只处理丢失的数据。

result['value'].mask

返回

array([ True, False, False, False, False])

“坏”数据实际上仍以 nan 的形式进入数组。我希望面具能给我True True False False False

为了让我意识到我们在第二行有一个错误的值,我需要做一些额外的工作,比如检查 nan。

another_mask = np.isnan(result['value'])
good_result = result['value'][~another_mask]

最后,返回

masked_array(data=[1.0, 1.0, 1.0],
         mask=[False, False, False],
   fill_value=1e+20)

这行得通,但我觉得我做错了什么。 maskedArray 的全部意义在于查找丢失和错误的数据,但我只是用它来查找丢失的数据。我需要自己检查才能找到不良数据。感觉丑陋而不像pythonic。

有没有办法同时找到两者?

【问题讨论】:

  • 我不喜欢那种“非pythonic”的概念。如果它有效,它是pythonic。现在是否充分利用genfromtxt这样的复杂功能是另一回事。我现在不能引用它,但不久前我在另一个 SO 中与它搏斗。该函数似乎擅长填充缺失值。蒙面部分是否功能齐全,甚至它应该做什么都不太清楚。它没有很好的记录
  • nan填充怎么样,然后用np.ma.masked_invalid屏蔽所有nan。在genfromtxt 中做任何事情都不会获得任何布朗尼积分。
  • 当您创建MaskedArray 时,您必须指定要屏蔽的内容。该类没有默认的屏蔽标准。 genfrontxt 没有记录它对该标志的使用。
  • 填写nan 是我最后的选择。我不喜欢nan 的原因是nan 可能是一个实际数字。但是字符串和空格都是错误值的示例。我想区分nan 和bad_values。这就是为什么我认为 masked_array 会是个好主意。

标签: numpy numpy-ndarray masked-array


【解决方案1】:

玩弄一个简单的输入:

In [143]: txt='''1,2
     ...: 3,nan
     ...: 4,foo
     ...: 5,
     ...: '''.splitlines()
In [144]: txt
Out[144]: ['1,2', '3,nan', '4,foo', '5,']

通过将特定字符串指定为“缺失”(它可能是一个列表?),我可以“屏蔽”它以及空白:

In [146]: np.genfromtxt(txt,delimiter=',', missing_values='foo', 
       usemask=True, usecols=1)
Out[146]: 
masked_array(data=[2.0, nan, --, --],
             mask=[False, False,  True,  True],
       fill_value=1e+20)

看起来它用float 转换了所有值,但是根据字符串生成了掩码(或缺少掩码):

In [147]: _.data
Out[147]: array([ 2., nan, nan, nan])

我可以用特定值替换这两种类型的“缺失”。由于它正在进行float 转换,因此填充必须为100'100'

In [151]: np.genfromtxt(txt,delimiter=',', missing_values='foo', 
    usecols=1, filling_values=100)
Out[151]: array([  2.,  nan, 100., 100.])

在更复杂的情况下,我可以想象为列编写一个转换器。我只涉足该功能。

这些参数的文档很少,因此要弄清楚哪些组合起作用以及以什么顺序起作用,需要反复试验(或大量代码挖掘)。

更多详情请看后续问题:numpy genfromtxt - how to detect bad int input values

【讨论】:

  • 谢谢。你对非浮动有什么建议?当正确的格式是 int 时,假设有人输入了一个字符串?现在,整个读取将崩溃。我希望找回一个带有掩码为 True 的错误条目的 maskedarray。
猜你喜欢
  • 2015-10-04
  • 2011-04-15
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多