#python #pandas #dataframe #curve-fitting
Вопрос:
Я пытаюсь подогнать кривую или функцию к своим данным, которые выглядят как косинусная или синусоидальная волна. Я использовал следующий код.
from scipy.optimize import curve_fit
def sinfunc(t,A, w, p, c):
return A * np.cos(w*t p) c
def PushCalculator(df):
Vexs = next( i for i in df.columns.values if i.lower()=='vexc')
Vcos = next( i for i in df.columns.values if i.lower()=='vcos')
fs=abs(round(1/(df[df[Vexs]==df[Vexs][0]].iloc[0,0]-df[df[Vexs]==df[Vexs][0]].iloc[1,0])))
timestep=df.iloc[1,0]-df.iloc[0,0]
step=round(1/fs/timestep)
timePush=df.iloc[0::step,0]
pushCos=df.loc[0::step,Vcos]
plt.figure(figsize=(5,5))
plt.title("GeneratedPush")
plt.plot(timePush.iloc[:],pushCos.iloc[:],'g*')
plt.scatter(df.iloc[:,0],df.loc[:,Vcos],alpha=0.9)
# Curve fitting on Generated pushcos
popt, _=curve_fit(sinfunc,timePush.iloc[:250],pushCos.iloc[:250])
A, w, p, c=popt
ycos=sinfunc(df.iloc[:,0],A, w, p, c)
plt.figure(figsize=(5,5))
plt.title("VPushCos")
plt.scatter(df.iloc[:,0],ycos,marker="X")
plt.plot(timePush.iloc[:],pushCos.iloc[:],'g*')
# add generated data to df
df.insert(3,"VPushCos",ycos)
return pushCos,df
//описание кода:
PushCalculator принимает фрейм данных в качестве входных данных. после расчета частоты и шага по времени рассчитайте кнопки. поскольку размер Pushco меньше размера входного кадра данных, я сначала использую подгонку кривой для подгонки функции на Pushco, а затем использую функцию подгонки для вычисления данных для каждой строки входного кадра данных.
код работает нормально и вычисляет кнопки для входного кадра данных, но он не может соответствовать функции, когда вычисление-кнопки не похоже на косинус, как показано ниже:
в лучшем случае, он подходит для такой функции, как эта:
Я думаю, проблема в том, что я пытаюсь подогнать функцию cos к данным, которые не похожи на косинусы. но я понятия не имею, как я могу разместить функцию на этих данных!?!?
примеры фрейма данных доступны здесь:
код отлично работает с CompleteData.xlsx но не тот 1200.xlsx. используйте следующий код для чтения файлов.
a=pd.read_excel('excel path',usecols=[i for i in range(0,5)])
Комментарии:
1. Не удается импортировать ваши данные по данной ссылке. Я получаю «Этот форлер пуст».