Для данного кадра данных pandas в следующем формате:
toy = pd.DataFrame({
'id': [1,2,3,
1,2,3,
1,2,3],
'date': ['2015-05-13', '2015-05-13', '2015-05-13',
'2016-02-12', '2016-02-12', '2016-02-12',
'2018-07-23', '2018-07-23', '2018-07-23'],
'my_metric': [395, 634, 165,
144, 305, 293,
23, 395, 242]
})
# Make sure 'date' has datetime format
toy.date = pd.to_datetime(toy.date)

Столбец my_metric
содержит некоторую (случайную) метрику, которую я хочувычислить зависящее от времени скользящее среднее, условно для столбца id
и в течение некоторого заданного промежутка времени, который я определяю сам.Я буду называть этот промежуток времени «временем просмотра»;что может быть 5 минут или 2 года.Чтобы определить, какие наблюдения следует включить в расчет обратного просмотра, мы используем столбец date
(который может быть индексом, если вы предпочитаете).
К моему разочарованию, я обнаружил, что такую процедуру нелегко выполнить с помощью встроенных панд, поскольку мне нужно выполнить вычисления условно на id
, и в то же время вычисление должно быть сделано только на наблюдениях.в течение времени просмотра (проверяется с помощью столбца date
).Следовательно, выходной фрейм данных должен состоять из одной строки для каждой комбинации id
- date
, причем столбец my_metric
теперь является средним значением всех наблюдений, связанных в течение времени просмотра (например, 2 года, включая сегодняшнюю дату).
Для ясности я включил рисунок с желаемым выходным форматом (извинения за увеличенный рисунок) при использовании двухлетнего времени просмотра:

У меня есть решение, но оно не использует определенные встроенные функции панд и, вероятно, неоптимально (комбинация понимания списка и одного цикла for).Решение, которое я ищу, не будет использовать цикл for и, следовательно, будет более масштабируемым / эффективным / быстрым.
Спасибо!