Как игнорировать ошибки времени выполнения, даже если NaN заполнены из np.nanstd?- питон - PullRequest
0 голосов
/ 28 декабря 2018

Из приведенного ниже кода я пытаюсь нарезать три столбца данных.Поместите это в пустой массив в горизонтальной линии, затем измените его на (нет данных / 15 и 15) -> Здесь я попытался сгруппировать каждые 15 данных в строку и вычислить их стандартное отклонение.

Я бы попытался игнорировать NaNs в кадре данных, даже если они есть.Таким образом, я использовал np.nanstd.

Код показан ниже:

k=SpeedLane.iloc[:,0:3]
k = k.values
k = np.ravel(k)
k = np.reshape(k, ((len(k)//15, 15)))
Between_SL_sd = np.nanstd(k, axis=1)

Произошла ошибка после выполнения кода:

C:\Program Files\Anaconda3\lib\site-packages\numpy\lib\nanfunctions.py:1434: RuntimeWarning: Degrees of freedom <= 0 for slice. keepdims=keepdims)

У меня есть просмотрчерез документ Numpy я обнаружил, что один из массивов 15x получил все NA и вернулся к этой ошибке.

Я одобрил это и все же хочу игнорировать этот вопрос.Или есть способ, которым я могу немедленно заменить эти NaN на 0, а потом заменить на NaN, чтобы избавиться от предупреждения?

1 Ответ

0 голосов
/ 29 декабря 2018

Рассмотрим одномерный массив всех элементов nan,

arr = np.array([np.nan, np.nan, np.nan, np.nan])

np.isfinite () -> Поэлементное тестирование на конечность

bool_arr = np.isfinite(arr)
print(bool_arr)

Вывод:

[False False False False]

any -> вернет True, если в итерируемом есть значение истинности.

chk = not any(bool_arr)
print(chk)

Вывод: True

Это показывает, что все значения в массиве являются nan.Now, мы можем заменить все nan с нулями, как это,

arr = np.nan_to_num(arr, copy=True)
print(arr)

Вывод: [0. 0. 0. 0.]

Чтобы преобразовать 0 в nan, сделайте это,

arr[arr == 0] = 'nan' # or use np.nan
print(arr)

Вывод: [nan nan nan nan]

Теперь рассмотрим пример кадра данных, как показано ниже,

    col1    col2    col3    col4
0   5.0     1.0     6.0      NaN
1   2.0     2.0     1.0      NaN
2   NaN     NaN     NaN      NaN
3   3.0     4.0     NaN      NaN
4   NaN     NaN     NaN      NaN

Чтобы получить стандартное значение для каждой строки, выполните следующее:

    std = []
for row in range(len(df)):
    k = df.iloc[row].values
    bool_arr = np.isfinite(k)
    chk = not any(bool_arr)
    if chk == True:
        k = np.nan_to_num(k, copy=True)
    st = np.nanstd(k)
    if chk == True:
        st = np.nan
    std.append(st)

data = {'std_row_wise': std}
std_df = pd.DataFrame(data = data)

std_df

Вывод: каждое значение кадра данных составляет std строки.

   std_row_wise
0   2.160247
1   0.471405
2   NaN
3   0.500000
4   NaN
...