Pandas.DataFrame interpolate () con el método = ‘linear’ y ‘más cercano’ devuelve resultados inconsistentes para NaN al final

Estaba explorando pandas.DataFrame.interpolate() con diferentes métodos, linear frente a nearest , y encontré diferentes resultados de los dos métodos cuando faltan datos en el final.

Por ejemplo:

 import pandas as pd # version: '0.16.2' or '0.20.3' >>> a = pd.DataFrame({'col1': [np.nan, 1, np.nan, 3, np.nan, 5, np.nan]}) Out[1]: col1 0 NaN 1 1.0 2 NaN 3 3.0 4 NaN 5 5.0 6 NaN >>> a.interpolate(method='linear') Out[2]: col1 0 NaN 1 1.0 2 2.0 3 3.0 4 4.0 5 5.0 6 5.0 >>> a.interpolate(method='nearest') Out[3]: col1 0 NaN 1 1.0 2 1.0 3 3.0 4 3.0 5 5.0 6 NaN 

Parece que el método linear hará la extrapolación del NaN final, mientras que el método “más cercano” no lo hará, a menos que especifique fill_value = 'extrapolate' :

 >>> a.interpolate(method='nearest', fill_value='extrapolate') Out[4]: col1 0 NaN 1 1.0 2 1.0 3 3.0 4 3.0 5 5.0 6 5.0 

Entonces, mi pregunta es ¿por qué los dos métodos se comportan de manera diferente en el manejo de NaN? ¿Es lo que se supone que es o es un error?

Los mismos resultados se encontraron con dos versiones de pandas, ‘0.16.2’ y ‘0.20.3’.

pandas.Series.interpolate() también muestra el mismo problema.

Hay un tema y un tema de github hablando de un problema similar pero con un propósito diferente. Estoy buscando una explicación o una conclusión para este problema.

EDITAR:

Corrección: la forma en que se comporta el método linear no es exactamente una extrapolation , ya que puede ver que el valor completado de la última fila es 5 en lugar de 6. Ahora parece un error, ¿verdad?

De forma predeterminada, df.interpolate(method='linear') reenvía los NaN después del último valor válido. Esto es bastante sorprendente, dado que el nombre del método solo menciona “interpolar”.

Para restringir df.interpolate para interpolar solo NaNs entre valores válidos (no NaN), a partir de Pandas versión 0.23.0 (Referencia) , use limit_area='inside' .

 import pandas as pd import numpy as np a = pd.DataFrame({'col1': [np.nan, 1, np.nan, 3, np.nan, 5, np.nan]}) a['linear'] = a.interpolate(method='linear')['col1'] a['linear inside'] = a.interpolate(method='linear', limit_area='inside')['col1'] print(a) 

rendimientos

  col1 linear linear inside 0 NaN NaN NaN 1 1.0 1.0 1.0 2 NaN 2.0 2.0 3 3.0 3.0 3.0 4 NaN 4.0 4.0 5 5.0 5.0 5.0 6 NaN 5.0 NaN 

@ D. Es una gran pregunta, permítame explicarlo en profundidad y no hay ningún tema de tema y github. Déjame explicarte paso a paso.

 >>> a = pd.DataFrame({'col1': [np.nan, 1, np.nan, 3, np.nan, 5, np.nan]}) Out[1]: col1 0 NaN 1 1.0 2 NaN 3 3.0 4 NaN 5 5.0 6 NaN 

1.) Interpolación por ‘lineal’

En la interpolación ‘lineal’, los valores faltantes se llenan con dos valores de posición más cercanos. Mientras que en la interpolación “más cercana” llenará los valores faltantes por los valores circundantes más cercanos, sin embargo, en “más cercano” el valor faltante tendrá los mismos valores que el valor de posición cercano. He explicado más detalladamente la interpolación “más cercana” en la sección (2).

Emaple para la interpolación ‘lineal’:

  1 1.0 1. 1.0 2 NaN 2. 2.0 3 3.0 3. 3.0 4 NaN 4. 4.0 

Aquí, la segunda posición está vacía. Entonces, para completar los valores, tomará los valores de las posiciones 1 y 3, que son 1.0 y 3.0 respectivamente. Recuerde nuevamente en la interpolación ‘lineal’ que toma solo 2 valores circundantes para completar el valor faltante.

 (1.0+3.0/2) =2.0 = Answer for 2nd position. Similarly it will be for other values. 

2.) Interpolar por ‘más cercano’

 >>> a.interpolate(method='nearest') Out[3]: col1 0 NaN 1 1.0 2 1.0 3 3.0 4 3.0 5 5.0 6 NaN 

Básicamente, en la interpolación ‘más cercana’ llena los valores faltantes por los mismos valores de los valores más cercanos. Por ejemplo,

 1 1.0 1. 1.0 2 NaN 2. 1.0 3 3.0 3. 3.0 4 NaN 4. 3.0 

Entonces, en el ejemplo anterior, puede ver fácilmente que la posición 2 toma el mismo valor de la posición 1 porque es el valor más cercano a la posición 1. En resumen, tenga en cuenta que en la interpolación “más cercana”, los valores faltantes se llenan con el mismo valor con la ayuda de los valores circundantes más cercanos.

En method = ‘closest’, fill_value = ‘extrapolate’ puede ver en su ejemplo que llenará los últimos valores con el mismo valor que la 5ª posición. El concepto sigue siendo el mismo que para llenar los valores faltantes como se explicó anteriormente.

NOTA: Además, hay otros métodos de interpolación como “bilineal”, “bicúbico”, etc. Se trata de precisión para completar los valores faltantes.

Mi sugerencia es si desea hacer una selección de interpolación ‘más cercana’ y ‘lineal’. Yo diría que vaya con interpolación ‘lineal’ porque llenará los valores con mayor precisión que el de la interpolación ‘más cercana’.

Espero que esto te ayude. ¡Buena suerte!