Как использовать itertools Python для feature engineering временных рядов
Python itertools помогает быстро создавать признаки для временных рядов. В новой статье разбирают практические примеры эффективного feature engineering и готовы

Python itertools — это встроенный модуль для работы с итераторами, который становится незаменимым инструментом при feature engineering для временных рядов. Если вы строите признаки через циклы и копируете датасеты, itertools поможет делать это в разы быстрее и экономнее по памяти.
Что такое itertools и зачем он нужен
Модуль itertools содержит функции для создания быстрых, память-экономных итераторов. Для работы с временными рядами это критично: вместо того чтобы сохранять списки в памяти, мы генерируем признаки на лету. На датасетах в миллионы или миллиарды точек это не просто удобно — это необходимо для того, чтобы вообще работать.
Основные функции itertools для feature engineering: `combinations()` — все пары и комбинации элементов (lag-признаки, взаимодействия переменных) `permutations()` — все перестановки (тестирование порядков и влияния признаков) `islice()` — выделение подпоследовательностей и скользящих окон без копирования `zip_longest()` — объединение рядов разной длины с обработкой пропусков * `chain()` — объединение итераторов в один поток без копирования данных ## Практические примеры: от наивного подхода к масштабируемому Классическая задача: временной ряд цен, нужно построить lag-признаки с отставаниями 1, 2, 3. Наивный способ (медленный): python import pandas as pd data = pd.read_csv('prices.
csv') for lag in range(1, 4): data[f'price_lag_{lag}'] = data['price'].shift(lag) Проблема: каждый `shift()` создаёт копию датасета в памяти. На 10 млн строк это ~300 млн операций копирования плюс 3x потребления памяти.
С itertools (быстро и экономно): python from itertools import islice prices = [100, 102, 105, 103, 107, 110] for lag in range(1, 4): lagged = list(islice(prices, lag, None)) print(f'lag {lag}: {lagged}') `islice` не копирует список — он просто смещает указатель на нужную позицию. На больших датасетах это экономит часы вычислений. Второй пример — скользящие окна: python from itertools import islice, tee def sliding_window(iterable, n): iterables = tee(iterable, n) for i, it in enumerate(iterables): for _ in range(i): next(it, None) return zip(*iterables) prices = [100, 102, 105, 103, 107, 110] windows = list(sliding_window(prices, 3)) Это создаёт скользящие окна размером 3, используя ленивые итераторы вместо копирования массива.
Производительность: где экономится память и время
На датасетах в миллиарды точек: Ленивые вычисления — элементы генерируются только по требованию, не загружаются целиком Цепочки операций — `chain()` объединяет источники без промежуточных копий * Композиция — комбинируя itertools, строим сложный конвейер за минимум памяти Результат: потребление памяти может упасть в 10-100 раз. В облаке это значит дешевле счёт. На локальной машине — работает то, что раньше не влезало в RAM.
Что это значит для вас
Для data scientists: работайте с датасетами, которые раньше просто не влезали в память. Для ML инженеров: production модель требует меньше ресурсов и стабильнее. itertools — это не магия, это встроенный способ работать с данными умнее. Начните с lag-признаков и скользящих окон, потом найдёте, где ещё можно применить ленивые вычисления.