Pandasmethod='index'时的插值类型?
Pandas interpolation type when method='index'?
pandasdocumentation表示当method='index'
时,使用索引的数值。但是,我还没有发现任何迹象表明所采用的基础插值方法。看起来它使用线性插值。任何人都可以明确地确认这一点或指出我在文档中的说明吗?
事实证明该文档有点误导阅读它的人可能会想:
‘index’, ‘values’: use the actual numerical values of the index.
as 用索引的数值填充NaN值这是不正确的,我们应该将其理解为线性插值使用实际数值指数
source code of pandas.DataFrame.interpolate中method='linear'
和method='index'
的区别主要在以下代码:
if method == "linear":
# prior default
index = np.arange(len(obj.index))
index = Index(index)
else:
index = obj.index
因此,如果您使用默认的 RangeIndex
作为数据帧的索引,那么 method='linear'
和 method='index'
的插值结果将是相同的,但是如果您指定不同的索引,则结果会不一样,下面的例子会清楚地告诉你区别:
import pandas as pd
import numpy as np
d = {'val': [1, np.nan, 3]}
df0 = pd.DataFrame(d)
df1 = pd.DataFrame(d, [0, 1, 6])
print("df0:\nmethod_index:\n{}\nmethod_linear:\n{}\n".format(df0.interpolate(method='index'), df0.interpolate(method='linear')))
print("df1:\nmethod_index:\n{}\nmethod_linear:\n{}\n".format(df1.interpolate(method='index'), df1.interpolate(method='linear')))
输出:
df0:
method_index:
val
0 1.0
1 2.0
2 3.0
method_linear:
val
0 1.0
1 2.0
2 3.0
df1:
method_index:
val
1 1.000000
2 1.333333
6 3.000000
method_linear:
val
1 1.0
2 2.0
6 3.0
可以看到,当index=[0, 1, 6]
和val=[1.0, 2.0, 3.0]
时,插值是1.0 + (3.0-1.0) / (6-0) = 1.333333
在pandas源代码(generic.py -> managers.py -> blocks.py -> missing.py)的运行时,我们可以找到线性插值的实现使用索引的实际数值:
NP_METHODS = ["linear", "time", "index", "values"]
if method in NP_METHODS:
# np.interp requires sorted X values, #21037
indexer = np.argsort(inds[valid])
result[invalid] = np.interp(
inds[invalid], inds[valid][indexer], yvalues[valid][indexer]
)
pandasdocumentation表示当method='index'
时,使用索引的数值。但是,我还没有发现任何迹象表明所采用的基础插值方法。看起来它使用线性插值。任何人都可以明确地确认这一点或指出我在文档中的说明吗?
事实证明该文档有点误导阅读它的人可能会想:
‘index’, ‘values’: use the actual numerical values of the index.
as 用索引的数值填充NaN值这是不正确的,我们应该将其理解为线性插值使用实际数值指数
source code of pandas.DataFrame.interpolate中method='linear'
和method='index'
的区别主要在以下代码:
if method == "linear":
# prior default
index = np.arange(len(obj.index))
index = Index(index)
else:
index = obj.index
因此,如果您使用默认的 RangeIndex
作为数据帧的索引,那么 method='linear'
和 method='index'
的插值结果将是相同的,但是如果您指定不同的索引,则结果会不一样,下面的例子会清楚地告诉你区别:
import pandas as pd
import numpy as np
d = {'val': [1, np.nan, 3]}
df0 = pd.DataFrame(d)
df1 = pd.DataFrame(d, [0, 1, 6])
print("df0:\nmethod_index:\n{}\nmethod_linear:\n{}\n".format(df0.interpolate(method='index'), df0.interpolate(method='linear')))
print("df1:\nmethod_index:\n{}\nmethod_linear:\n{}\n".format(df1.interpolate(method='index'), df1.interpolate(method='linear')))
输出:
df0:
method_index:
val
0 1.0
1 2.0
2 3.0
method_linear:
val
0 1.0
1 2.0
2 3.0
df1:
method_index:
val
1 1.000000
2 1.333333
6 3.000000
method_linear:
val
1 1.0
2 2.0
6 3.0
可以看到,当index=[0, 1, 6]
和val=[1.0, 2.0, 3.0]
时,插值是1.0 + (3.0-1.0) / (6-0) = 1.333333
在pandas源代码(generic.py -> managers.py -> blocks.py -> missing.py)的运行时,我们可以找到线性插值的实现使用索引的实际数值:
NP_METHODS = ["linear", "time", "index", "values"]
if method in NP_METHODS:
# np.interp requires sorted X values, #21037
indexer = np.argsort(inds[valid])
result[invalid] = np.interp(
inds[invalid], inds[valid][indexer], yvalues[valid][indexer]
)