Как получить следующее прогнозируемое значение из экстраполяции (линейной регрессии?) С использованием набора данных в течение для l oop? - PullRequest
0 голосов
/ 05 февраля 2020

извините, но название не достаточно ясно, потому что я не знал, как описать это несколькими словами.

Как вы можете видеть на изображении, я использовал interp1d, чтобы графически «предсказать» значение y, когда x = 7. То, что я пытаюсь сделать, это предсказать другое значение y, когда x + 1 (8) и т. Д. В любое время размер X увеличивается до тех пор, пока не будет достигнуто последнее значение набора данных (скажем, 100), используя a для l oop ?. как

[1 2 3 4 5 6]
[ 4470.76 25465.72 25465.72 25465.72 21480.59 20024.53]

[1 2 3 4 5 6 7]
[ 4470.76 25465.72 25465.72 25465.72 21480.59 20024.53 15487.45]

[1 2 3 4 5 6 7 8]
[ 4470.76 25465.72 25465.72 25465.72 21480.59 20024.53 15487.45 25654.14]

[1 2 3 4 5 6 7 8 9]
[ 4470.76 25465.72 25465.72 25465.72 21480.59 20024.53 15487.45 25654.14 54874.22]
...

Есть идеи, пожалуйста? редактировать: csv_file

import pandas as pd
import numpy as np
import os
import scipy.stats as sp
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set(rc={'figure.figsize': (18, 5)})
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt


# Load dataset
df = pd.read_csv('data.csv', sep=";", index_col = 'date')
df = df[['pow']]

# Reset index
df = df.reset_index()
df = df[['date', 'pow(+)']]
df.head(10)

X = np.array(pd.to_datetime(df['date'].index.values+1, format='%Y-%m-%d'), dtype=int)#.reshape((-1, 1))
X = X[:6]
y = np.array(df['pow(+)'], dtype=float)#.reshape(-1, 1)
y = y[:6]

print (X)
print (y)

f = interp1d(X, y, fill_value = "extrapolate")

#start, stop , nber of samples to generate, If True, stop is the last sample
X_new = np.linspace(0, 7, num=8, endpoint=True)

plt.plot(X, y, 'o', X_new, f(X_new), '-')
plt.legend(['data', 'linear'], loc='best')
plt.show()
#print('\n')
#print("X shape:", X.shape)
#print("y shape:", y.shape)

output

1 Ответ

0 голосов
/ 06 февраля 2020

Это не простая задача, вам необходимо:

  1. найти одну или несколько функций, которые будут соответствовать вашим данным
  2. в этом примере найти тренд ваших данных с помощью подгонки линии
  3. установить правильные границы для каждого параметра для комплексной функции
  4. предсказать новое значение на основе установленных параметров
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()

Выход:

enter image description here

...