使用Pandas在列间对任意值进行线性插值计算
问题
我有一组包含DaysFrom列的记录,同时还有对应标准天数(90、180、360)的数值列,原始数据如下:
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之间的任意值。
解决方案
可以通过条件判断结合线性插值公式实现,以下以SQL为例:
SELECT Date, DaysFrom, "90", "180", "360", CASE -- 匹配标准天数时直接取对应列值 WHEN DaysFrom = 90 THEN "90" WHEN DaysFrom = 180 THEN "180" WHEN DaysFrom = 360 THEN "360" -- 90-180区间插值计算 WHEN DaysFrom BETWEEN 90 AND 180 THEN "90" + ("180" - "90") * (DaysFrom - 90) / (180 - 90) -- 180-360区间插值计算 WHEN DaysFrom BETWEEN 180 AND 360 THEN "180" + ("360" - "180") * (DaysFrom - 180) / (360 - 180) END AS IntVal FROM your_table_name;
插值逻辑说明
线性插值核心是基于区间内的比例计算:
- 若当前
DaysFrom值为x,落在区间[x_low, x_high],对应区间的数值为y_low和y_high - 插值结果 =
y_low + (y_high - y_low) * (x - x_low)/(x_high - x_low)
比如示例中2023-11-04的DaysFrom=135,落在90和180之间:4 + (5-4)*(135-90)/(180-90) = 4 + 1*45/90 = 4.5,与期望结果一致;
2023-11-06的DaysFrom=270,落在180和360之间:7 + (15-7)*(270-180)/(360-180) =7 +8*90/180=7+4=11,符合预期。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

