Как применить две разные функции к двум наборам данных

1

У меня есть 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')

Любое предложение или возможная ошибка в моем скрипте?

  • 4
    Вы должны включить свою ошибку в свой пост.
Теги:

1 ответ

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')
  • 0
    Спасибо. Теперь она отображается без ошибок, но моя экспоненциальная функция находится под прямой линией под моими данными. Но я предполагаю, что только я не использую правильную функцию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню