Как добавить столбец в dask dataframe, который отражает, является ли значение даты (из столбца) членом праздников - PullRequest
2 голосов
/ 13 мая 2019

У меня большой набор данных временных рядов (350 миллионов строк, 15 ГБ) с датой и временем (полчаса).

Поэтому я использую dask для максимально возможной обработки и распараллеливания.

Я застрял в том, что должно быть тривиальным заданием.У меня есть список дат выходных, созданный с использованием пакета праздничных дней:

NSWholidays = holidays.Australia(years= [2010,2011,2012,2013,2014], state='NSW')

И у меня есть столбец «дата» в моем фрейме данных dask.

Я хочу добавить новыйстолбец с именем 'IsWorkDay', где 1 будет отображать дни, которые не являются выходными и с понедельника по пятницу, а 0 - выходные или праздничные дни.

Я пробовал десятки комбинаций, пытаясь найти необходимый синтаксис для dask.требования, чтобы парализовать это, но единственное решение, которое мне удалось получить, - это использовать .apply, что крайне медленно для задачи (несколько часов).Короче говоря, строка ниже работает, но слишком медленно:

SGSCData['IsWorkDay'] = SGSCData.apply(lambda row: int(row.weekday<6 and not row.Date in NSWholidays), axis=1, meta=(None, 'int64'))

Как я могу сделать это быстрее?

Заранее спасибо

1 Ответ

1 голос
/ 13 мая 2019

Прежде всего, я не совсем уверен в вашей логике на выходные.В любом случае, это то, что я могу сделать без использования apply или map_partitions.Мой dask.__version__ - 1.1.1.Как вы можете видеть, используя точно такое же векторное решение, которое вы использовали бы в pandas, ваши вычисления занимают меньше 15s на Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz

import pandas as pd
import holidays
import dask.dataframe as dd
NSWholidays = holidays.Australia(years=list(range(2010,2021)), state='NSW')
# this is slightly more than 31.5M rows
dates = pd.date_range(start='2010-01-01', end='2020-01-01', freq="10S")
ddf = pd.DataFrame({"Date":dates})
ddf = dd.from_pandas(ddf, npartitions=10)

ddf["IsWorkDay"] = (~((ddf["Date"].dt.weekday>=5) | 
                      (ddf["Date"].dt.date.isin(NSWholidays)))).astype(int)

%%time
ddf = ddf.compute()

CPU times: user 1.07 s, sys: 1.48 s, total: 2.55 s
Wall time: 13.9 s
...