Lev*_*evi 5 python interpolation pandas
我正在探索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
Run Code Online (Sandbox Code Playgroud)
看来该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
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么这两种方法在处理尾随 NaN 时表现不同?这是它应该的样子还是一个错误?
两个版本的 pandas“0.16.2”和“0.20.3”也发现了相同的结果。
pandas.Series.interpolate()也显示了同样的问题。
有一个线程 和一个github 问题讨论了类似的问题,但目的不同。我正在寻找这个问题的解释或结论。
编辑:
更正:该linear方法的行为方式并不完全正确extrapolation,因为您可以看到最后一行的填充值为 5 而不是 6。现在看起来更像是一个错误,不是吗?
默认情况下,df.interpolate(method='linear')在最后一个有效值之后前向填充 NaN。鉴于方法名称只提到“插值”,这是相当令人惊讶的。
要限制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)
Run Code Online (Sandbox Code Playgroud)
产量
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8728 次 |
| 最近记录: |