python - 如何在 dask 数据框中添加反映日期值(来自列)是否是假期成员的列
问题描述
我有一个带有日期时间(半小时分辨率)的大型时间序列数据集(3.5 亿行,15GB)。
因此,我使用 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'))
我怎样才能让它更快?
提前致谢
解决方案
首先,我不太确定你周末的逻辑。无论如何,这是我无需使用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
推荐阅读
- julia - 从 Julia 调用 Autohotkey 脚本
- javascript - 将树数据转换为具有层次结构路径的平面数据作为数组
- c - 程序在 C 中无限运行,在编译或运行时没有错误
- mysql - 连接到 Amazon RDS 实例的握手不活动超时
- apache-spark - 仅读取 spark 数据集的前 n 列
- javascript - 如果状态是某些东西,请执行 .filter & .map 否则只有 .map
- ag-grid - 如何始终在 ag-grid 中显示水平滚动条?
- javascript - 从 JavaScript Promise 返回父函数
- javascript - 无法读取未定义的属性“应用”
- c# - 从 c# unity 到 python 进程的管道