Нужно ли выполнять dask_dataframe.compute () - PullRequest
0 голосов
/ 05 апреля 2020

Я работаю над анализом временных рядов. У меня есть dask dataframe ~ 600M строк. Я создаю функции даты и времени, используя приведенную ниже функцию

def get_date_features(data):
    # generate date features
    data['year'] = data['date'].dt.year
    data['quarter'] = data['date'].dt.quarter
    data['month'] = data['date'].dt.month
    data['day'] = data['date'].dt.day
    data['weekday'] = data['date'].dt.weekday
    data['is_monthend'] = data['date'].dt.is_month_end * 1
    data['is_monthstart'] = data['date'].dt.is_month_start * 1
    data['is_quarterend'] = data['date'].dt.is_quarter_end * 1
    data['is_quarterstart'] = data['date'].dt.is_quarter_start * 1
    data['is_yearend'] = data['date'].dt.is_year_end * 1
    data['is_yearstart'] = data['date'].dt.is_year_start * 1
    data['dayofyear'] = data['date'].dt.dayofyear
    data['weekofyear'] = data['date'].dt.weekofyear
    data['daysinmonth'] = data['date'].dt.days_in_month

    return data

data = get_date_features(data)

, а затем меняю типы данных

cols = ['quarter', 'month', 'day','weekofyear', 'daysinmonth',
       'weekday', 'is_monthend', 'is_monthstart', 'is_quarterend',
       'is_quarterstart', 'is_yearend', 'is_yearstart', 'dayofyear'
       ]

for col in cols:
    data[col] = data[col].astype(np.uint8)

for col in ['year']:
    data[col] = data[col].astype(np.uint16)

Когда я проверяю dtypes, print(data.dtypes), я вижу их преобразованными,

year                       uint16
quarter                     uint8
month                       uint8
day                         uint8
weekday                     uint8
is_monthend                 uint8
is_monthstart               uint8
is_quarterend               uint8
is_quarterstart             uint8
is_yearend                  uint8
is_yearstart                uint8
dayofyear                   uint8
weekofyear                  uint8
daysinmonth                 uint8

Когда я запускаю data.visualize(), чтобы увидеть план распараллеливания для вычисления dask, код выполняется более часа, и я его прервал. И я попытался запустить data=data.compute(), который прерывается из-за недостаточной ошибки памяти.

Я использую 16 ГБ ОЗУ. ~ 2 ГБ ОЗУ занято до data.compute() шага

при выполнении data.head(), я могу видеть 5 верхних строк с извлеченными функциями даты и времени, но data.shape.compute() возвращает ошибку, 'tuple' object has no attribute 'compute'

Нужно ли здесь запускать data.compute(). Кроме того, когда я пытаюсь merge другой кадр данных после этого процесса (или) попытаться сгенерировать функции lag & groupby , выполнение прерывается с недостаточной ошибкой памяти .

Является ли dask подходящим инструментом для моей проблемы или есть какой-либо другой пакет python, который может помочь мне решить эту проблему?

Кроме того, есть ли способ решить эту проблему без увеличения конфигурации ОЗУ ? Любая помощь / направление очень ценится.

1 Ответ

0 голосов
/ 05 апреля 2020

Метод .visualize использует библиотеку graphviz для визуализации. Эта библиотека работает медленно и не работает хорошо после нескольких сотен задач.

Вызов .compute на вашем фрейме данных вернет весь результат в памяти в виде одного pandas фрейма данных. Если ваши данные слишком велики, это заполнит вашу память. Возможно, вы хотите сохранить результат на диске, используя метод, подобный to_csv или to_parquet?

...