← На главную Воспоминания

Среда, 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');

далее перейду ко второму уроку 'тренд'