Среда, 17 Января 2024
Прошел первый урок из курса о тайм сириес
Предсказание временных последовательностей это по большему счету фича инжиниринс с использованием тайм индекса и лагов.
Тайм индекс
допусти у нас есть датасет
books_sold | |
---|---|
1.1.2020 | 500 |
2.1.2020 | 300 |
мы можем создать еще одну колонку присвоив ей номер по порядку
books_sold | time | |
---|---|---|
1.1.2020 | 500 | 0 |
2.1.2020 | 300 | 1 |
в нампай это можно сделать так
df['Time'] = np.arange(len(tunnel.index))
и применим линейную регрессию с использованием новой фичи. Линейная регрессия это по сути построение линии прямой лучше всего описывающей данные. Она вычесляется по формуле target = weight * time + bias
, где weight и bias подбираются во время фита, тайм это наша новая фича, а таргет это books_sold
from sklearn.linear_model import LinearRegression
# Training data
X = df.loc[:, ['time']] # features
y = df.loc[:, 'books_sold'] # target
# Train the model
model = LinearRegression()
model.fit(X, y)
# Store the fitted values as a time series with the same time index as
# the training data
y_pred = pd.Series(model.predict(X), index=X.index)
далее можно нарисовать график или использовать модель для предсказаний
fig, ax = plt.subplots()
ax.plot('time', 'books_sold', data=book_sales, color='0.75')
ax = sns.regplot(x='time', y='books_sold', data=book_sales, ci=None, scatter_kws=dict(color='0.25'))
ax.set_title('Time Plot of Hardcover Sales');
Лаг
возьмем тот же датасет. Создадим новую колонку и значения запишем такое же как и в предыдущем ряду
books_sold | lag | |
---|---|---|
1.1.2020 | 500 | NaN |
2.1.2020 | 300 | 500 |
3.1.2020 | 600 | 300 |
в пандас это можно сдеать так
df['lag'] = df['books_sold'].shift(1)
далее можно обучить тот же алгоритм линейной регрессии
from sklearn.linear_model import LinearRegression
X = df.loc[:, ['lag']]
X.dropna(inplace=True) # drop missing values in the feature set
y = df.loc[:, 'books_sold'] # create the target
y, X = y.align(X, join='inner') # drop corresponding values in target
model = LinearRegression()
model.fit(X, y)
y_pred = pd.Series(model.predict(X), index=X.index)
лаг показывает растет ли гап между предыдущим значением и текущим и есть ли вообще связь между ними. Таким образом можно увидеть есть ли замедление, либо ускорение продаж, либо нет никакой четкой последовательности
далее можно нарисовать график
fig, ax = plt.subplots()
ax.plot(X['Lag_1'], y, '.', color='0.25')
ax.plot(X['Lag_1'], y_pred)
ax.set_aspect('equal')
ax.set_ylabel('NumVehicles')
ax.set_xlabel('Lag_1')
ax.set_title('Lag Plot of Tunnel Traffic');
далее перейду ко второму уроку 'тренд'