我有包含“DaysFrom”列的记录,以及包含标准“DaysFrom”集值的其他列:
'Date' 'DaysFrom' '90' '180' '360'
2023-11-04 135 4 5 12
2023-11-05 360 3 5 20
2023-11-06 270 5 7 15
2023-11-07 180 6 3 10
我想计算“DaysFrom”列中的值的线性插值(“IntVal”):
'Date' 'DaysFrom' '90' '180' '360' 'IntVal'
2023-11-04 135 4 5 12 4.5
2023-11-05 360 3 5 20 20
2023-11-06 270 5 7 15 11
2023-11-07 180 6 3 10 3
为了便于计算,上面的示例仅使用位于一列或两列之间的“DaysFrom”值,但“DaysFrom”可以是 90 到 360 之间的任意值。
您可以根据
DaysFrom
范围有条件地进行线性插值:
import numpy as np
first_h = (df.DaysFrom - 90) / 90 * (df['180'] - df['90']) + df['90']
second_h = (df.DaysFrom - 180) / 180 * (df['360'] - df['180']) + df['180']
df['IntVal'] = np.where(df.DaysFrom < 180, first_h, second_h)
df
# Date DaysFrom 90 180 360 IntVal
#0 2023-11-04 135 4 5 12 4.5
#1 2023-11-05 360 3 5 20 20.0
#2 2023-11-06 270 5 7 15 11.0
#3 2023-11-07 180 6 3 10 3.0
如果您想使用所有值进行插值(如果它们不全部在一条直线上),您可以使用
numpy.interp
: 循环遍历行
import numpy as np
cols = df.columns[2:]
tmp = df[cols]
df['IntVal'] = [np.interp(df.loc[i, 'DaysFrom'], cols, tmp.loc[i])
for i in df.index]
输出:
Date DaysFrom 90 180 360 IntVal
0 2023-11-04 135 4 5 12 4.5
1 2023-11-05 360 3 5 20 20.0
2 2023-11-06 270 5 7 15 11.0
3 2023-11-07 180 6 3 10 3.0