У меня есть 2 набора данных:
data = StringIO("""
date value
24-Jan-16 0.786
25-Feb-16 0.781
29-Apr-16 0.786
15-May-16 0.761
16-Jun-16 0.762
04-Sep-16 0.783
22-Oct-16 0.797
23-Nov-16 0.792
09-Dec-16 0.783
25-Dec-16 0.788
26-Jan-17 0.776
11-Feb-17 0.789
15-Mar-17 0.781
05-Jul-17 0.785
07-Sep-17 0.796
""")
df = pd.read_table(data, delim_whitespace=True)
df.loc[:, "date"] = pd.to_datetime(df.loc[:, "date"], format="%d-%b-%y")
y_values = df.loc[:, "value"]
x_values = np.linspace(0,1,len(df.loc[:, "value"]))
а также
data2 = StringIO("""
date value
09-Oct-17 0.304
10-Nov-17 0.316
26-Nov-17 0.636
12-Dec-17 0.652
28-Dec-17 0.639
13-Jan-18 0.623
14-Feb-18 0.427
02-Mar-18 0.619
18-Mar-18 0.608
19-Apr-18 0.605
05-May-18 0.625
06-Jun-18 0.639
22-Jun-18 0.663
08-Jul-18 0.64
24-Jul-18 0.623
09-Aug-18 0.632
28-Oct-18 0.736
""")
df2 = pd.read_table(data2, delim_whitespace=True)
df2.loc[:, "date"] = pd.to_datetime(df2.loc[:, "date"], format="%d-%b-%y")
y_values2 = df2.loc[:, "value"]
x_values2 = np.linspace(0,1,len(df2.loc[:, "value"]))
Я пытаюсь запустить линейную и сезонную линию подстановки на первом наборе данных и экспоненциальную функцию для второго набора, используя определенные функции ниже
# Linear + seasonal fit
def func2(x, a0, a1, a2, a3):
return a0 + a1*x + a2*np.sin(2*np.pi*x) + a3*np.cos(2*np.pi*x)
#exponential
def func(x,a,b,c):
return a * np.exp(-b*x+c)
popt3, pcov = curve_fit(func2, x_values, y_values)
popt, pcov = curve_fit (func, x_values, y_values)
Я пробовал строить и запускать функции, используя приведенный ниже скрипт, но получил ошибку
popt, pcov = curve_fit (func, x_values2, y_values2)
plt.plot(df.loc[:, "date"], df.loc[:,"value"] ,"ro",color='green')
popt3, pcov = curve_fit(func2, x_values, y_values)
plt.plot(x_values, func2(x_values, *popt3), '-',
linewidth=3.0,color='red',label='Linear Model')
plt.plot(df2.loc[:, "date"], df2.loc[:,"value"] ,"ro",color='red')
plt.plot(x_values2, func(x_values2, *popt), '-',
linewidth=3.0,color='red',label='exponential')
Любое предложение или возможная ошибка в моем скрипте?
Проблема в том, что вы пытаетесь построить на одной оси числовой диапазон и диапазон дат.
Вы создали x_values
для передачи в func
, но при построении графика вы все равно должны использовать df.loc[:, "date"]
Попробуйте следующее:
popt, pcov = curve_fit (func, x_values2, y_values2)
popt3, pcov = curve_fit(func2, x_values, y_values)
plt.plot(df.loc[:, "date"], df.loc[:,"value"] ,"ro",color='green')
plt.plot(df.loc[:, "date"], func2(x_values, *popt3), '-',
linewidth=3.0,color='red',label='Linear Model')
plt.plot(df2.loc[:, "date"], df2.loc[:,"value"] ,"ro",color='red')
plt.plot(df2.loc[:, "date"], func(x_values2, *popt), '-',
linewidth=3.0,color='red',label='exponential')