#python #pandas
#python #панды
Вопрос:
Мой вопрос касается isinstance
функции, но я приведу пример:
Я пытаюсь реализовать нормализацию min-max в pandas, и, в частности, мне нужно иметь возможность устанавливать произвольные значения max и min.
Похоже, следующий код работает:
def normalize_parameter(
array,
fill_na=True,
min_bound=True,
max_bound=True,
feature_range=(0, 1),
reverse=False
):
""" Min-max normalization.
Parameters
----------
array : pd.Series
column to normalize
fill_na : bool
NaN policy: fillna with 0 (True) or not (False)
min_bound, max_bound : bool
min and max values, default (min, max values of an array)
feature_range : tuple (min, max), default=(0, 1)
scale of normalization
reverse : bool, default=False
"""
s = array.fillna(0) if fill_na else array
if isinstance(min_bound, bool):
min_bound = s.min()
if isinstance(max_bound, bool):
max_bound = s.max()
print(f"{feature_range=}; bounds: {min_bound=}, {max_bound=}; nan policy: {fill_na=}")
_min, _max = feature_range
min_max_normalization = _min ((s - min_bound) * (_max - _min) / (max_bound - min_bound))
return 1 - min_max_normalization if reverse else min_max_normalization
# takes min and max values of an array
normalize_parameter(array)
# takes min value of an array and max value of 1
normalize_parameter(array, max_bound=1)
Но я чувствую, что эту часть можно было бы изменить и сделать ее более питонической.
if isinstance(min_bound, bool):
min_bound = s.min()
Я думал, что это сработает:
min_bound = min_bound or s.min()
Но это не так, если min_bound = 0
as 0 == False
.
Как вы думаете, есть лучший способ или я должен придерживаться isinstance
?
Комментарии:
1. Используйте sentinel, а не «any bool».
min_bound = True
иmin_bound = False
не должны быть одинаковыми. ИспользуйтеNone
значения по умолчанию иmin_bound is not None
. Но никогдаmin_bound or other
.2. Один вопрос, это опечатка или предполагается, что у вас есть подчеркивание перед min, но не перед max in
_min, max = feature_range
?3. @andrasdeak ах, это имеет смысл! Спасибо
4. @jottbe этого не заметил, это действительно опечатка
5. Я бы также сделал это, как предложил @AndrasDeak, это, по-видимому, самый распространенный способ делать такие вещи.