Если вы хотите провести простую линейную регрессию для группы из трех лет, попробуйте что-то вроде этого:
# Hardcoded input data for clarity
#all_years = data_['Year'].values
#all_values = data_['Value'].values
all_years = np.array([1,2,3,
1,2,3,
1,2,3,
1,2,3,
1,2,3])
all_values = np.array([ 6.262008, 5.795994, 5.082662,
285.433511, 260.436601, 238.713124,
2.596145, 2.508278, 2.67997,
90.823952, 91.0962765, 93.821241,
19.677544, 18.464335, 18.035489])
w = 3 # window size
for i in range(len(all_years)//w):
years = all_years[w*i : w*(i+1)].reshape(-1,1)
values = all_values[w*i : w*(i+1)].reshape(-1,1)
#print(years, values)
reg=linear_model.LinearRegression()
reg.fit(years, values)
y=(w+1)*reg.coef_ + reg.intercept_
plt.scatter(years, values)
plt.show()
print(reg.coef_)
print("R^2 : ",reg.score(years, values))
print("Equation : (w+1) *", reg.coef_, "+", reg.intercept_)
print("Y4 : ", y)
print("====")
В этом случае длина будет 15
, поэтому цикл for пройдет i= 1, ..., 4
. Затем я выбираю нужные вам годы и значения, используя срез массива numpy.
Например, для i = 1 будет выбрано [3*(1-1) : 3*1]
= [0 : 3]
, давая ровно первые три строки. Затем, чтобы убедиться, что это хорошо работает с линейной регрессией, ожидающей вектор столбца, я изменил массив, чтобы он состоял из 1 столбца с .reshape(-1, 1)
.
Тогда это вопрос обучения и заговора, как вы хотите.
Для версии, которая более удобна для чтения и позволяет избежать проблем с ручной индексацией, вы также можете обратиться к пакету more-itertools
. В частности, метод chunked
полезен в этом случае для разделения данных на куски фиксированной длины, в нашем случае 3:
from more_itertools import chunked
...
w = 3 # window size
for years, values in zip(chunked(all_years, n=w), chunked(all_values, n=w)):
years = years.reshape(-1,1)
values = values.reshape(-1,1)
#print(years, values)
...