Пример реализации скользящего среднего с регуляризацией. Случайным образом отбираем наблюдения для расчета статистики по окну с возвращением или без возвращения. Используем для градиентного бустинга и нейронных сетей. Для тестовой выборки (или тестовой части исходного набора) используем защиту от протечек в виде значений NaN.
Есть столбец
2018-01-09 2400.0
2018-01-10 2800.0
2018-01-11 2500.0
2018-01-12 2890.0
2018-01-13 2610.0
2018-01-14 2500.0
2018-01-15 2750.0
2018-01-16 2700.0
2018-01-17 NaN
2018-01-18 NaN
2018-01-19 NaN
2018-01-20 NaN
Name: sales, dtype: float64
Пишем функцию
# функция вычисления скользящего среднего с регуляризацией
def regularized_mean(x, frac=0.5, random_state=42, replace=False,
verbose=False, axis=None):
np.random.seed(random_state)
x_sampled = x.sample(frac=frac, replace=replace)
if verbose:
print(x_sampled)
print('')
return np.mean(x_sampled)
# вычисляем скользящее среднее с регуляризацией
data['sales'].shift(1).rolling(window=4, min_periods=1).apply(
lambda x: regularized_mean(x, frac=0.8, verbose=True))
Применяем
2018-01-10 2400.0
2018-01-09 NaN
dtype: float64
2018-01-09 NaN
2018-01-10 2400.0
dtype: float64
2018-01-10 2400.0
2018-01-12 2500.0
2018-01-09 NaN
dtype: float64
2018-01-11 2800.0
2018-01-13 2890.0
2018-01-10 2400.0
dtype: float64
2018-01-12 2500.0
2018-01-14 2610.0
2018-01-11 2800.0
dtype: float64
2018-01-13 2890.0
2018-01-15 2500.0
2018-01-12 2500.0
dtype: float64
2018-01-14 2610.0
2018-01-16 2750.0
2018-01-13 2890.0
dtype: float64
2018-01-15 2500.0
2018-01-17 2700.0
2018-01-14 2610.0
dtype: float64
2018-01-16 2750.0
2018-01-18 NaN
2018-01-15 2500.0
dtype: float64
2018-01-17 2700.0
2018-01-19 NaN
2018-01-16 2750.0
dtype: float64
2018-01-18 NaN
2018-01-20 NaN
2018-01-17 2700.0
dtype: float64
2018-01-09 NaN
2018-01-10 2400.000000
2018-01-11 2400.000000
2018-01-12 2450.000000
2018-01-13 2696.666667
2018-01-14 2636.666667
2018-01-15 2630.000000
2018-01-16 2750.000000
2018-01-17 2603.333333
2018-01-18 2625.000000
2018-01-19 2725.000000
2018-01-20 2700.000000
Name: sales, dtype: float64
Есть столбец
2018-01-09 2400.0
2018-01-10 2800.0
2018-01-11 2500.0
2018-01-12 2890.0
2018-01-13 2610.0
2018-01-14 2500.0
2018-01-15 2750.0
2018-01-16 2700.0
2018-01-17 NaN
2018-01-18 NaN
2018-01-19 NaN
2018-01-20 NaN
Name: sales, dtype: float64
Пишем функцию
# функция вычисления скользящего среднего с регуляризацией
def regularized_mean(x, frac=0.5, random_state=42, replace=False,
verbose=False, axis=None):
np.random.seed(random_state)
x_sampled = x.sample(frac=frac, replace=replace)
if verbose:
print(x_sampled)
print('')
return np.mean(x_sampled)
# вычисляем скользящее среднее с регуляризацией
data['sales'].shift(1).rolling(window=4, min_periods=1).apply(
lambda x: regularized_mean(x, frac=0.8, verbose=True))
Применяем
2018-01-10 2400.0
2018-01-09 NaN
dtype: float64
2018-01-09 NaN
2018-01-10 2400.0
dtype: float64
2018-01-10 2400.0
2018-01-12 2500.0
2018-01-09 NaN
dtype: float64
2018-01-11 2800.0
2018-01-13 2890.0
2018-01-10 2400.0
dtype: float64
2018-01-12 2500.0
2018-01-14 2610.0
2018-01-11 2800.0
dtype: float64
2018-01-13 2890.0
2018-01-15 2500.0
2018-01-12 2500.0
dtype: float64
2018-01-14 2610.0
2018-01-16 2750.0
2018-01-13 2890.0
dtype: float64
2018-01-15 2500.0
2018-01-17 2700.0
2018-01-14 2610.0
dtype: float64
2018-01-16 2750.0
2018-01-18 NaN
2018-01-15 2500.0
dtype: float64
2018-01-17 2700.0
2018-01-19 NaN
2018-01-16 2750.0
dtype: float64
2018-01-18 NaN
2018-01-20 NaN
2018-01-17 2700.0
dtype: float64
2018-01-09 NaN
2018-01-10 2400.000000
2018-01-11 2400.000000
2018-01-12 2450.000000
2018-01-13 2696.666667
2018-01-14 2636.666667
2018-01-15 2630.000000
2018-01-16 2750.000000
2018-01-17 2603.333333
2018-01-18 2625.000000
2018-01-19 2725.000000
2018-01-20 2700.000000
Name: sales, dtype: float64