gpt4 book ai didi

python - Numpy dtype - 不理解的数据类型

转载 作者:太空狗 更新时间:2023-10-29 22:28:49 27 4
gpt4 key购买 nike

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

当我运行时:

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')]

我想将货币数据类型设置为 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 问题吗?使用 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

没有 Unicode:

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

最佳答案

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

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

文档 dtypes指出:

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

obj should be a list of fields where each field is described by a tuple of length 2 or 3. (Equivalent to the descr item in the __array_interface__ attribute.)

The first element, field_name, is the field name (if this is '' then a standard field name, 'f#', is assigned). The field name may also be a 2-tuple of strings where the first string is either a “title” (which may be any string or unicode string) or meta-data for the field which can be any object, and the second string is the “name” which must be a valid Python identifier. The second element, field_dtype, can be anything that can be interpreted as a data-type. The optional third element field_shape contains the shape if this field represents an array of the data-type in the second element. Note that a 3-tuple with a third argument equal to 1 is equivalent to a 2-tuple. This style does not accept align in the dtype constructor as it is assumed that all of the memory is accounted for by the array interface description.

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

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

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

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

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


以及涉及的错误...

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

NumPy
https://github.com/numpy/numpy/issues/2407
你可以在讨论中注意到(我没有在这里报告)主要有几件事:

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

Pandas
同样在 pandas 方面,报告了一个与 numpy 问题相关的问题:https://github.com/pandas-dev/pandas/pull/13462
好像不久前就修好了。

关于python - Numpy dtype - 不理解的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46329365/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com