关于解决使用numpy.ployfit进行多项式拟合的时候请注意数据类型,解决问题的思路就是统一把数据变成浮点型,就可以了。这是numpy里面的一个bug,非常low希望后面改善。
# coding:utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import interp1d data = pd.read_excel('指数.xlsx',header=None,index_col=None) # 数据信息 # print(data.info()) # 查看空值 isnull = data[1].isnull() # print(isnull) # print(data[1]) # 替换空值 data[1] = data[1].fillna('666') # 找出索引 index_ = data[isnull].index.tolist() # print(index_) # 去除空列所在行 data = data.drop(index_) # print(data) x = data[1] y = data[0] # 插值 f1=interp1d(x,y,kind='linear')#线性插值 #f2=interp1d(x,y,kind='cubic')#三次样条插值 x_pred=np.arange(1,170,1) y1=f1(x_pred) # datas = pd.DataFrame([y1,x_pred]) # datas.to_excel('new指数.xlsx') #y2=f2(x_pred) # plt.figure(figsize=[12,7]) # plt.scatter(x,y,s=30,c='red',label='原始指数') # plt.plot(x_pred,y1,'b--',label='linear interpolation') # # plt.plot(x_pred,y2,'b--',label='cubic') # plt.legend(loc='upper left') # font_size = {'size':13} # plt.ylabel('淘宝指数',font_size) # plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为SimHei显示中文 # plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号 # plt.show() # print(x_pred,y1.shape) # xx = np.hstack([x_pred.reshape(-1,1),np.ones([len(x_pred),1])]) # **************************************************************************** # 在使用numpy的拟合函数polyfit进行进行拟合时,会出现数据类型的问题,吧他们数据类型统一转浮点型就解决 x_pred = np.array(x_pred,dtype='float') y1 = np.array(y1,dtype='float') z1 = np.polyfit(x_pred, y1,3)#用3次多项式拟合 p1 = np.poly1d(z1) print(p1) #在屏幕上打印拟合多项式 #yvals=p1(x)#也可以使用yvals=np.polyval(z1,x) yvals=np.polyval(z1,x_pred) plt.figure(figsize=[12,7]) plt.scatter(x,y,s=30,c='red',label='原始指数') plt.plot(x_pred,yvals,'b--',label='%s = y'%p1) plt.legend(loc='upper left') font_size = {'size':13} plt.ylabel('淘宝指数:y',font_size) plt.xlabel('x',font_size) p_mean = (np.sum(np.abs(yvals-y1))/len(y1)) plt.title('平均误差:%s'%(p_mean)) plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为SimHei显示中文 plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号 plt.show()