Pandas.DataFrame interpolate() with method='linear' and 'nearest' returns 尾随 NaN 的结果不一致
Pandas.DataFrame interpolate() with method='linear' and 'nearest' returns inconsistent results for trailing NaN
我正在使用不同的方法探索 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 进行外推,而 "nearest" 方法不会,除非您指定 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 时表现不同?它应该是什么还是一个错误?
在 pandas、“0.16.2”和“0.20.3”的两个版本中发现了相同的结果。
pandas.Series.interpolate()
也显示了同样的问题。
有一个 thread and a github issue 在谈论类似的问题,但目的不同。我正在寻找这个问题的解释或结论。
编辑:
更正:linear
方法的行为方式并不完全是 extrapolation
,因为您可以看到最后一行的填充值是 5 而不是 6。现在看起来更像是一个错误,是吗?
@D.Weis 这是一个很好的问题,让我深入解释一下,没有线程和 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.)'linear'
插值
在'linear'插值中,缺失值由两个最近的位置值填充。在 'nearest' 插值中,它将用最近的周围值填充缺失值,但是,在 'nearest' 中,缺失值将与附近的位置值具有相同的值。我在第(2)节中更深入地解释了 'nearest' 插值。
用于 'linear' 插值的 Emaple:
1 1.0 1. 1.0
2 NaN 2. 2.0
3 3.0 3. 3.0
4 NaN 4. 4.0
这里,第二个位置是空的。因此,要填充它的值,它将采用位置 1st 和 3rd 的值,分别为 1.0 和 3.0。再次记住,在 'linear' 插值中,它只需要 2 个周围值来填充缺失值。
(1.0+3.0/2) =2.0 = Answer for 2nd position. Similarly it will be for other values.
2.) 按'nearest'
插值
>>> 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
基本上,在 'nearest' 插值中,它用最接近的值中的相同值填充缺失值。例如,
1 1.0 1. 1.0
2 NaN 2. 1.0
3 3.0 3. 3.0
4 NaN 4. 3.0
因此,在上面的示例中,您可以很容易地看到位置 2nd 与位置 1st 具有相同的值,因为它是距离 1st 位置最近的值。总之,请记住,在 'nearest' 插值中,缺失值在最近的周围值的帮助下由相同的值填充。
在 method='nearest', fill_value='extrapolate'
中,您可以在示例中看到它将使用与第 5 个位置相同的值填充最后一个值。如上所述,该概念与填充缺失值的概念相同。
注意:
此外,还有其他插值方法,如'bilinear'、'bicubic'等,都是为了填补缺失值的准确性。
我的建议是如果你想从'nearest'和'linear'插值中进行选择。我会说使用 'linear' 插值,因为它会比 'nearest' 插值更准确地填充值。
希望这对您有所帮助。祝你好运!
默认情况下,df.interpolate(method='linear')
在最后一个有效值之后向前填充 NaN。鉴于方法名称仅提及 "interpolate".
,这相当令人惊讶
要限制 df.interpolate
仅在有效(非 NaN)值之间插入 NaN,
从 Pandas 版本 0.23.0 (Reference), 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)
产量
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
我正在使用不同的方法探索 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 进行外推,而 "nearest" 方法不会,除非您指定 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 时表现不同?它应该是什么还是一个错误?
在 pandas、“0.16.2”和“0.20.3”的两个版本中发现了相同的结果。
pandas.Series.interpolate()
也显示了同样的问题。
有一个 thread and a github issue 在谈论类似的问题,但目的不同。我正在寻找这个问题的解释或结论。
编辑:
更正:linear
方法的行为方式并不完全是 extrapolation
,因为您可以看到最后一行的填充值是 5 而不是 6。现在看起来更像是一个错误,是吗?
@D.Weis 这是一个很好的问题,让我深入解释一下,没有线程和 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.)'linear'
插值在'linear'插值中,缺失值由两个最近的位置值填充。在 'nearest' 插值中,它将用最近的周围值填充缺失值,但是,在 'nearest' 中,缺失值将与附近的位置值具有相同的值。我在第(2)节中更深入地解释了 'nearest' 插值。
用于 'linear' 插值的 Emaple:
1 1.0 1. 1.0
2 NaN 2. 2.0
3 3.0 3. 3.0
4 NaN 4. 4.0
这里,第二个位置是空的。因此,要填充它的值,它将采用位置 1st 和 3rd 的值,分别为 1.0 和 3.0。再次记住,在 'linear' 插值中,它只需要 2 个周围值来填充缺失值。
(1.0+3.0/2) =2.0 = Answer for 2nd position. Similarly it will be for other values.
2.) 按'nearest'
插值>>> 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
基本上,在 'nearest' 插值中,它用最接近的值中的相同值填充缺失值。例如,
1 1.0 1. 1.0
2 NaN 2. 1.0
3 3.0 3. 3.0
4 NaN 4. 3.0
因此,在上面的示例中,您可以很容易地看到位置 2nd 与位置 1st 具有相同的值,因为它是距离 1st 位置最近的值。总之,请记住,在 'nearest' 插值中,缺失值在最近的周围值的帮助下由相同的值填充。
在 method='nearest', fill_value='extrapolate'
中,您可以在示例中看到它将使用与第 5 个位置相同的值填充最后一个值。如上所述,该概念与填充缺失值的概念相同。
注意: 此外,还有其他插值方法,如'bilinear'、'bicubic'等,都是为了填补缺失值的准确性。
我的建议是如果你想从'nearest'和'linear'插值中进行选择。我会说使用 'linear' 插值,因为它会比 'nearest' 插值更准确地填充值。
希望这对您有所帮助。祝你好运!
默认情况下,df.interpolate(method='linear')
在最后一个有效值之后向前填充 NaN。鉴于方法名称仅提及 "interpolate".
要限制 df.interpolate
仅在有效(非 NaN)值之间插入 NaN,
从 Pandas 版本 0.23.0 (Reference), 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)
产量
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