Это не простая задача, вам необходимо:
- найти одну или несколько функций, которые будут соответствовать вашим данным
- в этом примере найти тренд ваших данных с помощью подгонки линии
- установить правильные границы для каждого параметра для комплексной функции
- предсказать новое значение на основе установленных параметров
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
import pandas as pd
df = pd.read_csv('df.csv')
x_data = np.array(pd.to_datetime(df['date'].index.values+1, format='%Y-%m-%d'), dtype=int)
y_data = np.array(df['pow'], dtype=float)
# normalise data
y_data = (y_data - np.min(y_data))/ np.max(y_data)
# find data trend
def line_function(x, a, b):
return a*x + b
# fit function
parameters_line, covariance_line = curve_fit(line_function, x_data, y_data, method='lm')
# define fitting function
def fit_function(x, A, t, fi, c, d):
return A*np.sin(x*t + fi)**2 + c*x + d
# set bounds for each parameter
param_bounds = ([0, 0, 0, -1, 0], [2, (2*np.pi/600), 10, parameters_line[0], 10])
# fit function
parameters_fit, covariance_fit = curve_fit(fit_function, x_data, y_data,bounds=param_bounds , method='trf')
A, t, fi, c, d = [value for value in parameters_fit]
# predict new value
x_predict = 900
y_predict = fit_function(x_predict, A, t, fi, c, d)
# plot data
x_fit_data = np.linspace(-100, 1000, 1000)
y_fit_data = fit_function(x_fit_data, A, t, fi, c, d)
plt.plot(x_data, y_data, '.')
plt.plot(x_fit_data, y_fit_data, '-')
y_line_fit_data = line_function(x_fit_data, parameters_line[0], parameters_line[1])
plt.plot(x_fit_data, y_line_fit_data, '--')
plt.plot(x_predict, y_predict, 'o')
plt.show()
Выход: