matplotlib / matplotlib/mplfinance

Bug Report:

Abierto
#686 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug
Lenguaje dominante
Python
Estrellas
4.4k
Forks
678
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

Bug when using box_size = 'atr' in pnf charts in mplfinance : FutureWarning: Series.getitem treating keys as positions is deprecated

OS Win 11 Pro 24H2 Desktop
IDE Visual Studio Code 1.96.2
Python 3.12.8
mplfinance 0.12.10b0

When using the 'atr' box_size parameter in creating pnf charts in mplfinance the _utils.py script throws this warning

\mplfinance_utils.py:129: FutureWarning: Series.getitem treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use ser.iloc[pos] high = highs[i]
\mplfinance_utils.py:130: FutureWarning: Series.getitem treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use ser.iloc[pos] low = lows[i]
_utils.py:131: FutureWarning: Series.getitem treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use ser.iloc[pos] close_prev = closes[i-1]

This is the responsible function:

def _calculate_atr(atr_length, highs, lows, closes):
    """Calculate the average true range
    atr_length : time period to calculate over
    all_highs : list of highs
    all_lows : list of lows
    all_closes : list of closes
    """
    if atr_length < 1:
        raise ValueError("Specified atr_length may not be less than 1")
    elif atr_length >= len(closes):
        raise ValueError("Specified atr_length is larger than the length of the dataset: " + str(len(closes)))
    atr = 0
    for i in range(len(highs)-atr_length, len(highs)):
        high = highs[i]
        low = lows[i]
        close_prev = closes[i-1]
        tr = max(abs(high-low), abs(high-close_prev), abs(low-close_prev))
        atr += tr
    return atr/atr_length

This warning is suppressed when you modify the code like so

high = highs.iloc[i]
low = lows.iloc[i]
close_prev = closes.iloc[i-1]

This however creates a new problem if you subsequently run a Renko chart, you get this error

LocalCache\local-packages\Python312\site-pa
high = highs.iloc[i]
^^^^^^^^^^
AttributeError: 'numpy.ndarray' object has no attribute 'iloc'

To fix this I created a small helper function

def safe_indexing(data, index):
    if isinstance(data, pd.Series):
        return data.iloc[index]
    else:
        return data[index]

and placed it in _utils.py
and updated _utils.py

high = highs[i]
low = lows[i]
close_prev = closes[i-1]

to

high = safe_indexing(highs, i)
low = safe_indexing(lows, i)
close_prev = safe_indexing(closes, i-1)

Now both charts render with no messages

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza en _utils.py, en _calculate_atr, y sigue cómo se proporcionan sus entradas highs, lows y closes para los gráficos PNF y Renko. Reproduce ambos casos de gráficos del informe y verifica después que la advertencia haya desaparecido para PNF y que la ruta de Renko ya no produzca el error de atributo de ndarray indicado.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
pandas, python
Área
data-visualization
Tipo de issue
Error
Dificultad
2/5
Tiempo estimado
1-3 horas
Estado de actividad
Estancado
Claridad
Bien especificado
Aptitud para principiantes
55/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.