我有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')
我的脚本中有任何建议或可能的错误吗?
答案 0 :(得分:1)
问题是,您试图在同一轴上绘制数字范围和日期范围。
您创建了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')