如何在长 Pandas 系列上应用三次样条插值?
How to apply cubic spline interpolation over long Pandas Series?
我需要使用三次样条插值替换 pandas 系列中缺失的数据。我发现我可以使用 pandas.Series.interpolate(method='cubic')
方法,它看起来像这样:
import numpy as np
import pandas as pd
# create series
size = 50
x = np.linspace(-2, 5, size)
y = pd.Series(np.sin(x))
# deleting data segment
y[10:30] = np.nan
# interpolation
y = y.interpolate(method='cubic')
虽然这种方法对小系列(size = 50
)工作得很好,但它似乎会导致程序冻结更大的系列(size = 5000
)。有解决方法吗?
pandas
调出 scipy
插值例程,我不确定为什么 'cubic'
如此耗内存且速度缓慢。
作为一种解决方法,您可以使用 method='spline'
(scipy ref here),它具有正确的参数,本质上给出(似乎是一些浮点差异?)结果相同,而且速度更快。
In [104]: # create series
...: size = 2000
...: x = np.linspace(-2, 5, size)
...: y = pd.Series(np.sin(x))
...:
...: # deleting data segment
...: y[10:30] = np.nan
...:
In [105]: %time cubic = y.interpolate(method='cubic')
Wall time: 4.94 s
In [106]: %time spline = y.interpolate(method='spline', order=3, s=0.)
Wall time: 1 ms
In [107]: (cubic == spline).all()
Out[107]: False
In [108]: pd.concat([cubic, spline], axis=1).loc[5:35, :]
Out[108]:
0 1
5 -0.916444 -0.916444
6 -0.917840 -0.917840
7 -0.919224 -0.919224
8 -0.920597 -0.920597
9 -0.921959 -0.921959
10 -0.923309 -0.923309
11 -0.924649 -0.924649
12 -0.925976 -0.925976
13 -0.927293 -0.927293
我需要使用三次样条插值替换 pandas 系列中缺失的数据。我发现我可以使用 pandas.Series.interpolate(method='cubic')
方法,它看起来像这样:
import numpy as np
import pandas as pd
# create series
size = 50
x = np.linspace(-2, 5, size)
y = pd.Series(np.sin(x))
# deleting data segment
y[10:30] = np.nan
# interpolation
y = y.interpolate(method='cubic')
虽然这种方法对小系列(size = 50
)工作得很好,但它似乎会导致程序冻结更大的系列(size = 5000
)。有解决方法吗?
pandas
调出 scipy
插值例程,我不确定为什么 'cubic'
如此耗内存且速度缓慢。
作为一种解决方法,您可以使用 method='spline'
(scipy ref here),它具有正确的参数,本质上给出(似乎是一些浮点差异?)结果相同,而且速度更快。
In [104]: # create series
...: size = 2000
...: x = np.linspace(-2, 5, size)
...: y = pd.Series(np.sin(x))
...:
...: # deleting data segment
...: y[10:30] = np.nan
...:
In [105]: %time cubic = y.interpolate(method='cubic')
Wall time: 4.94 s
In [106]: %time spline = y.interpolate(method='spline', order=3, s=0.)
Wall time: 1 ms
In [107]: (cubic == spline).all()
Out[107]: False
In [108]: pd.concat([cubic, spline], axis=1).loc[5:35, :]
Out[108]:
0 1
5 -0.916444 -0.916444
6 -0.917840 -0.917840
7 -0.919224 -0.919224
8 -0.920597 -0.920597
9 -0.921959 -0.921959
10 -0.923309 -0.923309
11 -0.924649 -0.924649
12 -0.925976 -0.925976
13 -0.927293 -0.927293