我正在尝试对数据集使用三次样条插值(如图所示)。 CubicSpline 函数要求所有数字都是有限的,我如何使用它通过插值来填充每个 NaN 值?
df = pd.DataFrame()
df['t'] = np.arange(1,11)
n = np.nan
df['r'] = [0, n, n, 0.5, n, 0.3, n, n, n, 0.4]
cs = CubicSpline(df['t'], df['r'])
这会抛出错误“
y
必须仅包含有限值。”
我尝试用 0 替换所有 NaN,但这会返回一个以 0 为中心的样条曲线,并针对每个已知值向上跳跃。
我建议删除 NA 值,将样条线拟合到非 NA 值,并使用 fillna 将 NA 值替换为样条线插值值。
import pandas as pd
from scipy.interpolate import CubicSpline
import numpy as np
df = pd.DataFrame()
df['t'] = np.arange(1,11)
n = np.nan
df['r'] = [0, n, n, 0.5, n, 0.3, n, n, n, 0.4]
df.index = np.arange(1, 11)
df_no_nan = df.dropna()
cs = CubicSpline(df_no_nan['t'], df_no_nan['r'])
df['r'] = df['r'].fillna(pd.Series(cs(df['t']), df['t'].index))
print(df)
输出:
t r
1 1 0.000000
2 2 0.339259
3 3 0.489444
4 4 0.500000
5 5 0.420370
6 6 0.300000
7 7 0.188333
8 8 0.134815
9 9 0.188889
10 10 0.400000