Dask для анализа временных рядов

e31a435376b11acafed32fe5cd82ccf1.png

Привет, Хабр!

Сегодня расскажем, как с помощью Dask можно анализировать временные ряды. С временными рядами всегда заморочек много: большие данные, сложные расчеты. Но Dask отлично с этим справляется.

Для начала установим Dask:

!pip install dask[complete]

Не забудьте проверить, чтобы все установилось правильно. У Dask много зависимостей, и конфликты иногда случаются.

Загрузка и предобработка временных данных с Dask DF

Загрузим условно большой CSV-файл с временными рядами, например, данные по продажам за несколько лет.

import dask.dataframe as dd

df = dd.read_csv('large_sales_data.csv', parse_dates=['Date'], blocksize='64MB')

Dask read_csv не загружает файл целиком в память. Он разбивает данные на чанки и загружает их по требованию, что позволяет обрабатывать действительно большие файлы.

Правильно выбранный размер blocksize (например, 64MB или 128MB) очень важен. Подбирайте его в зависимости от объема оперативной памяти.

Фильтрация данных и работа с пропусками

Сначала выберем данные только за последние три года и заполним пропущенные значения.

df = df[df['Date'] >= '2024-01-01']
df['Sales'] = df['Sales'].fillna(0)

Если у вас много категориальных данных, подумайте о предварительном преобразовании в category.

Агрегация временных рядов

Dask поддерживает большинство агрегационных функций Pandas, и это одна из его главных фич. Рассчитаем средние продажи по дням.

daily_sales = df.groupby(df['Date'].dt.date).Sales.mean()
daily_sales = daily_sales.compute()  # выполняем вычисления

Чтобы повысить производительность агрегации, экспериментируйте с функциями split_out и split_every — они позволяют оптимизировать параллельные вычисления по разным разделам данных.

Расчет скользящего среднего с Dask

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

df['Sales_Rolling_Mean'] = df['Sales'].rolling(window=7).mean()
print(df.head().compute())

Скользящее окно лучше всего подходит для небольших временных интервалов, иначе вычисления становятся ресурсоемкими. Если нужно более крупное окно, например, на месячной или годовой основе, лучше использовать тот же downsampling с последующей агрегацией.

Управление чанками и партициями

Размер чанков — вопрос ресурсов, поэтому подбор оптимального размера важен.

df = df.repartition(npartitions=10)

Можно попробовать rechunk с параметром chunksize на сложных операциях, чтобы Dask мог оптимально разбивать данные по потокам, минимизируя нагрузку на память.

Прогнозирование с Dask и dask-ml

Dask интегрирован с dask-ml, что позволяет строить масштабируемые модели машинного обучения. Разделим данные на обучающую и тестовую выборки.

from dask_ml.model_selection import train_test_split

X = df[['Date']].values.reshape(-1, 1)
y = df['Sales'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

Для построения модели используем LinearRegression из dask-ml.

from dask_ml.linear_model import LinearRegression

model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(y_pred.compute())

На заметку: Dask поддерживает Incremental модели.

Оптимизация и кэширование результатов

Когда одна и та же операция используется несколько раз, имеет смысл закэшировать результат.

cached_result = df['Sales'].mean().persist()
print(cached_result.compute())

Кэшированные данные хранятся в оперативной памяти, поэтому используйте этот подход осторожно при работе с большими данными.

Визуализация

Dask работает с matplotlib и seaborn, имяя дефолтный интерфейс .plot().

import matplotlib.pyplot as plt

daily_sales.plot(figsize=(10, 5))
plt.title("Средние продажи по дням")
plt.xlabel("Дата")
plt.ylabel("Продажи")
plt.show()

Для работы с выборками данных удобно использовать .sample():

df_sample = df.sample(frac=0.1).compute()
df_sample.plot()

Чтобы сохранить память при визуализации больших данных, используйте datashader.

Dask — это шикарный инструмент для больших временных рядов, особенно когда Pandas не справляется из-за объема данных. Если у вас есть вопросы или чем поделиться, пишите в комментариях.

А всем, кому интересен системный и бизнес-анализ, рекомендую обратить внимание на открытые уроки по темам:

  • 14 ноября: «Как избежать провалов: эффективное выявление и работа с рисками IT продуктов». Подробнее

  • 21 ноября: «Топ-10 фатальных ошибок Бизнес‑Аналитиков и как их избежать». Подробнее

© Habrahabr.ru