Преобразование еженедельных временных рядов в ежедневные (с критериями пропорции) - PullRequest
3 голосов
/ 29 апреля 2019

У меня есть датафрейм, представляющий ежедневный спрос на продукт.Поскольку спрос на этот продукт нерегулярен, модель пророка работает не очень хорошо, как показано ниже:

Daily

Поэтому я перешел веженедельные временные ряды, и модель стала лучше.

df.resample('W',how={'y': 'sum'}, 
                loffset=pd.offsets.timedelta(days=-6))

Weekly Model

Что я пытаюсь сделать сейчас:

1 - Конвертацияснова в ежедневные, с учетом этой еженедельной сезонности:

Seasonality

Приоритет дня недели:

  1. суббота
  2. вторник
  3. Пятница
  4. Понедельник
  5. Четверг
  6. Среда
  7. Воскресенье

Итак, если мой прогноз дляпервая неделя - спрос равен 3, я хочу, чтобы это происходило так:

  1. суббота: 1
  2. вторник: 1
  3. пятница: 1
  4. Понедельник: 0
  5. Четверг: 0
  6. Среда: 0
  7. Воскресенье: 0

Я имею в виду перевод каждого еженедельного прогноза в ежедневное соблюдениена этой неделе порядок присвоения значений:

         ds      y
0   2018-01-07  5.0
1   2018-01-14  5.0
2   2018-01-21  4.0

Ожидаемый результат:

         ds      y
0   2018-01-01  1
1   2018-01-02  1
2   2018-01-03  0 (Wednesday)
3   2018-01-04  1
4   2018-01-05  1
5   2018-01-06  1
6   2018-01-07  0 (Sunday)

1 Ответ

2 голосов
/ 29 апреля 2019

Поскольку ваши данные индексируются по дате, держу пари, это не так уж и долго.Таким образом, мы можем построить функцию, и apply:

def to_daily(val):
    # order of the day in a week
    order = np.argsort([5, 1, 4, 0, 3, 2, 6])

    b, r = val//7, val%7
    ret = np.array([b+1]*r + [b]*(7-r))

    return ret[order]

to_daily(5)
# array([1, 1, 0, 1, 1, 1, 0])

ret_df  = pd.DataFrame({'ds': pd.date_range(df.ds[0]-pd.to_timedelta('6d'),
                                 df.ds.values[-1], freq='d'),
                           'y' : np.array([to_daily(val) 
                                 for val in df.y.astype(int)]).flatten()})
ret_df

Вывод:

    ds                     y
--  -------------------  ---
 0  2018-01-01 00:00:00    1
 1  2018-01-02 00:00:00    1
 2  2018-01-03 00:00:00    0
 3  2018-01-04 00:00:00    1
 4  2018-01-05 00:00:00    1
 5  2018-01-06 00:00:00    1
 6  2018-01-07 00:00:00    0
 7  2018-01-08 00:00:00    1
 8  2018-01-09 00:00:00    1
 9  2018-01-10 00:00:00    0
10  2018-01-11 00:00:00    0
11  2018-01-12 00:00:00    1
12  2018-01-13 00:00:00    1
13  2018-01-14 00:00:00    0
14  2018-01-15 00:00:00    1
15  2018-01-16 00:00:00    1
16  2018-01-17 00:00:00    1
17  2018-01-18 00:00:00    1
18  2018-01-19 00:00:00    1
19  2018-01-20 00:00:00    2
20  2018-01-21 00:00:00    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...