Python 使用SciPy将数据插值为二次拟合

Python 使用SciPy将数据插值为二次拟合,python,scipy,interpolation,data-analysis,Python,Scipy,Interpolation,Data Analysis,我有一组数据,当绘制时,大多数点聚集在x轴的左侧: plt.plot(x, y, marker='o') plt.title('Original') plt.show() 我想使用scipy对数据进行插值,然后尝试将二次线拟合到数据中。我正在避免简单地拟合二次曲线而不进行插值,因为这将使获得的曲线偏向x轴一端的大量数据。我试着用这个 f = interp1d(x, y, kind='quadratic') # Array with points in between min(x) and

我有一组数据,当绘制时,大多数点聚集在x轴的左侧:

plt.plot(x, y, marker='o')
plt.title('Original')
plt.show()

我想使用scipy对数据进行插值,然后尝试将二次线拟合到数据中。我正在避免简单地拟合二次曲线而不进行插值,因为这将使获得的曲线偏向x轴一端的大量数据。我试着用这个

f = interp1d(x, y, kind='quadratic')

# Array with points in between min(x) and max(x) for interpolation
x_interp = np.linspace(min(x), max(x), num=np.size(x))

# Plot graph with interpolation
plt.plot(x_interp, f(x_interp), marker='o')
plt.title('Interpolated')
plt.show()
并且得到了

然而,我想要得到的是这样的东西:

我做错了什么

可以找到我的x值和y值。 谢谢大家!

解决方案1 我很确定这是你想要的。它将二次(二次)多项式拟合到数据中,然后将该函数绘制在从原始x数据的最小值到最大值的均匀分布的x值数组上

new_x = np.linspace(min(x), max(x), num=np.size(x))
coefs = np.polyfit(x,y,2)
new_line = np.polyval(coefs, new_x)
它将返回:

plt.scatter(x,y)
plt.scatter(new_x,new_line,c='g', marker='^', s=5)
plt.xlim(min(x)-0.00001,max(x)+0.00001)
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()

如果那不是你的意思。。。 但是,从您的问题来看,您可能试图将所有原始y值强制到均匀分布的x值上(如果这不是您的意图,请告诉我,我将删除此部分)

这也是可能的,有很多方法可以做到这一点,但我已经在熊猫中做到了:

import pandas as pd
xy_df=pd.DataFrame({'x_orig': x, 'y_orig': y})
sorted_x_y=xy_df.sort_values('x_orig')
sorted_x_y['new_x'] = np.linspace(min(x), max(x), np.size(x))

plt.figure(figsize=[5,5])
plt.scatter(sorted_x_y['new_x'], sorted_x_y['y_orig'])
plt.xlim(min(x)-0.00001,max(x)+0.00001)
plt.xticks(rotation=90)
plt.tight_layout()
这看起来和你的原始数据很不一样。。。这就是为什么我认为它可能不是你想要的

解决方案1 我很确定这是你想要的。它将二次(二次)多项式拟合到数据中,然后将该函数绘制在从原始x数据的最小值到最大值的均匀分布的x值数组上

new_x = np.linspace(min(x), max(x), num=np.size(x))
coefs = np.polyfit(x,y,2)
new_line = np.polyval(coefs, new_x)
它将返回:

plt.scatter(x,y)
plt.scatter(new_x,new_line,c='g', marker='^', s=5)
plt.xlim(min(x)-0.00001,max(x)+0.00001)
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()

如果那不是你的意思。。。 但是,从您的问题来看,您可能试图将所有原始y值强制到均匀分布的x值上(如果这不是您的意图,请告诉我,我将删除此部分)

这也是可能的,有很多方法可以做到这一点,但我已经在熊猫中做到了:

import pandas as pd
xy_df=pd.DataFrame({'x_orig': x, 'y_orig': y})
sorted_x_y=xy_df.sort_values('x_orig')
sorted_x_y['new_x'] = np.linspace(min(x), max(x), np.size(x))

plt.figure(figsize=[5,5])
plt.scatter(sorted_x_y['new_x'], sorted_x_y['y_orig'])
plt.xlim(min(x)-0.00001,max(x)+0.00001)
plt.xticks(rotation=90)
plt.tight_layout()
这看起来和你的原始数据很不一样。。。这就是为什么我认为它可能不是你想要的


你不想插值,那是完全不同的。您可能希望将二次函数拟合到数据中。查看
scipy.optimize.curve\u fit
。很抱歉,我刚刚重新计算了我的x值。我需要进行插值,因为如果我在不进行插值的情况下拟合曲线,曲线将偏向于聚集在x轴一端的数据,并且无法准确反映趋势。@郭家臣,我不认为会是这种情况。请参阅下面的解决方案。您不想插值,这是完全不同的。您可能希望将二次函数拟合到数据中。查看
scipy.optimize.curve\u fit
。很抱歉,我刚刚重新计算了我的x值。我需要进行插值,因为如果我在不进行插值的情况下拟合曲线,曲线将偏向于聚集在x轴一端的数据,并且无法准确反映趋势。@郭家臣,我不认为会是这种情况。请参阅下面的解决方案。