#python #python-3.x #pandas #scikit-learn
#питон #python-3.x #pandas #scikit-learn
Вопрос:
У меня есть пять столбцов исторических данных, по которым я хотел бы найти линейный тренд по столбцам в каждой строке, чтобы спрогнозировать следующее значение в 2021/22 году. Исторические данные хранятся во фрейме данных следующим образом: —
Указатель | 2016/17 | 2017/18 | 2018/19 | 2019/20 | 2020/21 |
---|---|---|---|---|---|
0 | 14.53 | 13.75 | 13.03 | 16.05 | 15.15 |
1 | 14.52 | 13.74 | 13.03 | 16.03 | 15.14 |
2 | 11.92 | 10.53 | 10.53 | пустота | пустота |
3 | 10.87 | 10.06 | 10.06 | 10.05 | 10.07 |
4 | 12.59 | 10.99 | 10.99 | 10.99 | 11.07 |
5 | 12.59 | 10.99 | 10.99 | 10.99 | 11.00 |
6 | 24.56 | 17.90 | 17.88 | 18.02 | 18.14 |
7 | 24.56 | 17.90 | 17.88 | 18.02 | 18.14 |
8 | 24.56 | 17.90 | 17.88 | 18.02 | 18.14 |
9 | 18.40 | 14.94 | 14.92 | 15.02 | 15.10 |
10 | 23.57 | 23.06 | 23.09 | 23.08 | 22.88 |
Затем прогнозируемые выходные данные сохраняются в следующем столбце того же фрейма данных.
Указатель | 2016/17 | 2017/18 | 2018/19 | 2019/20 | 2020/21 | 2021/22 |
---|---|---|---|---|---|---|
0 | 14.53 | 13.75 | 13.03 | 16.05 | 15.15 | ? |
1 | 14.52 | 13.74 | 13.03 | 16.03 | 15.14 | ? |
2 | 11.92 | 10.53 | 10.53 | пустота | пустота | ? |
3 | 10.87 | 10.06 | 10.06 | 10.05 | 10.07 | ? |
4 | 12.59 | 10.99 | 10.99 | 10.99 | 11.07 | ? |
5 | 12.59 | 10.99 | 10.99 | 10.99 | 11.00 | ? |
6 | 24.56 | 17.90 | 17.88 | 18.02 | 18.14 | ? |
7 | 24.56 | 17.90 | 17.88 | 18.02 | 18.14 | ? |
8 | 24.56 | 17.90 | 17.88 | 18.02 | 18.14 | ? |
9 | 18.40 | 14.94 | 14.92 | 15.02 | 15.10 | ? |
10 | 23.57 | 23.06 | 23.09 | 23.08 | 22.88 | ? |
Я пытался использовать numpy.polyfit и scipy.linregress, но оба, похоже, вызывают у меня проблемы из-за наличия нескольких столбцов вместо одного столбца. Любая помощь будет очень признательна.
Спасибо
Комментарии:
1. Не могли бы вы предоставить фрагмент кода, который вы пробовали для нас в качестве ссылки?
Ответ №1:
Вот очень простой пример того, как взять пять столбцов и предсказать следующий (6-й) для первой строки данных, используя scikit-learn. pip install scikit-learn
если вы его не получили.
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
data = { '2016/17' : [14.53, 14.52],
'2017/18' : [13.75,13.74],
'2018/19' : [13.03,13.03],
'2019/20' : [16.05,16.03],
'2020/21' : [15.15,15.14]}
df = pd.DataFrame(data)
X = np.array([[1],[2],[3],[4],[5]]) # dummy x values for each of the columns you are going to use as input data
Y = df.iloc[0,:].values.reshape(-1, 1) # work on row 0
linear_regressor = LinearRegression() # create object for the class
linear_regressor.fit(X, Y) # perform linear regression
prediction = linear_regressor.predict(np.array([[6]]))
Теперь вам нужно будет взять это и заставить его работать по строкам и поместить ответ в нужный столбец, но базовый механизм есть.
Вам также придется иметь дело с интересными проблемами void. imputation
это то, что вам нужно, но это будет проблематично, если будет отсутствовать слишком много данных.
Комментарии:
1. Спасибо, Пол, я изучу, как я мог бы справиться с недостающими значениями, используя вменение.
2. scikit-learn.org/stable/modules/impute.html вот стратегия, вы можете получить линейную подгонку из двух точек, но на самом деле это мало что значит (подумайте о количестве лошадей в 1900, 1910 годах, а затем прогнозируйте до 2020 года, не очень хорошо). Таким образом, пропущенные значения будут соответствовать среднему тренду, поэтому сопоставьте все данные, а затем вставьте пустоты, затем используйте приведенные выше данные для получения прогноза, если вам нужна дополнительная информация, спрашивайте