使用 Scipy 的三次样条处理 NaN

问题描述 投票:0回答:1

我正在尝试对数据集使用三次样条插值(如图所示)。 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 为中心的样条曲线,并针对每个已知值向上跳跃。

python scipy interpolation spline
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.