如何在两个数据集上应用两个不同的函数

时间:2018-11-30 20:29:54

标签: python

我有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')

我的脚本中有任何建议或可能的错误吗?

1 个答案:

答案 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')