Ответ 1
Объекты Pandas GroupBy
являются итерабельными. Чтобы извлечь последние n элементов итерации, вообще нет необходимости создавать список из итерируемого и срезать последние n элементов. Это будет дорого стоить.
Вместо этого вы можете использовать либо itertools.islice
(как предложено @mtraceur), либо collections.deque
. Оба работают в O (n) времени.
itertools.islice
В отличие от генератора объект Pandas GroupBy
является итерабельным, который можно использовать повторно. Поэтому вы можете рассчитать количество групп через len(g)
для объекта GroupBy
g
а затем отрезать g
через islice
. Или, возможно, более идиоматично, вы можете использовать GroupBy.ngroups
. Затем используйте pd.concat
для объединения итерации в числовые кадры:
from operator import itemgetter
g = data.groupby(data.index.date, sort=False)
res = pd.concat(islice(map(itemgetter(1), g), max(0, g.ngroups-12), None))
collections.deque
Кроме того, вы можете использовать collections.deque
и указать maxlen
, а затем конкатенировать, как и раньше.
from collections import deque
grouped = data.groupby(data.index.date, sort=False)
res = pd.concat(deque(map(itemgetter(1), grouped), maxlen=12))
Как описано в документах collections
:
После того, как ограниченная длина
deque
полна, когда добавляются новые элементы, соответствующее количество элементов отбрасываются с противоположного конца.... Они также полезны для отслеживания транзакций и других пулов данных, где только самая последняя активность представляет интерес,