У меня есть датафрейм с DatetimeIndex
, и я хочу найти максимальное количество элементов для каждого окна.Но также я должен знать индексы элементов.Пример данных:
data = pd.DataFrame(
index=pd.date_range(start=pd.to_datetime('2010-10-10 12:00:00'),
periods=10, freq='H'),
data={'value': [3, 2, 1, 0, 5, 1, 1, 1, 1, 1]}
)
Если я использую прокатку с max, я теряю индексы:
data.rolling(3).max()
Out:
value
2010-10-10 12:00:00 NaN
2010-10-10 13:00:00 NaN
2010-10-10 14:00:00 3.0
2010-10-10 15:00:00 2.0
2010-10-10 16:00:00 5.0
2010-10-10 17:00:00 5.0
2010-10-10 18:00:00 5.0
2010-10-10 19:00:00 1.0
2010-10-10 20:00:00 1.0
2010-10-10 21:00:00 1.0
ЕслиЯ пытаюсь использовать argmax. Я получаю индексы как целочисленные индексы в каждом окне (но мне нужно найти исходные индексы даты и времени или просто целочисленные индексы для исходного кадра данных, чтобы можно было найти их с помощью iloc
):
data.rolling(3).apply(lambda x: x.argmax())
Out:
value
2010-10-10 12:00:00 NaN
2010-10-10 13:00:00 NaN
2010-10-10 14:00:00 0.0
2010-10-10 15:00:00 0.0
2010-10-10 16:00:00 2.0
2010-10-10 17:00:00 1.0
2010-10-10 18:00:00 0.0
2010-10-10 19:00:00 0.0
2010-10-10 20:00:00 0.0
2010-10-10 21:00:00 0.0
Может ли кто-нибудь помочь мне найти в пандах хорошую функцию / параметры для этого?
Конечно, я могу использовать for
, например:
pd.DataFrame([{'value_max': data[ind: ind + window][target_var].max(),
'source_index': data[ind: ind + window].index[data[ind: ind + window][target_var].values.argmax()]
} for ind in range(1, len(data) + 1 - window)],
index=data.index[1:-window+1])
И это работает.Но я хочу попытаться найти более элегантное решение с пандами.
Желаемый вывод:
source_index value_max
2010-10-10 13:00:00 2010-10-10 13:00:00 2
2010-10-10 14:00:00 2010-10-10 16:00:00 5
2010-10-10 15:00:00 2010-10-10 16:00:00 5
2010-10-10 16:00:00 2010-10-10 16:00:00 5
2010-10-10 17:00:00 2010-10-10 17:00:00 1
2010-10-10 18:00:00 2010-10-10 18:00:00 1
2010-10-10 19:00:00 2010-10-10 19:00:00 1