isinstance альтернатива перезаписи значений по умолчанию

#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, это, по-видимому, самый распространенный способ делать такие вещи.