Почему select вызывает FutureWarning?

В моем коде есть 2D-массив numpy.ndarray, заполненный значениями numpy.str_. Я пытаюсь изменить значения «null» на «nan» с помощью метода выбора. Проблема в том, что этот метод вызывает FutureWarning.

Я прочитал это. По предложению там я попытался не сравнивать строки Python с строками Numpy, а преобразовать строку Python в строку Numpy в начале. Очевидно, это не помогает, и я ищу совета.

Я бы не хотел отключать предупреждение (как в ссылке). Мне это кажется очень грязным подходом.

Мой фрагмент кода:

import pandas_datareader as pd
import numpy as np
import datetime as dt


start_date = dt.datetime(year=2013, month=1, day=1)
end_date = dt.datetime(year=2013, month=2, day=1)
df = pd.DataReader("AAA", "yahoo", start_date, end_date + dt.timedelta(days=1))
array = df.to_numpy()

null = np.str_("null")
nan = np.str_("nan")
array = np.select([array == null, not array == null], [nan, array])
print(array[0][0].__class__)
print(null.__class__)
C\Python\Project.py:13: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  array = np.select([array == null, not array == null], [nan, array])
<class 'numpy.str_'>
<class 'numpy.str_'>

Я новичок в Python, поэтому я буду благодарен за любую помощь. А также - если у вас есть лучший способ добиться этого, пожалуйста, дайте мне знать.

Спасибо!

Изменить: извините за это. Теперь должно работать как есть.


person Tomáš Hons    schedule 18.07.2019    source источник
comment
Можно ли получить пример начального значения для array, которое вызывает эту проблему? (Желательно очень короткий, в соответствии с минимальной частью определения минимального воспроизводимого примера). Как бы то ни было, код нельзя использовать для тестирования предлагаемых исправлений, потому что его нельзя запустить без изменений (или, скорее, при запуске без изменений возникает совершенно другая проблема).   -  person Charles Duffy    schedule 19.07.2019
comment
Этот код вернет 'array' is not defined, поскольку вы что-то сравниваете с array до того, как определили array.   -  person Dodge    schedule 19.07.2019


Ответы (1)


У меня пока нет 50 репутации, поэтому я не могу комментировать ..

Насколько я понимаю, вместо этого вы хотите изменить только al 'null'-entries на 'nan'?

Ваш код создает массив чисел с плавающей запятой, но по какой-то причине вы ожидаете, что в массиве будут строки из 'null'? Возможно, тебе стоило написать

array = df.to_numpy()
array = array.astype(str)

чтобы было понятнее.

Отсюда массив состоит только из строк, и для изменения с 'null' на 'nan' вам нужно только написать

array[array == 'null'] = 'nan'

и предупреждение исчезло. Вам даже не нужно использовать np.select.

Если вам нужны значения с плавающей запятой в вашем массиве, вы можете использовать собственный np.nan Numpy вместо строки и сделать

array = array.astype(float)

nan-строки автоматически преобразуются в np.nan, который рассматривается как число с плавающей запятой.

person Anders BB    schedule 03.03.2020