gpt4 book ai didi

python - 如何在修改旧值的 Pandas 中使用 `Series.interpolate`

转载 作者:太空狗 更新时间:2023-10-30 02:43:48 26 4
gpt4 key购买 nike

pandas 中的interploate 方法使用有效数据对nan 值进行插值。但是,它保持旧的有效数据不变,如下代码所示。

有没有办法使用 interploate 方法改变旧值,使序列变得平滑?

In [1]: %matplotlib inline
In [2]: from scipy.interpolate import UnivariateSpline as spl
In [3]: import numpy as np
In [4]: import pandas as pd
In [5]: samples = { 0.0: 0.0, 0.4: 0.5, 0.5: 0.9, 0.6: 0.7, 0.8:0.3, 1.0: 1.0 }
In [6]: x, y = zip(*sorted(samples.items()))

In [7]: df1 = pd.DataFrame(index=np.linspace(0, 1, 31), columns=['raw', 'itp'], dtype=float)

In [8]: df1.loc[x] = np.array(y)[:, None]
In [9]: df1['itp'].interpolate('spline', order=3, inplace=True)
In [10]: df1.plot(style={'itp': 'b-', 'raw': 'rs'}, figsize=(8, 6))

enter image description here

In [11]: df2 = pd.DataFrame(index=np.linspace(0, 1, 31), columns=['raw', 'itp'], dtype=float)
In [12]: df2.loc[x, 'raw'] = y
In [13]: f = spl(x, y, k=3)
In [14]: df2['itp'] = f(df2.index)
In [15]: df2.plot(style={'itp': 'b-', 'raw': 'rs'}, figsize=(8, 6))

enter image description here

最佳答案

当您将 Series.interpolatemethod='spline' 一起使用时,在后台 Pandas usesinterpolate.UnivariateSpline .

返回的样条 UnivariateSpline不保证通过作为输入给出的数据点 unlesss=0 .但是,默认情况下 s=None,它使用不同的平滑因子,从而导致不同的结果。

Series.interpolate 方法始终 fills in NaNvalues不改变非 NaN 值。没有办法使Series.interpolate 修改非 NaN 值。所以,当 s != 0 时,结果产生锯齿状的跳跃。

因此,如果您想要 s=None(默认)样条插值但没有锯齿状的跳跃,正如您已经发现的那样,您必须调用 UnivariateSpline直接覆盖df['itp']中的所有值:

df['itp'] = interpolate.UnivariateSpline(x, y, k=3)(df.index)

如果你想要一个通过所有非 NaN 数据点的三次样条,那么使用 s=0

df['itp'].interpolate('spline', order=3, s=0, inplace=True)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.interpolate as interpolate

samples = { 0.0: 0.0, 0.4: 0.5, 0.5: 0.9, 0.6: 0.7, 0.8:0.3, 1.0: 1.0 }
x, y = zip(*sorted(samples.items()))

fig, ax = plt.subplots(nrows=3, sharex=True)
df1 = pd.DataFrame(index=np.linspace(0, 1, 31), columns=['raw', 'itp'], dtype=float)
df1.loc[x] = np.array(y)[:, None]

df2 = df1.copy()
df3 = df1.copy()

df1['itp'].interpolate('spline', order=3, inplace=True)
df2['itp'] = interpolate.UnivariateSpline(x, y, k=3)(df2.index)
df3['itp'].interpolate('spline', order=3, s=0, inplace=True)
for i, df in enumerate((df1, df2, df3)):
df.plot(style={'itp': 'b-', 'raw': 'rs'}, figsize=(8, 6), ax=ax[i])
plt.show()

enter image description here

关于python - 如何在修改旧值的 Pandas 中使用 `Series.interpolate`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com