簡體   English   中英

Numpy dtype - 無法理解數據類型

[英]Numpy dtype - data type not understood

我有一個數據框,我正在查看與每列關聯的數據類型。

當我運行時:

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 個字符的字符串?

如何將最后一個 dtype 從 '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 應該是一個字段列表,其中每個字段由長度為 2 或 3 的元組描述。(相當於__array_interface__屬性中的descr項。)

第一個元素field_name是字段名稱(如果這是'' ',則分配標准字段名稱 'f#')。 字段名稱也可以是一個 2 元組的字符串,其中第一個字符串是“標題”(可以是任何字符串或 unicode 字符串)或字段的元數據,可以是任何對象,第二個字符串是“名稱”必須是有效的 Python 標識符。 第二個元素field_dtype可以是任何可以解釋為數據類型的東西。 如果此字段表示第二個元素中數據類型的數組,則可選的第三個元素field_shape包含形狀。 請注意,第三個參數等於 1 的 3 元組等效於 2 元組。 此樣式不接受 dtype 構造函數中的 align ,因為它假定所有內存都由數組接口描述占用。

所以文檔似乎並沒有真正指定字段名稱是否可以是 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或者如果您將名稱定義為 unicode 字符串,則必須使用encode("ascii")


和涉及的錯誤......

要了解為什么會發生這種情況,查看 Numpy 和 Pandas 中報告的錯誤/問題以及相關討論很有用。

麻木
https://github.com/numpy/numpy/issues/2407
你可以在討論中注意到(我不在這里報告)主要有幾件事:

  • “問題”已經持續了一段時間
  • 人們使用的一種技巧是在 unicode 字符串上使用encode("ascii")
  • 請記住, 'whatever'字符串在 Py2/3 中具有不同的默認值(字節/Unicode)
  • @hpaulj 本人在那個問題報告中評論得很漂亮, “如果 dtype 規范是元組類型列表,它會檢查每個名稱是否是字符串(由 py2 或 3 定義)但是如果 dtype 規范是字典{'names':[ alist], 'formats':[alist]...} ,py2 大小寫也允許 unicode 名稱“

熊貓
同樣在熊貓方面,已經報告了一個與 numpy 問題相關的問題: https : //github.com/pandas-dev/pandas/pull/13462
好像不久前就修好了。

升級numpy后我遇到了這個問題。 一些以前工作的代碼在那之后突然停止工作。 重新安裝 numpy 為我解決了這個問題:

pip install --upgrade --force-reinstall numpy

更新

我剛剛再次遇到同樣的問題,並在這里找到了解決方案。 我更新了庫 pandas、matplotlib 和 seaborn 以(重新)啟用我的基於 numpy 的渲染:

pip install --upgrade pandas matplotlib seaborn

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM