Поскольку у меня есть NaN в моем df (их нельзя заменить никаким другим значением), функция findmax() возвращает NaN как наибольшее найденное значение, что совершенно бесполезно... Я читал несколько блогов и сообщений и ничего не нашел. Чтобы быть более конкретным, могу ли я сделать эту функцию такой же, как np.nanmax() в python?
findmax
не то же самое, что np.nanmax
. Я предполагаю, что вам нужна функциональность np.nanmax
, затем выполните:
julia> your_vector = [1.0, NaN, 3.0, NaN, 2.0]
5-element Vector{Float64}:
1.0
NaN
3.0
NaN
2.0
julia> maximum(skipmissing(isnan(x) ? missing : x for x in your_vector))
3.0
julia> your_vector = [NaN, NaN]
2-element Vector{Float64}:
NaN
NaN
julia> maximum(skipmissing(isnan(x) ? missing : x for x in your_vector))
ERROR: ArgumentError: reducing over an empty collection is not allowed
Хитрость заключается в том, чтобы заменить NaN
на missing
(но без материализации результата для экономии памяти), а затем пропустить missing
. Обратите внимание, что я предложил решение, при котором возникают ошибки, когда присутствуют только NaN
. В Python вы получите предупреждение, но в Julia мы обычно избегаем вывода предупреждений, поскольку их очень легко потерять незамеченными, и вместо этого требуется явная обработка или ситуация с ошибкой.
Теперь вы можете спросить, почему нет простого решения для NaN
, но есть решение для missing
(как и в случае с missing
вы бы просто написали maximum(skipmissing(your_vector))
)? Ответ заключается в том, что значения NaN
обычно не встречаются в кодах Джулии (если только у вас нет каких-либо вычислений, которые производят NaN
), в то время как в Python NaN
часто используется как значение, которое сигнализирует о том, что у нас есть отсутствующее значение в данных (что распространено).
Возможно, более простое решение (и, кажется, более быстрое), чем прохождение skipmissing
, это:
foo(itr) = maximum(x for x in itr if !isnan(x))
Правильно - это лучшее решение. Я изначально рассматривал, но с findmax
не работает, но и с skipmissing
тоже не работает.
То, что предложил @DNF, лучше.