Pandas.DataFrame interpolate () с method = 'linear' и 'near' возвращает противоречивые результаты для конечного NaN - PullRequest
0 голосов
/ 20 февраля 2019

Я исследовал pandas.DataFrame.interpolate() разными методами, linear против nearest, и я обнаружил разные результаты двух методов, когда в трейлинге отсутствуют данные.

Например:

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

Похоже, что метод linear выполнит экстраполяцию конечного NaN, а метод "ближайший" - нет, если вы не укажете 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

Так что мой вопроспочему два метода ведут себя по-разному при обработке конечного NaN?Это то, что должно быть, или это ошибка?

Такие же результаты были найдены с двумя версиями панд, '0.16.2' и '0.20.3'.

pandas.Series.interpolate() также показывает ту же проблему.

Существует thread и github-проблема , в которой говорится об аналогичной проблеме, но с другой целью.Я ищу объяснение или заключение по этому вопросу.

РЕДАКТИРОВАТЬ:

Исправление: метод linear ведет себя не совсем extrapolation, как вы можете видеть заполненное значениепоследней строки 5 вместо 6. Теперь это больше похоже на ошибку, не так ли?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

По умолчанию df.interpolate(method='linear') заполняет вперед NaNs после последнего действительного значения.Это довольно удивительно, учитывая, что в имени метода упоминается только «интерполировать».

Чтобы ограничить df.interpolate только интерполяцией NaN между действительными (не NaN) значениями, начиная с версии Pandas 0.23.0 (Ссылка) , используйте 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)

выход

   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
0 голосов
/ 20 февраля 2019
* 1000000@D.We это большой вопрос, позвольте мне объяснить в глубине, и нет никакой проблемы с GitHub.Позвольте мне объяснить шаг за шагом.
>>> 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.) Интерполяция с помощью «линейной»

При «линейной» интерполяции пропущенные значения заполняются двумя значениями ближайших позиций.В то время как в «ближайшей» интерполяции он заполнит пропущенные значения ближайшими окружающими значениями, однако, в «ближайшем» пропущенное значение будет иметь те же значения, что и значение соседней позиции.Я объяснил «ближайшую» интерполяцию более подробно в разделе (2).

Emaple для «линейной» интерполяции:

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

Здесь вторая позиция пуста.Таким образом, чтобы заполнить его значениями, понадобятся значения позиций 1 и 3, которые равны 1,0 и 3,0 соответственно.Помните еще раз: в линейной интерполяции требуется всего 2 окружающих значения, чтобы заполнить недостающее значение.

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

2.) Интерполировать по «ближайшему»

>>> 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

По сути, при «ближайшей» интерполяции он заполняет отсутствующие значения теми же значениями из ближайших значений.Например,

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

Итак, в приведенном выше примере вы легко можете увидеть, что позиция 2 занимает то же значение, что и позиция 1, поскольку она является ближайшим значением к позиции 1.Вкратце, просто имейте в виду, что в «ближайшей» интерполяции недостающие значения заполняются одним и тем же значением с помощью ближайших окружающих значений.

В методе = «ближайшее», fill_value = «экстраполировать» выможете видеть, что в вашем примере он заполнит последние значения тем же значением 5-й позиции.Концепция остается той же, что и для заполнения пропущенных значений, как описано выше.

ПРИМЕЧАНИЕ. Кроме того, существуют другие методы интерполяции, такие как «билинейный», «бикубический» и т. Д. Все дело в точности заполненияпропущенные значения.

Я предлагаю, если вы хотите сделать выбор из «ближайшей» и «линейной» интерполяции.Я бы сказал, что следует использовать «линейную» интерполяцию, поскольку она будет заполнять значения более точно, чем при «ближайшей» интерполяции.

Надеюсь, это поможет вам.Удачи!

...