Python

在 Python Quantopian 中刪除 NaN 值

  • November 21, 2016

我正在嘗試在 numpy 中製作直方圖,但 numpy.histogram 似乎真的很討厭 NaN 值。我嘗試以三種不同的方式從名為 data 的列表中刪除 NaN 值,但 Quantopian 不允許我使用這三種方式中的任何一種:1.) TypeError: 只有具有一個元素的整數數組可以轉換為索引

data = data[~np.isnan(data)]

2.) 然後我嘗試使用 pandas.dropna() 並拋出:ValueError:具有多個元素的數組的真值是不明確的。使用 a.any() 或 a.all()

datapd = pd.Series(data)
hist, bins = np.histogram(datapd.dropna(), density=True, bins = 'auto')

3.)當這不起作用時,我嘗試自己刪除它們:

i = 0
   while(i < len(y)):
       if(float('nan') == y[i]):
           y[i] = 0
       i = i + 1

它拋出了同樣的錯誤:ValueError:具有多個元素的數組的真值不明確。使用 a.any() 或 a.all()

你如何刪除 quantopian 中的 NaN 值?我在 python 控制台中嘗試了這些方法並且它起作用了我不知道為什麼它在 quantopian 中不起作用。

一般來說,您可能應該看看以下答案:

但是,我想談談第 3 點。

  1. 您應該使用numpy來檢查NaNs,而不是使用等號運算符。np.isnan(...).
  2. 你不應該使用while循環。這是非常不合時宜的。
  3. 你的 if 語句不應該有括號。
  4. 部分的縮進while應該使這個腳本失敗。
  5. 請記住,您正在使用行。如果您的程式碼按照您展示的方式實現,則不應出現模棱兩可的真值錯誤。

也許你寫了這樣的東西:

i = 0
while(i < len(y)):
   if np.isnan(y[i]):
       y[i] = 0
   i = i + 1

這會產生:

ValueError:具有多個元素的數組的真值不明確。使用 a.any() 或 a.all()

這裡發生的是 if 語句獲取一個布爾列表,並且不知道如何處理它。當所有這些都是真的時,它是真的嗎?或者,當其中任何一個為真時,它是真的嗎?您可以按如下方式解決它:

i = 0
while(i < len(y)):
   if np.isnan(y[i]).any():
       y[i] = 0
   i = i + 1

或者更多pythonic:

for i in range(0, len(y)):
   if np.isnan(y[i]).any():
       y[i] = 0

還要注意零分配。我不知道 pandas 數據幀是如何實現的,但通常使用普通集合類型,您會用數字零 (0) 替換一行。

如果我們不使用特殊的 pandas 數據框,那隻是我會選擇的列表:

y = [row for row in y if not np.isnan(row).any()]

…如果您想刪除具有任何NaN值的行。

或者,如果您只是想將任何元素設置NaN為零:

y = [[0 if np.isnan(elm) else elm for elm in row] for row in y]

有測試數據:

import numpy as np
y = [[0,0],[1,1],[2,float('nan')],[3,3]]
print(y)
x = [row for row in y if not np.isnan(row).any()]
print(x)
z = [[0 if np.isnan(elm) else elm for elm in row] for row in y]
print(z)

這會產生以下輸出:

[[0, 0], [1, 1], [2, nan], [3, 3]]
[[0, 0], [1, 1], [3, 3]]
[[0, 0], [1, 1], [2, 0], [3, 3]]

引用自:https://quant.stackexchange.com/questions/31094