Объясните любопытное поведение Pandas .Series.interpolate - PullRequest
0 голосов
/ 10 января 2020
s = pd.Series([0, 2, np.nan, 8])
print(s)

interp = s.interpolate(method='polynomial', order=2)
print(interp)

Это печатает:

0    0.0
1    2.0
2    NaN
3    8.0
dtype: float64
0    0.000000
1    2.000000
2    4.666667
3    8.000000
dtype: float64

Теперь, если я добавлю еще np.nan к series,

s = pd.Series([0, 2, np.nan, np.nan, 8])
print(s)

interp = s.interpolate(method='polynomial', order=2)
print(interp)

, я получу гораздо более точные результаты:

0    0.0
1    2.0
2    NaN
3    NaN
4    8.0
dtype: float64
0    0.0
1    2.0
2    4.0
3    6.0
4    8.0
dtype: float64

Является ли Series.interpolate recursive тем, что он использует интерполированные значения для дальнейших интерполированных значений, которые затем могут повлиять на ранее интерполированные значения?

1 Ответ

1 голос
/ 10 января 2020

Вы на самом деле интерполируете две разные функции!

В первом случае вы ищете функцию, которая проходит через следующие пункты:
(0,0) , (1,2), ( 3 , 8)
Но во втором случае вы ищете функцию, которая проходит следующие пункты:
(0,0), (1, 2), ( 4 , 8)

Индексы pd.Series представляют точки на оси X, а данные pd.Series представляют точки на Ось Y.

Итак, попробуйте следующее изменение в вашем первом примере:
s = pd.Series([0, 2, np.nan, 8])

s = pd.Series([0, 2, np.nan, 8], [0,1,2,4])
s.interpolate(method='polynomial', order=2)

Вы должны получить вывод:

0    0.0
1    2.0
2    4.0
4    8.0
dtype: float64

В качестве альтернативы вы также можете сделать: s = pd.Series([0, 2, np.nan, 8], [0,1,3,4])
и вывод:

0    0.0
1    2.0
3    6.0
4    8.0
dtype: float64

Надеюсь, это поможет.

...