Machine Learning для часових рядів у Python
Chris Holdgraf
Fellow, Berkeley Institute for Data Science

# Повертає булеві значення там, де є пропуски
missing = prices.isna()
# Лінійна інтерполяція в межах вікон із пропусками
prices_interp = prices.interpolate('linear')
# Побудуйте інтерпольовані дані червоним і дані з пропусками — чорним
ax = prices_interp.plot(c='r')
prices.plot(c='k', ax=ax, lw=2)

def percent_change(values):
"""Обчислює % зміну між останнім значенням
та середнім попередніх значень"""
# Розділіть останнє та попередні значення
previous_values = values[:-1]
last_value = values[-1]
# Обчисліть % різницю між останнім значенням
# і середнім попередніх значень
percent_change = (last_value - np.mean(previous_values)) \
/ np.mean(previous_values)
return percent_change
# Побудуйте «сирі» дані
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
ax = prices.plot(ax=axs[0])
# Обчисліть % зміну і побудуйте
ax = prices.rolling(window=20).aggregate(percent_change).plot(ax=axs[1])
ax.legend_.set_visible(False)

Будьте дуже обережні: часто складно відрізнити легітимне екстремальне значення від аномалії
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
for data, ax in zip([prices, prices_perc_change], axs):
# Обчисліть середнє та стандартне відхилення
this_mean = data.mean()
this_std = data.std()
# Побудуйте дані та поріг у 3 стандартні відхилення
# навколо середнього
data.plot(ax=ax)
ax.axhline(this_mean + this_std * 3, ls='--', c='r')
ax.axhline(this_mean - this_std * 3, ls='--', c='r')

# Центруйте дані, щоб середнє було 0
prices_outlier_centered = prices_outlier_perc - prices_outlier_perc.mean()
# Обчисліть стандартне відхилення
std = prices_outlier_perc.std()
# Використайте модуль значення кожної точки,
# щоб легше знаходити викиди
outliers = np.abs(prices_outlier_centered) > (std * 3)
# Замініть викиди на медіану
# Використаємо np.nanmean, бо поруч можуть бути NaN
prices_outlier_fixed = prices_outlier_centered.copy()
prices_outlier_fixed[outliers] = np.nanmedian(prices_outlier_fixed)
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
prices_outlier_centered.plot(ax=axs[0])
prices_outlier_fixed.plot(ax=axs[1])

Machine Learning для часових рядів у Python