Numpy dtype - 数据类型不理解

2023-12-31

我有一个数据框,我正在查看与每列关联的数据类型。

当我跑步时:

In [23]: df.dtype.descr

Out [24]: [(u'date', '<i8'), (u'open', '<f8'), (u'high', '<f8'), (u'low', '<f8'), (u'close', '<f8'), (u'volume', '<f8'), (u'dividend', '<f8'), (u'adj_factor', '<f8'), (u'split_factor', '<f8'), (u'liq', '<f8'), (u'currency', '|O')]

我想将货币 dtype 设置为 S7。我在做:

In [25]: dtype_new[-1] = (u'currency', "|S7")
In [26]: print dtype_new
Out [27]: [(u'date', '<i8'), (u'open', '<f8'), (u'high', '<f8'), (u'low', '<f8'), (u'close', '<f8'), (u'volume', '<f8'), (u'dividend', '<f8'), (u'adj_factor', '<f8'), (u'split_factor', '<f8'), (u'liq', '<f8'), (u'currency', '|S7')]

它看起来是正确的格式。所以我尝试将其放回我的 df:

In [28]: df = df.astype(np.dtype(dtype_new))

我收到错误:

TypeError('data type not understood',)

我应该改变什么?谢谢。在我最近更新 anaconda 之前,这是有效的,我不知道这个问题。谢谢。

调整:

df.dtype 是

In [23]: records.dtype
Out[23]: dtype((numpy.record, [(u'date', '<i8'), (u'open', '<f8'), (u'high',     '<f8'), (u'low', '<f8'), (u'close', '<f8'), (u'volume', '<f8'), (u'dividend', '<f8'), (u'adj_factor', '<f8'), (u'split_factor', '<f8'), (u'liq', '<f8'), (u'currency', 'O')]))

如何将“0”更改为小于 7 个字符的字符串?

如何将最后一个数据类型从“O”更改为其他类型?具体来说是少于 7 个字符的字符串。

最后 - 这是一个 unicode 问题吗? 使用统一码:

In [38]: np.dtype([(u'date', '<i8')]) 
    ...: 
    ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call     last)
<ipython-input-38-8702f0c7681f> in <module>()
----> 1 np.dtype([(u'date', '<i8')])

TypeError: data type not understood

无统​​一码:

In [39]: np.dtype([('date', '<i8')])
Out[39]: dtype([('date', '<i8')])

看来你把重点放在了 unicode 上,实际上,你似乎触及了一个痛处。

让我们从最后一个 numpy 文档开始。

文档dtypes https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html指出:

[(field_name, field_dtype, field_shape), ...]

obj 应该是字段列表,其中每个字段由长度为 2 或 3 的元组描述。 (相当于descr中的项目__array_interface__属性。)

第一个元素,field_name, 是字段名称(如果是''然后分配标准字段名称“f#”)。字段名称也可以是字符串的二元组,其中第一个字符串是“标题”(可以是任何字符串或 unicode 字符串)或字段的元数据(可以是任何对象),第二个字符串是“名称”必须是有效的 Python 标识符。 第二个元素,field_dtype,可以是任何可以解释为数据类型的东西。 可选的第三个元素field_shape如果此字段表示第二个元素中数据类型的数组,则包含形状。请注意,第三个参数等于 1 的 3 元组相当于 2 元组。 此样式不接受 dtype 构造函数中的对齐,因为它假定所有内存均由数组接口描述占用。

所以文档似乎并没有真正指定字段名称是否可以是 unicode,我们可以从文档中确定的是,如果我们定义一个元组作为字段名称,例如((u'date', 'date'), '<i8'),然后使用 unicode 作为“标题”(注意,仍然不是名称!),不会导致任何错误。
否则,同样在这种情况下,如果您定义((u'date', u'date'), '<i8')你会得到一个错误。

现在,您可以在 Py2 中使用 unicode 名称,方法是使用encode("ascii")

(u'date'.encode("ascii"))  

这应该有效。
一大点是对于 Py2,Numpy 不允许指定dtype使用 unicode 字段名称作为元组列表,但允许使用字典。

如果我不在 Py2 中使用 unicode 名称,我可以将最后一个字段更改为|0 to |S7或者你必须使用encode("ascii")如果您将名称定义为 unicode 字符串。


以及涉及的错误...

要了解为什么会发生您所看到的情况,查看 Numpy 和 Pandas 中报告的错误/问题以及相关讨论很有用。

Numpy
https://github.com/numpy/numpy/issues/2407 https://github.com/numpy/numpy/issues/2407
您可以在讨论中注意到(我不在这里报告)主要有以下几点:

  • 这个“问题”已经持续了一段时间
  • 人们使用的一个技巧是使用encode("ascii")在 unicode 字符串上
  • 请记住'whatever'字符串在 Py2/3 中有不同的默认值(字节/unicode)
  • @hpaulj 本人在那份问题报告中发表了精彩的评论:“如果 dtype 规范是元组类型列表,它会检查每个名称是否是字符串(由 py2 或 3 定义),但如果 dtype 规范是字典{'names':[ alist], 'formats':[alist]...}, py2 情况也允许 unicode 名称”

Pandas
另外,在 pandas 方面,还报告了一个与 numpy 问题相关的问题:https://github.com/pandas-dev/pandas/pull/13462 https://github.com/pandas-dev/pandas/pull/13462
似乎不久前就已经修复了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numpy dtype - 数据类型不理解 的相关文章